bplist00pw_WebSubresources_WebMainResource_WebSubframeArchives"&*.37<@DHMQVZ^bfim _WebResourceResponse_WebResourceData^WebResourceURL_WebResourceMIMETypeOvbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Tue, 18 Mar 2008 09:07:20 GMTUbytes_Wed, 17 Sep 2008 20:05:43 GMTU10617WASP.NET_"0d46f78d788c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135ejs~  )7<K^kp}).1MRVjoxO)y/*ADOBE SYSTEMS INCORPORATED Copyright 2007 Adobe Systems Incorporated All Rights Reserved. NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms of the Adobe license agreement accompanying it. If you have received this file from a source other than Adobe, then your use, modification, or distribution of it requires the prior written permission of Adobe.*/ var _CF_error_messages=new Array(); var _CF_error_fields=new Object(); var _CF_FirstErrorField=null; var _CF_submit_status=new Array(); _CF_signalLoad=function(){ _CF_loaded=1; }; _CF_onError=function(_1,_2,_3,_4){ if(_CF_error_fields[_2]==null){ if(_CF_FirstErrorField==null){ _CF_FirstErrorField=_2; } _CF_error_exists=true; _CF_error_fields[_2]=_4; _CF_error_messages[_CF_error_messages.length]=_4; } }; _CF_onErrorAlert=function(_5){ var _6=""; for(var i=0;i<_5.length;i++){ _6+=_5[i]+"\n"; } alert(_6); return false; }; updateHiddenValue=function(_8,_9,_a){ if(_9==null||_9==""){ _9=0; } if(document.forms[_9]==null||document.forms[_9][_a]==null){ return; } document.forms[_9][_a].value=_8; }; _CF_hasValue=function(_b,_c,_d){ if(_c=="TEXT"||_c=="FILE"||_c=="PASSWORD"||_c=="CFTEXTAREA"||_c=="TEXTAREA"||_c=="CFTEXTINPUT"||_c=="DATEFIELD"){ if(_b.value.length==0){ return false; }else{ if(_d){ str=_b.value.replace(/^\s+/,"").replace(/\s+$/,""); if(str.length==0){ return false; } } } return true; }else{ if(_c=="SELECT"){ for(i=0;i<_b.length;i++){ if(_b.options[i].selected){ return true; } } return false; }else{ if(_c=="SINGLE_VALUE_RADIO"||_c=="SINGLE_VALUE_CHECKBOX"){ if(_b.checked){ return true; }else{ return false; } }else{ if(_c=="RADIO"||_c=="CHECKBOX"){ if(_b.length==undefined&&_b.checked){ return true; }else{ for(i=0;i<_b.length;i++){ if(_b[i].checked){ return true; } } } return false; }else{ if(_c=="CFTREE"){ if(_b["value"].length>0){ return true; }else{ return false; } }else{ if(_c=="RICHTEXT"){ var _e=FCKeditorAPI.GetInstance(_b.id); var _f=_e.GetXHTML(); if(_f.length==0){ return false; }else{ if(_d){ str=_f.replace(/^\s+/,"").replace(/\s+$/,""); if(str.length==0){ return false; } } return true; } }else{ return true; } } } } } } }; _CF_checkdate=function(_10,_11){ _10=_10.replace(/^\s+/,"").replace(/\s+$/,""); _10=_10=_10.replace(/{d \'/,"").replace(/'}/,""); if(_11){ if(_10.length==0){ return false; } }else{ if(_10.length==0){ return true; } } if(_10.length==0){ return true; } isplit=_10.indexOf("/"); splitchr="/"; if(isplit==-1){ isplit=_10.indexOf("."); splitchr="."; } if(isplit==-1){ isplit=_10.indexOf("-"); splitchr="-"; } if(isplit==-1||isplit==_10.length){ return false; } var _12=_10.substring(0,isplit); if(_12.length==4){ sYear=_10.substring(0,isplit); isplit=_10.indexOf(splitchr,isplit+1); if(isplit==-1||(isplit+1)==_10.length){ return false; } sMonth=_10.substring((sYear.length+1),isplit); sDay=_10.substring(isplit+1); }else{ sMonth=_10.substring(0,isplit); isplit=_10.indexOf(splitchr,isplit+1); if(isplit==-1||(isplit+1)==_10.length){ return false; } sDay=_10.substring((sMonth.length+1),isplit); sYear=_10.substring(isplit+1); } if((sDay.length==0)||(sMonth.length==0)||(sYear.length==0)){ return false; } if(!_CF_checkinteger(sMonth)){ return false; }else{ if(!_CF_checkrange(sMonth,1,12)){ return false; }else{ if(!_CF_checkinteger(sYear)){ return false; }else{ if(sYear.length!=1&&sYear.length!=2&&sYear.length!=4){ return false; }else{ if(!_CF_checkrange(sYear,0,9999)){ return false; }else{ if(!_CF_checkinteger(sDay)){ return false; }else{ if(!_CF_checkday(sYear,sMonth,sDay)){ return false; }else{ return true; } } } } } } } }; _CF_checkeurodate=function(_13,_14){ _13=_13.replace(/^\s+/,"").replace(/\s+$/,""); _13=_13=_13.replace(/{d \'/,"").replace(/'}/,""); if(_14){ if(_13.length==0){ return false; } }else{ if(_13.length==0){ return true; } } isplit=_13.indexOf("/"); splitchr="/"; if(isplit==-1){ isplit=_13.indexOf("."); splitchr="."; } if(isplit==-1){ isplit=_13.indexOf("-"); splitchr="-"; } if(isplit==-1||isplit==_13.length){ return false; } var _15=_13.substring(0,isplit); if(_15.length==4){ sYear=_13.substring(0,isplit); isplit=_13.indexOf(splitchr,isplit+1); if(isplit==-1||(isplit+1)==_13.length){ return false; } sMonth=_13.substring((sYear.length+1),isplit); sDay=_13.substring(isplit+1); }else{ sDay=_13.substring(0,isplit); isplit=_13.indexOf(splitchr,isplit+1); if(isplit==-1||(isplit+1)==_13.length){ return false; } sMonth=_13.substring((sDay.length+1),isplit); sYear=_13.substring(isplit+1); } if(!_CF_checkinteger(sMonth)){ return false; }else{ if(!_CF_checkrange(sMonth,1,12)){ return false; }else{ if(!_CF_checkinteger(sYear)){ return false; }else{ if(!_CF_checkrange(sYear,0,null)){ return false; }else{ if(!_CF_checkinteger(sDay)){ return false; }else{ if(!_CF_checkday(sYear,sMonth,sDay)){ return false; }else{ return true; } } } } } } }; _CF_checkday=function(_16,_17,_18){ maxDay=31; if(_17==4||_17==6||_17==9||_17==11){ maxDay=30; }else{ if(_17==2){ if(_16%4>0){ maxDay=28; }else{ if(_16%100==0&&_16%400>0){ maxDay=28; }else{ maxDay=29; } } } } return _CF_checkrange(_18,1,maxDay); }; _CF_checkinteger=function(_19,_1a){ _19=_19.replace(/^\s+/,"").replace(/\s+$/,""); _19=_19.replace(/[$£¥€,~+]?/g,""); if(_1a){ if(_19.length==0){ return false; } }else{ if(_19.length==0){ return true; } } var _1b="."; var _1c=_19.indexOf(_1b); if(_1c==-1){ return _CF_checknumber(_19); }else{ return false; } }; _CF_numberrange=function(_1d,_1e,_1f,_20){ if(_20){ if(_1d.length==0){ return false; } }else{ if(_1d.length==0){ return true; } } if(_1e!=null){ if(_1d<_1e){ return false; } } if(_1f!=null){ if(_1d>_1f){ return false; } } return true; }; _CF_checknumber=function(_21,_22){ var _23=" .+-0123456789"; var _24=" .0123456789"; var _25; var _26=false; var _27=false; var _28=false; _21=_21.replace(/^\s+/,"").replace(/\s+$/,""); _21=_21.replace(/[$£¥€,~+]?/g,""); if(_22){ if(_21.length==0){ return false; } }else{ if(_21.length==0){ return true; } } _25=_23.indexOf(_21.charAt(0)); if(_25==1){ _26=true; }else{ if(_25<1){ return false; } } for(var i=1;i<_21.length;i++){ _25=_24.indexOf(_21.charAt(i)); if(_25<0){ return false; }else{ if(_25==1){ if(_26){ return false; }else{ _26=true; } }else{ if(_25==0){ if(_26||_28){ _27=true; } }else{ if(_27){ return false; }else{ _28=true; } } } } } return true; }; _CF_checkrange=function(_2a,_2b,_2c,_2d){ _2a=_2a.replace(/^\s+/,"").replace(/\s+$/,""); if(_2d){ if(_2a.length==0){ return false; } }else{ if(_2a.length==0){ return true; } } if(!_CF_checknumber(_2a)){ return false; }else{ return (_CF_numberrange((eval(_2a)),_2b,_2c)); } return true; }; _CF_checktime=function(_2e,_2f){ _2e=_2e.replace(/^\s+/,"").replace(/\s+$/,""); _2e=_2e.replace(/\s+:\s+/,":"); _2e=_2e=_2e.replace(/{t \'/,"").replace(/'}/,""); if(_2f){ if(_2e.length==0){ return false; } }else{ if(_2e.length==0){ return true; } } var _30=_CF_checkregex(_2e,/^(([0-1]?[0-9]|[2][0-3]):([0-5]?[0-9])(:[0-5]?[0-9])?).?([AP]M|[AP]m|[ap]m|[ap]M)?$/,_2f); return _30; }; _CF_checkphone=function(_31,_32){ _31=_31.replace(/^\s+/,"").replace(/\s+$/,""); if(_32){ if(_31.length==0){ return false; } }else{ if(_31.length==0){ return true; } } if(_31.length==0){ return true; } return _CF_checkregex(_31,/^(((1))?[ ,\-,\.]?([\\(]?([1-9][0-9]{2})[\\)]?))?[ ,\-,\.]?([^0-1]){1}([0-9]){2}[ ,\-,\.]?([0-9]){4}(( )((x){0,1}([0-9]){1,5}){0,1})?$/,_32); }; _CF_checkzip=function(_33,_34){ _33=_33.replace(/^\s+/,"").replace(/\s+$/,""); if(_34){ if(_33.length==0){ return false; } }else{ if(_33.length==0){ return true; } } return _CF_checkregex(_33,/^([0-9]){5,5}$|(([0-9]){5,5}(-| ){1}([0-9]){4,4}$)/,_34); }; _CF_checkcreditcard=function(_35,_36){ _35=_35.replace(/^\s+/,"").replace(/\s+$/,""); if(_36){ if(_35.length==0){ return false; } }else{ if(_35.length==0){ return true; } } if(_35.length==0){ return true; } var _37=" -"; var _38=""; var _39; for(var i=0;i<_35.length;i++){ _39=_37.indexOf(_35.charAt(i)); if(_39<0){ _38+=_35.substring(i,(i+1)); } } if(_38.length<13||_38.length>19){ return false; } if(_38.charAt(0)=="+"){ return false; } if(!_CF_checkinteger(_38)){ return false; } var _3b=_38.length%2==1?false:true; var _3c=0; var _3d; for(var i=0;i<_38.length;i++){ _3d=eval(_38.charAt(i)); if(_3b){ _3d*=2; _3c+=(_3d%10); if((_3d/10)>=1){ _3c++; } _3b=false; }else{ _3c+=_3d; _3b=true; } } return (_3c%10)==0?true:false; }; _CF_checkssn=function(_3e,_3f){ _3e=_3e.replace(/^\s+/,"").replace(/\s+$/,""); if(_3f){ if(_3e.length==0){ return false; } }else{ if(_3e.length==0){ return true; } } return _CF_checkregex(_3e,/^[0-9]{3}(-| )[0-9]{2}(-| )[0-9]{4}$/,_3f); }; _CF_checkEmail=function(_40,_41){ _40=_40.replace(/^\s+/,"").replace(/\s+$/,""); if(_41){ if(_40.length==0){ return false; } }else{ if(_40.length==0){ return true; } } return _CF_checkregex(_40,/^[a-zA-Z_0-9-'\+~]+(\.[a-zA-Z_0-9-'\+~]+)*@([a-zA-Z_0-9-]+\.)+[a-zA-Z]{2,7}$/,_41); }; _CF_checkURL=function(_42,_43){ _42=_42.replace(/^\s+/,"").replace(/\s+$/,""); if(_43){ if(_42.length==0){ return false; } }else{ if(_42.length==0){ return true; } } return _CF_checkregex(_42.toLowerCase(),/^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?[a-zA-Z0-9-\.]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9-\._\?\,\'\/\+&%\$#\=~])*)|((mailto)\:[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,7})|((news)\:[a-zA-Z0-9\.]*)$/,_43); }; _CF_checkUUID=function(_44,_45){ _44=_44.replace(/^\s+/,"").replace(/\s+$/,""); if(_45){ if(_44.length==0){ return false; } }else{ if(_44.length==0){ return true; } } return _CF_checkregex(_44,/[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{16,16}/,_45); }; _CF_checkGUID=function(_46,_47){ _46=_46.replace(/^\s+/,"").replace(/\s+$/,""); if(_47){ if(_46.length==0){ return false; } }else{ if(_46.length==0){ return true; } } return _CF_checkregex(_46,/[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{12,12}/,_47); }; _CF_checkBoolean=function(_48,_49){ _48=_48.replace(/^\s+/,"").replace(/\s+$/,""); if(_49){ if(_48.length==0){ return false; } }else{ if(_48.length==0){ return true; } } if(_48.toUpperCase()=="TRUE"||_48.toUpperCase()=="YES"||(_CF_checknumber(_48)&&_48!="0")){ return true; }else{ if(_48.toUpperCase()=="FALSE"||_48.toUpperCase()=="NO"||_48=="0"){ return true; }else{ return false; } } }; _CF_setFormParam=function(_4a,_4b,_4c){ var _4d="document['"+_4a+"']['"+_4b+"']"; var obj=eval(_4d); if(obj==undefined){ return false; }else{ obj.value=_4c; return true; } }; _CF_checkregex=function(_4f,_50,_51){ if(_51){ if(_4f.length==0){ return false; } }else{ if(_4f.length==0){ return true; } } return _50.test(_4f); }; _-http://www.mshale.com/CFIDE/scripts/cfform.js_application/x-javascript  Osbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Tue, 18 Mar 2008 09:07:22 GMTUbytes_Wed, 17 Sep 2008 20:05:45 GMTT3897WASP.NET_"01a179d788c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135dir}   (6;J]jo|&+.JOSgouO9/*ADOBE SYSTEMS INCORPORATED Copyright 2007 Adobe Systems Incorporated All Rights Reserved. NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms of the Adobe license agreement accompanying it. If you have received this file from a source other than Adobe, then your use, modification, or distribution of it requires the prior written permission of Adobe.*/ var KT_focusedEl=null; KT_validateSingle=function(_52,_53){ var _54=_52.charCodeAt(0); switch(_53){ case "9": if(_54<58&&_54>47){ return true; } break; case "A": if((_54<91&&_54>64)||(_54<123&&_54>96)){ return true; } break; case "X": if((_54<91&&_54>64)||(_54<123&&_54>96)||(_54<58&&_54>47)){ return true; } break; case "?": return true; break; default: return true; break; } }; KT_maskDefaultValue=function(_55){ switch(_55){ case "9": return "0"; break; case "A": return "a"; break; case "X": return "0"; break; case "?": return "0"; break; default: return "0"; break; } }; KT_isSpecialChar=function(_56){ if(_56=="9"||_56=="A"||_56=="X"||_56=="?"){ return true; }else{ return false; } }; mask_onValueChanged=function(){ if((typeof window.getSelection=="undefined"&&typeof document.selection=="undefined")){ return; } if(KT_focusedEl==null||KT_focusedEl.mask==null||KT_focusedEl.mask==""){ return; } var _57=KT_focusedEl.mask; var val=KT_focusedEl.value; var i=0; var _5a=false; if(val==KT_focusedEl.oldText){ return; } if(val.length>_57.length){ val=val.substr(0,_57.length); _5a=true; } for(;i<_57.length;i++){ if(val.charCodeAt(i).toString()!="NaN"){ if(KT_isSpecialChar(_57.charAt(i))){ if(KT_validateSingle(val.charAt(i),_57.charAt(i))){ continue; }else{ val=KT_focusedEl.oldText; i=_57.length; break; } }else{ if(val.charAt(i)!=_57.charAt(i)){ if(i==val.length-1){ var _5b=val.substr(val.length-1,val.length); val=val.substr(0,val.length-1)+_57.charAt(i)+_5b; _5a=true; continue; }else{ val=KT_focusedEl.oldText; i=_57.length; } break; } } }else{ if(val.length_57.length){ val=val.substr(0,_57.length); _5a=true; } if(KT_focusedEl.value!=val){ KT_focusedEl.value=val; } KT_focusedEl.oldText=val; if(_5a){ } }; mask_parseFirstTime=function(_5c,_5d){ var _5e=""; var _5f=""; cond=1; imask=0; ival=0; cnt=0; while(cond==1){ cond=1; if(!KT_isSpecialChar(_5d.charAt(imask))){ if(_5c.charCodeAt(ival).toString()!="NaN"){ if(_5d.charAt(imask)==_5c.charAt(ival)){ imask++; ival++; }else{ _5c=_5c.substr(0,ival)+_5d.charAt(imask)+_5c.substr(ival,_5c.length); imask=0; ival=0; cond=1; } }else{ _5c+=KT_maskDefaultValue(_5d.charAt(imask)); } }else{ imask++; ival++; } if(imask>=_5d.length||ival>=_5c.length){ cond=0; } } for(i=0;i<_5d.length;i++){ if(KT_isSpecialChar(_5d.charAt(i))){ _5e+=_5d.charAt(i); if(_5c.charCodeAt(i).toString()!="NaN"){ _5f+=_5c.charAt(i); }else{ _5f+=KT_maskDefaultValue(_5d.charAt(i)); } } } oldvalue=_5c; _5c=_5f; var _60=""; for(i=0;i<_5e.length;i++){ if(!KT_validateSingle(_5c.charAt(i),_5e.charAt(i))){ _60+=KT_maskDefaultValue(_5e.charAt(i)); }else{ _60+=_5c.charAt(i); } } var _61=""; var j=0; for(i=0;i<_5d.length;i++){ if(KT_isSpecialChar(_5d.charAt(i))){ _61+=_60.charAt(j++); }else{ _61+=_5d.charAt(i); } } return _61; }; mask_onSetFocus=function(obj,_64){ if((typeof window.getSelection=="undefined"&&typeof document.selection=="undefined")){ return; } if(typeof obj.mask=="undefined"){ ret=""; if(obj.value!=""){ ret=mask_parseFirstTime(obj.value,_64); } obj.value=ret; obj.mask=_64; } KT_focusedEl=obj; if(typeof KT_focusedEl.oldText=="undefined"){ KT_focusedEl.oldText=obj.value; mask_onValueChanged(); } }; mask_onKillFocus=function(){ if((typeof window.getSelection=="undefined"&&typeof document.selection=="undefined")){ return; } mask_onValueChanged(); KT_focusedEl=null; }; _,http://www.mshale.com/CFIDE/scripts/masks.js  Ovbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:25:05 GMTUbytes_Wed, 17 Sep 2008 20:05:45 GMTU73775WASP.NET_"50f1c0ecf023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357dir}   (6;J]jo|).1MRVjoxO //* Prototype JavaScript framework, version 1.5.0 * (c) 2005-2007 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://prototype.conio.net/ * /*--------------------------------------------------------------------------*/ var Prototype = { Version: '1.5.0', BrowserFeatures: { XPath: !!document.evaluate }, ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', emptyFunction: function() {}, K: function(x) { return x } } var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var Abstract = new Object(); Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } Object.extend(Object, { inspect: function(object) { try { if (object === undefined) return 'undefined'; if (object === null) return 'null'; return object.inspect ? object.inspect() : object.toString(); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } }, keys: function(object) { var keys = []; for (var property in object) keys.push(property); return keys; }, values: function(object) { var values = []; for (var property in object) values.push(object[property]); return values; }, clone: function(object) { return Object.extend({}, object); } }); Function.prototype.bind = function() { var __method = this, args = $A(arguments), object = args.shift(); return function() { return __method.apply(object, args.concat($A(arguments))); } } Function.prototype.bindAsEventListener = function(object) { var __method = this, args = $A(arguments), object = args.shift(); return function(event) { return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); } } Object.extend(Number.prototype, { toColorPart: function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; }, succ: function() { return this + 1; }, times: function(iterator) { $R(0, this, true).each(iterator); return this; } }); var Try = { these: function() { var returnValue; for (var i = 0, length = arguments.length; i < length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) {} } return returnValue; } } /*--------------------------------------------------------------------------*/ var PeriodicalExecuter = Class.create(); PeriodicalExecuter.prototype = { initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, stop: function() { if (!this.timer) return; clearInterval(this.timer); this.timer = null; }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.callback(this); } finally { this.currentlyExecuting = false; } } } } String.interpret = function(value){ return value == null ? '' : String(value); } Object.extend(String.prototype, { gsub: function(pattern, replacement) { var result = '', source = this, match; replacement = arguments.callee.prepareReplacement(replacement); while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += String.interpret(replacement(match)); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; }, sub: function(pattern, replacement, count) { replacement = this.gsub.prepareReplacement(replacement); count = count === undefined ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); }, scan: function(pattern, iterator) { this.gsub(pattern, iterator); return this; }, truncate: function(length, truncation) { length = length || 30; truncation = truncation === undefined ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : this; }, strip: function() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); }, stripTags: function() { return this.replace(/<\/?[^>]+>/gi, ''); }, stripScripts: function() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); }, extractScripts: function() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); }, evalScripts: function() { return this.extractScripts().map(function(script) { return eval(script) }); }, escapeHTML: function() { var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML; }, unescapeHTML: function() { var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0] ? (div.childNodes.length > 1 ? $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) : div.childNodes[0].nodeValue) : ''; }, toQueryParams: function(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return {}; return match[1].split(separator || '&').inject({}, function(hash, pair) { if ((pair = pair.split('='))[0]) { var name = decodeURIComponent(pair[0]); var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; if (hash[name] !== undefined) { if (hash[name].constructor != Array) hash[name] = [hash[name]]; if (value) hash[name].push(value); } else hash[name] = value; } return hash; }); }, toArray: function() { return this.split(''); }, succ: function() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); }, camelize: function() { var parts = this.split('-'), len = parts.length; if (len == 1) return parts[0]; var camelized = this.charAt(0) == '-' ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0]; for (var i = 1; i < len; i++) camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); return camelized; }, capitalize: function(){ return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); }, underscore: function() { return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); }, dasherize: function() { return this.gsub(/_/,'-'); }, inspect: function(useDoubleQuotes) { var escapedString = this.replace(/\\/g, '\\\\'); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; else return "'" + escapedString.replace(/'/g, '\\\'') + "'"; } }); String.prototype.gsub.prepareReplacement = function(replacement) { if (typeof replacement == 'function') return replacement; var template = new Template(replacement); return function(match) { return template.evaluate(match) }; } String.prototype.parseQuery = String.prototype.toQueryParams; var Template = Class.create(); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; Template.prototype = { initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { return this.template.gsub(this.pattern, function(match) { var before = match[1]; if (before == '\\') return match[2]; return before + String.interpret(object[match[3]]); }); } } var $break = new Object(); var $continue = new Object(); var Enumerable = { each: function(iterator) { var index = 0; try { this._each(function(value) { try { iterator(value, index++); } catch (e) { if (e != $continue) throw e; } }); } catch (e) { if (e != $break) throw e; } return this; }, eachSlice: function(number, iterator) { var index = -number, slices = [], array = this.toArray(); while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.map(iterator); }, all: function(iterator) { var result = true; this.each(function(value, index) { result = result && !!(iterator || Prototype.K)(value, index); if (!result) throw $break; }); return result; }, any: function(iterator) { var result = false; this.each(function(value, index) { if (result = !!(iterator || Prototype.K)(value, index)) throw $break; }); return result; }, collect: function(iterator) { var results = []; this.each(function(value, index) { results.push((iterator || Prototype.K)(value, index)); }); return results; }, detect: function(iterator) { var result; this.each(function(value, index) { if (iterator(value, index)) { result = value; throw $break; } }); return result; }, findAll: function(iterator) { var results = []; this.each(function(value, index) { if (iterator(value, index)) results.push(value); }); return results; }, grep: function(pattern, iterator) { var results = []; this.each(function(value, index) { var stringValue = value.toString(); if (stringValue.match(pattern)) results.push((iterator || Prototype.K)(value, index)); }) return results; }, include: function(object) { var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; }, inGroupsOf: function(number, fillWith) { fillWith = fillWith === undefined ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); }, inject: function(memo, iterator) { this.each(function(value, index) { memo = iterator(memo, value, index); }); return memo; }, invoke: function(method) { var args = $A(arguments).slice(1); return this.map(function(value) { return value[method].apply(value, args); }); }, max: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value >= result) result = value; }); return result; }, min: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value < result) result = value; }); return result; }, partition: function(iterator) { var trues = [], falses = []; this.each(function(value, index) { ((iterator || Prototype.K)(value, index) ? trues : falses).push(value); }); return [trues, falses]; }, pluck: function(property) { var results = []; this.each(function(value, index) { results.push(value[property]); }); return results; }, reject: function(iterator) { var results = []; this.each(function(value, index) { if (!iterator(value, index)) results.push(value); }); return results; }, sortBy: function(iterator) { return this.map(function(value, index) { return {value: value, criteria: iterator(value, index)}; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); }, toArray: function() { return this.map(); }, zip: function() { var iterator = Prototype.K, args = $A(arguments); if (typeof args.last() == 'function') iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); }, size: function() { return this.toArray().length; }, inspect: function() { return '#'; } } Object.extend(Enumerable, { map: Enumerable.collect, find: Enumerable.detect, select: Enumerable.findAll, member: Enumerable.include, entries: Enumerable.toArray }); var $A = Array.from = function(iterable) { if (!iterable) return []; if (iterable.toArray) { return iterable.toArray(); } else { var results = []; for (var i = 0, length = iterable.length; i < length; i++) results.push(iterable[i]); return results; } } Object.extend(Array.prototype, Enumerable); if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; Object.extend(Array.prototype, { _each: function(iterator) { for (var i = 0, length = this.length; i < length; i++) iterator(this[i]); }, clear: function() { this.length = 0; return this; }, first: function() { return this[0]; }, last: function() { return this[this.length - 1]; }, compact: function() { return this.select(function(value) { return value != null; }); }, flatten: function() { return this.inject([], function(array, value) { return array.concat(value && value.constructor == Array ? value.flatten() : [value]); }); }, without: function() { var values = $A(arguments); return this.select(function(value) { return !values.include(value); }); }, indexOf: function(object) { for (var i = 0, length = this.length; i < length; i++) if (this[i] == object) return i; return -1; }, reverse: function(inline) { return (inline !== false ? this : this.toArray())._reverse(); }, reduce: function() { return this.length > 1 ? this : this[0]; }, uniq: function() { return this.inject([], function(array, value) { return array.include(value) ? array : array.concat([value]); }); }, clone: function() { return [].concat(this); }, size: function() { return this.length; }, inspect: function() { return '[' + this.map(Object.inspect).join(', ') + ']'; } }); Array.prototype.toArray = Array.prototype.clone; function $w(string){ string = string.strip(); return string ? string.split(/\s+/) : []; } if(window.opera){ Array.prototype.concat = function(){ var array = []; for(var i = 0, length = this.length; i < length; i++) array.push(this[i]); for(var i = 0, length = arguments.length; i < length; i++) { if(arguments[i].constructor == Array) { for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) array.push(arguments[i][j]); } else { array.push(arguments[i]); } } return array; } } var Hash = function(obj) { Object.extend(this, obj || {}); }; Object.extend(Hash, { toQueryString: function(obj) { var parts = []; this.prototype._each.call(obj, function(pair) { if (!pair.key) return; if (pair.value && pair.value.constructor == Array) { var values = pair.value.compact(); if (values.length < 2) pair.value = values.reduce(); else { key = encodeURIComponent(pair.key); values.each(function(value) { value = value != undefined ? encodeURIComponent(value) : ''; parts.push(key + '=' + encodeURIComponent(value)); }); return; } } if (pair.value == undefined) pair[1] = ''; parts.push(pair.map(encodeURIComponent).join('=')); }); return parts.join('&'); } }); Object.extend(Hash.prototype, Enumerable); Object.extend(Hash.prototype, { _each: function(iterator) { for (var key in this) { var value = this[key]; if (value && value == Hash.prototype[key]) continue; var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }, keys: function() { return this.pluck('key'); }, values: function() { return this.pluck('value'); }, merge: function(hash) { return $H(hash).inject(this, function(mergedHash, pair) { mergedHash[pair.key] = pair.value; return mergedHash; }); }, remove: function() { var result; for(var i = 0, length = arguments.length; i < length; i++) { var value = this[arguments[i]]; if (value !== undefined){ if (result === undefined) result = value; else { if (result.constructor != Array) result = [result]; result.push(value) } } delete this[arguments[i]]; } return result; }, toQueryString: function() { return Hash.toQueryString(this); }, inspect: function() { return '#'; } }); function $H(object) { if (object && object.constructor == Hash) return object; return new Hash(object); }; ObjectRange = Class.create(); Object.extend(ObjectRange.prototype, Enumerable); Object.extend(ObjectRange.prototype, { initialize: function(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; }, _each: function(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } }, include: function(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } }); var $R = function(start, end, exclusive) { return new ObjectRange(start, end, exclusive); } var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; }, activeRequestCount: 0 } Ajax.Responders = { responders: [], _each: function(iterator) { this.responders._each(iterator); }, register: function(responder) { if (!this.include(responder)) this.responders.push(responder); }, unregister: function(responder) { this.responders = this.responders.without(responder); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (typeof responder[callback] == 'function') { try { responder[callback].apply(responder, [request, transport, json]); } catch (e) {} } }); } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++; }, onComplete: function() { Ajax.activeRequestCount--; } }); Ajax.Base = function() {}; Ajax.Base.prototype = { setOptions: function(options) { this.options = { method: 'post', asynchronous: true, contentType: 'application/x-www-form-urlencoded', encoding: 'UTF-8', parameters: '' } Object.extend(this.options, options || {}); this.options.method = this.options.method.toLowerCase(); if (typeof this.options.parameters == 'string') this.options.parameters = this.options.parameters.toQueryParams(); } } Ajax.Request = Class.create(); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Request.prototype = Object.extend(new Ajax.Base(), { _complete: false, initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); this.request(url); }, request: function(url) { this.url = url; this.method = this.options.method; var params = this.options.parameters; if (!['get', 'post'].include(this.method)) { // simulate other verbs over post params['_method'] = this.method; this.method = 'post'; } params = Hash.toQueryString(params); if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_=' // when GET, append parameters to URL if (this.method == 'get' && params) this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params; try { Ajax.Responders.dispatch('onCreate', this, this.transport); this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); if (this.options.asynchronous) setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); var body = this.method == 'post' ? (this.options.postBody || params) : null; this.transport.send(body); /* Force Firefox to handle ready state 4 for synchronous requests */ if (!this.options.asynchronous && this.transport.overrideMimeType) this.onStateChange(); } catch (e) { this.dispatchException(e); } }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState > 1 && !((readyState == 4) && this._complete)) this.respondToReadyState(this.transport.readyState); }, setRequestHeaders: function() { var headers = { 'X-Requested-With': 'XMLHttpRequest', 'X-Prototype-Version': Prototype.Version, 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; if (this.method == 'post') { headers['Content-type'] = this.options.contentType + (this.options.encoding ? '; charset=' + this.options.encoding : ''); /* Force "Connection: close" for older Mozilla browsers to work * around a bug where XMLHttpRequest sends an incorrect * Content-length header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) headers['Connection'] = 'close'; } // user-defined headers if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; if (typeof extras.push == 'function') for (var i = 0, length = extras.length; i < length; i += 2) headers[extras[i]] = extras[i+1]; else $H(extras).each(function(pair) { headers[pair.key] = pair.value }); } for (var name in headers) this.transport.setRequestHeader(name, headers[name]); }, success: function() { return !this.transport.status || (this.transport.status >= 200 && this.transport.status < 300); }, respondToReadyState: function(readyState) { var state = Ajax.Request.Events[readyState]; var transport = this.transport, json = this.evalJSON(); if (state == 'Complete') { try { this._complete = true; (this.options['on' + this.transport.status] || this.options['on' + (this.success() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json); } catch (e) { this.dispatchException(e); } if ((this.getHeader('Content-type') || 'text/javascript').strip(). match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) this.evalResponse(); } try { (this.options['on' + state] || Prototype.emptyFunction)(transport, json); Ajax.Responders.dispatch('on' + state, this, transport, json); } catch (e) { this.dispatchException(e); } if (state == 'Complete') { // avoid memory leak in MSIE: clean up this.transport.onreadystatechange = Prototype.emptyFunction; } }, getHeader: function(name) { try { return this.transport.getResponseHeader(name); } catch (e) { return null } }, evalJSON: function() { try { var json = this.getHeader('X-JSON'); return json ? eval('(' + json + ')') : null; } catch (e) { return null } }, evalResponse: function() { try { return eval(this.transport.responseText); } catch (e) { this.dispatchException(e); } }, dispatchException: function(exception) { (this.options.onException || Prototype.emptyFunction)(this, exception); Ajax.Responders.dispatch('onException', this, exception); } }); Ajax.Updater = Class.create(); Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { initialize: function(container, url, options) { this.container = { success: (container.success || container), failure: (container.failure || (container.success ? null : container)) } this.transport = Ajax.getTransport(); this.setOptions(options); var onComplete = this.options.onComplete || Prototype.emptyFunction; this.options.onComplete = (function(transport, param) { this.updateContent(); onComplete(transport, param); }).bind(this); this.request(url); }, updateContent: function() { var receiver = this.container[this.success() ? 'success' : 'failure']; var response = this.transport.responseText; if (!this.options.evalScripts) response = response.stripScripts(); if (receiver = $(receiver)) { if (this.options.insertion) new this.options.insertion(receiver, response); else receiver.update(response); } if (this.success()) { if (this.onComplete) setTimeout(this.onComplete.bind(this), 10); } } }); Ajax.PeriodicalUpdater = Class.create(); Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { initialize: function(container, url, options) { this.setOptions(options); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = {}; this.container = container; this.url = url; this.start(); }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent(); }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments); }, updateComplete: function(request) { if (this.options.decay) { this.decay = (request.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = request.responseText; } this.timer = setTimeout(this.onTimerEvent.bind(this), this.decay * this.frequency * 1000); }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) elements.push($(arguments[i])); return elements; } if (typeof element == 'string') element = document.getElementById(element); return Element.extend(element); } if (Prototype.BrowserFeatures.XPath) { document._getElementsByXPath = function(expression, parentElement) { var results = []; var query = document.evaluate(expression, $(parentElement) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0, length = query.snapshotLength; i < length; i++) results.push(query.snapshotItem(i)); return results; }; } document.getElementsByClassName = function(className, parentElement) { if (Prototype.BrowserFeatures.XPath) { var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; return document._getElementsByXPath(q, parentElement); } else { var children = ($(parentElement) || document.body).getElementsByTagName('*'); var elements = [], child; for (var i = 0, length = children.length; i < length; i++) { child = children[i]; if (Element.hasClassName(child, className)) elements.push(Element.extend(child)); } return elements; } }; /*--------------------------------------------------------------------------*/ if (!window.Element) var Element = new Object(); Element.extend = function(element) { if (!element || _nativeExtensions || element.nodeType == 3) return element; if (!element._extended && element.tagName && element != window) { var methods = Object.clone(Element.Methods), cache = Element.extend.cache; if (element.tagName == 'FORM') Object.extend(methods, Form.Methods); if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) Object.extend(methods, Form.Element.Methods); Object.extend(methods, Element.Methods.Simulated); for (var property in methods) { var value = methods[property]; if (typeof value == 'function' && !(property in element)) element[property] = cache.findOrStore(value); } } element._extended = true; return element; }; Element.extend.cache = { findOrStore: function(value) { return this[value] = this[value] || function() { return value.apply(null, [this].concat($A(arguments))); } } }; Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function(element) { element = $(element); Element[Element.visible(element) ? 'hide' : 'show'](element); return element; }, hide: function(element) { $(element).style.display = 'none'; return element; }, show: function(element) { $(element).style.display = ''; return element; }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); return element; }, update: function(element, html) { html = typeof html == 'undefined' ? '' : html.toString(); $(element).innerHTML = html.stripScripts(); setTimeout(function() {html.evalScripts()}, 10); return element; }, replace: function(element, html) { element = $(element); html = typeof html == 'undefined' ? '' : html.toString(); if (element.outerHTML) { element.outerHTML = html.stripScripts(); } else { var range = element.ownerDocument.createRange(); range.selectNodeContents(element); element.parentNode.replaceChild( range.createContextualFragment(html.stripScripts()), element); } setTimeout(function() {html.evalScripts()}, 10); return element; }, inspect: function(element) { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { var property = pair.first(), attribute = pair.last(); var value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, recursivelyCollect: function(element, property) { element = $(element); var elements = []; while (element = element[property]) if (element.nodeType == 1) elements.push(Element.extend(element)); return elements; }, ancestors: function(element) { return $(element).recursivelyCollect('parentNode'); }, descendants: function(element) { return $A($(element).getElementsByTagName('*')); }, immediateDescendants: function(element) { if (!(element = $(element).firstChild)) return []; while (element && element.nodeType != 1) element = element.nextSibling; if (element) return [element].concat($(element).nextSiblings()); return []; }, previousSiblings: function(element) { return $(element).recursivelyCollect('previousSibling'); }, nextSiblings: function(element) { return $(element).recursivelyCollect('nextSibling'); }, siblings: function(element) { element = $(element); return element.previousSiblings().reverse().concat(element.nextSiblings()); }, match: function(element, selector) { if (typeof selector == 'string') selector = new Selector(selector); return selector.match($(element)); }, up: function(element, expression, index) { return Selector.findElement($(element).ancestors(), expression, index); }, down: function(element, expression, index) { return Selector.findElement($(element).descendants(), expression, index); }, previous: function(element, expression, index) { return Selector.findElement($(element).previousSiblings(), expression, index); }, next: function(element, expression, index) { return Selector.findElement($(element).nextSiblings(), expression, index); }, getElementsBySelector: function() { var args = $A(arguments), element = $(args.shift()); return Selector.findChildElements(element, args); }, getElementsByClassName: function(element, className) { return document.getElementsByClassName(className, element); }, readAttribute: function(element, name) { element = $(element); if (document.all && !window.opera) { var t = Element._attributeTranslations; if (t.values[name]) return t.values[name](element, name); if (t.names[name]) name = t.names[name]; var attribute = element.attributes[name]; if(attribute) return attribute.nodeValue; } return element.getAttribute(name); }, getHeight: function(element) { return $(element).getDimensions().height; }, getWidth: function(element) { return $(element).getDimensions().width; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; var elementClassName = element.className; if (elementClassName.length == 0) return false; if (elementClassName == className || elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) return true; return false; }, addClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).add(className); return element; }, removeClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).remove(className); return element; }, toggleClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className); return element; }, observe: function() { Event.observe.apply(Event, arguments); return $A(arguments).first(); }, stopObserving: function() { Event.stopObserving.apply(Event, arguments); return $A(arguments).first(); }, // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; while (node) { var nextNode = node.nextSibling; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) element.removeChild(node); node = nextNode; } return element; }, empty: function(element) { return $(element).innerHTML.match(/^\s*$/); }, descendantOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var pos = Position.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, getStyle: function(element, style) { element = $(element); if (['float','cssFloat'].include(style)) style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat'); style = style.camelize(); var value = element.style[style]; if (!value) { if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css[style] : null; } else if (element.currentStyle) { value = element.currentStyle[style]; } } if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none')) value = element['offset'+style.capitalize()] + 'px'; if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) if (Element.getStyle(element, 'position') == 'static') value = 'auto'; if(style == 'opacity') { if(value) return parseFloat(value); if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) if(value[1]) return parseFloat(value[1]) / 100; return 1.0; } return value == 'auto' ? null : value; }, setStyle: function(element, style) { element = $(element); for (var name in style) { var value = style[name]; if(name == 'opacity') { if (value == 1) { value = (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0; if(/MSIE/.test(navigator.userAgent) && !window.opera) element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); } else if(value === '') { if(/MSIE/.test(navigator.userAgent) && !window.opera) element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); } else { if(value < 0.00001) value = 0; if(/MSIE/.test(navigator.userAgent) && !window.opera) element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')'; } } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; element.style[name.camelize()] = value; } return element; }, getDimensions: function(element) { element = $(element); var display = $(element).getStyle('display'); if (display != 'none' && display != null) // Safari bug return {width: element.offsetWidth, height: element.offsetHeight}; // All *Width and *Height properties give 0 on elements with display none, // so enable the element temporarily var els = element.style; var originalVisibility = els.visibility; var originalPosition = els.position; var originalDisplay = els.display; els.visibility = 'hidden'; els.position = 'absolute'; els.display = 'block'; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = originalDisplay; els.position = originalPosition; els.visibility = originalVisibility; return {width: originalWidth, height: originalHeight}; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; // Opera returns the offset relative to the positioning context, when an // element is position relative but top and left have not been defined if (window.opera) { element.style.top = 0; element.style.left = 0; } } return element; }, undoPositioned: function(element) { element = $(element); if (element._madePositioned) { element._madePositioned = undefined; element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; } return element; }, makeClipping: function(element) { element = $(element); if (element._overflow) return element; element._overflow = element.style.overflow || 'auto'; if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') element.style.overflow = 'hidden'; return element; }, undoClipping: function(element) { element = $(element); if (!element._overflow) return element; element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; element._overflow = null; return element; } }; Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf}); Element._attributeTranslations = {}; Element._attributeTranslations.names = { colspan: "colSpan", rowspan: "rowSpan", valign: "vAlign", datetime: "dateTime", accesskey: "accessKey", tabindex: "tabIndex", enctype: "encType", maxlength: "maxLength", readonly: "readOnly", longdesc: "longDesc" }; Element._attributeTranslations.values = { _getAttr: function(element, attribute) { return element.getAttribute(attribute, 2); }, _flag: function(element, attribute) { return $(element).hasAttribute(attribute) ? attribute : null; }, style: function(element) { return element.style.cssText.toLowerCase(); }, title: function(element) { var node = element.getAttributeNode('title'); return node.specified ? node.nodeValue : null; } }; Object.extend(Element._attributeTranslations.values, { href: Element._attributeTranslations.values._getAttr, src: Element._attributeTranslations.values._getAttr, disabled: Element._attributeTranslations.values._flag, checked: Element._attributeTranslations.values._flag, readonly: Element._attributeTranslations.values._flag, multiple: Element._attributeTranslations.values._flag }); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { var t = Element._attributeTranslations; attribute = t.names[attribute] || attribute; return $(element).getAttributeNode(attribute).specified; } }; // IE is missing .innerHTML support for TABLE-related elements if (document.all && !window.opera){ Element.Methods.update = function(element, html) { element = $(element); html = typeof html == 'undefined' ? '' : html.toString(); var tagName = element.tagName.toUpperCase(); if (['THEAD','TBODY','TR','TD'].include(tagName)) { var div = document.createElement('div'); switch (tagName) { case 'THEAD': case 'TBODY': div.innerHTML = '' + html.stripScripts() + '
'; depth = 2; break; case 'TR': div.innerHTML = '' + html.stripScripts() + '
'; depth = 3; break; case 'TD': div.innerHTML = '
' + html.stripScripts() + '
'; depth = 4; } $A(element.childNodes).each(function(node){ element.removeChild(node) }); depth.times(function(){ div = div.firstChild }); $A(div.childNodes).each( function(node){ element.appendChild(node) }); } else { element.innerHTML = html.stripScripts(); } setTimeout(function() {html.evalScripts()}, 10); return element; } }; Object.extend(Element, Element.Methods); var _nativeExtensions = false; if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { var className = 'HTML' + tag + 'Element'; if(window[className]) return; var klass = window[className] = {}; klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; }); Element.addMethods = function(methods) { Object.extend(Element.Methods, methods || {}); function copy(methods, destination, onlyIfAbsent) { onlyIfAbsent = onlyIfAbsent || false; var cache = Element.extend.cache; for (var property in methods) { var value = methods[property]; if (!onlyIfAbsent || !(property in destination)) destination[property] = cache.findOrStore(value); } } if (typeof HTMLElement != 'undefined') { copy(Element.Methods, HTMLElement.prototype); copy(Element.Methods.Simulated, HTMLElement.prototype, true); copy(Form.Methods, HTMLFormElement.prototype); [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { copy(Form.Element.Methods, klass.prototype); }); _nativeExtensions = true; } } var Toggle = new Object(); Toggle.display = Element.toggle; /*--------------------------------------------------------------------------*/ Abstract.Insertion = function(adjacency) { this.adjacency = adjacency; } Abstract.Insertion.prototype = { initialize: function(element, content) { this.element = $(element); this.content = content.stripScripts(); if (this.adjacency && this.element.insertAdjacentHTML) { try { this.element.insertAdjacentHTML(this.adjacency, this.content); } catch (e) { var tagName = this.element.tagName.toUpperCase(); if (['TBODY', 'TR'].include(tagName)) { this.insertContent(this.contentFromAnonymousTable()); } else { throw e; } } } else { this.range = this.element.ownerDocument.createRange(); if (this.initializeRange) this.initializeRange(); this.insertContent([this.range.createContextualFragment(this.content)]); } setTimeout(function() {content.evalScripts()}, 10); }, contentFromAnonymousTable: function() { var div = document.createElement('div'); div.innerHTML = '' + this.content + '
'; return $A(div.childNodes[0].childNodes[0].childNodes); } } var Insertion = new Object(); Insertion.Before = Class.create(); Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { initializeRange: function() { this.range.setStartBefore(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element); }).bind(this)); } }); Insertion.Top = Class.create(); Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, insertContent: function(fragments) { fragments.reverse(false).each((function(fragment) { this.element.insertBefore(fragment, this.element.firstChild); }).bind(this)); } }); Insertion.Bottom = Class.create(); Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.appendChild(fragment); }).bind(this)); } }); Insertion.After = Class.create(); Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { initializeRange: function() { this.range.setStartAfter(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element.nextSibling); }).bind(this)); } }); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set($A(this).concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set($A(this).without(classNameToRemove).join(' ')); }, toString: function() { return $A(this).join(' '); } }; Object.extend(Element.ClassNames.prototype, Enumerable); var Selector = Class.create(); Selector.prototype = { initialize: function(expression) { this.params = {classNames: []}; this.expression = expression.toString().strip(); this.parseExpression(); this.compileMatcher(); }, parseExpression: function() { function abort(message) { throw 'Parse error in selector: ' + message; } if (this.expression == '') abort('empty expression'); var params = this.params, expr = this.expression, match, modifier, clause, rest; while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { params.attributes = params.attributes || []; params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); expr = match[1]; } if (expr == '*') return this.params.wildcard = true; while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { modifier = match[1], clause = match[2], rest = match[3]; switch (modifier) { case '#': params.id = clause; break; case '.': params.classNames.push(clause); break; case '': case undefined: params.tagName = clause.toUpperCase(); break; default: abort(expr.inspect()); } expr = rest; } if (expr.length > 0) abort(expr.inspect()); }, buildMatchExpression: function() { var params = this.params, conditions = [], clause; if (params.wildcard) conditions.push('true'); if (clause = params.id) conditions.push('element.readAttribute("id") == ' + clause.inspect()); if (clause = params.tagName) conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); if ((clause = params.classNames).length > 0) for (var i = 0, length = clause.length; i < length; i++) conditions.push('element.hasClassName(' + clause[i].inspect() + ')'); if (clause = params.attributes) { clause.each(function(attribute) { var value = 'element.readAttribute(' + attribute.name.inspect() + ')'; var splitValueBy = function(delimiter) { return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; } switch (attribute.operator) { case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; case '|=': conditions.push( splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() ); break; case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; case '': case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break; default: throw 'Unknown operator ' + attribute.operator + ' in selector'; } }); } return conditions.join(' && '); }, compileMatcher: function() { this.match = new Function('element', 'if (!element.tagName) return false; \ element = $(element); \ return ' + this.buildMatchExpression()); }, findElements: function(scope) { var element; if (element = $(this.params.id)) if (this.match(element)) if (!scope || Element.childOf(element, scope)) return [element]; scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); var results = []; for (var i = 0, length = scope.length; i < length; i++) if (this.match(element = scope[i])) results.push(Element.extend(element)); return results; }, toString: function() { return this.expression; } } Object.extend(Selector, { matchElements: function(elements, expression) { var selector = new Selector(expression); return elements.select(selector.match.bind(selector)).map(Element.extend); }, findElement: function(elements, expression, index) { if (typeof expression == 'number') index = expression, expression = false; return Selector.matchElements(elements, expression || '*')[index || 0]; }, findChildElements: function(element, expressions) { return expressions.map(function(expression) { return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) { var selector = new Selector(expr); return results.inject([], function(elements, result) { return elements.concat(selector.findElements(result || element)); }); }); }).flatten(); } }); function $$() { return Selector.findChildElements(document, $A(arguments)); } var Form = { reset: function(form) { $(form).reset(); return form; }, serializeElements: function(elements, getHash) { var data = elements.inject({}, function(result, element) { if (!element.disabled && element.name) { var key = element.name, value = $(element).getValue(); if (value != undefined) { if (result[key]) { if (result[key].constructor != Array) result[key] = [result[key]]; result[key].push(value); } else result[key] = value; } } return result; }); return getHash ? data : Hash.toQueryString(data); } }; Form.Methods = { serialize: function(form, getHash) { return Form.serializeElements(Form.getElements(form), getHash); }, getElements: function(form) { return $A($(form).getElementsByTagName('*')).inject([], function(elements, child) { if (Form.Element.Serializers[child.tagName.toLowerCase()]) elements.push(Element.extend(child)); return elements; } ); }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return $A(inputs).map(Element.extend); for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(Element.extend(input)); } return matchingInputs; }, disable: function(form) { form = $(form); form.getElements().each(function(element) { element.blur(); element.disabled = 'true'; }); return form; }, enable: function(form) { form = $(form); form.getElements().each(function(element) { element.disabled = ''; }); return form; }, findFirstElement: function(form) { return $(form).getElements().find(function(element) { return element.type != 'hidden' && !element.disabled && ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); }); }, focusFirstElement: function(form) { form = $(form); form.findFirstElement().activate(); return form; } } Object.extend(Form, Form.Methods); /*--------------------------------------------------------------------------*/ Form.Element = { focus: function(element) { $(element).focus(); return element; }, select: function(element) { $(element).select(); return element; } } Form.Element.Methods = { serialize: function(element) { element = $(element); if (!element.disabled && element.name) { var value = element.getValue(); if (value != undefined) { var pair = {}; pair[element.name] = value; return Hash.toQueryString(pair); } } return ''; }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); return Form.Element.Serializers[method](element); }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); element.focus(); if (element.select && ( element.tagName.toLowerCase() != 'input' || !['button', 'reset', 'submit'].include(element.type) ) ) element.select(); return element; }, disable: function(element) { element = $(element); element.disabled = true; return element; }, enable: function(element) { element = $(element); element.blur(); element.disabled = false; return element; } } Object.extend(Form.Element, Form.Element.Methods); var Field = Form.Element; var $F = Form.Element.getValue; /*--------------------------------------------------------------------------*/ Form.Element.Serializers = { input: function(element) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element); default: return Form.Element.Serializers.textarea(element); } }, inputSelector: function(element) { return element.checked ? element.value : null; }, textarea: function(element) { return element.value; }, select: function(element) { return this[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); }, selectOne: function(element) { var index = element.selectedIndex; return index >= 0 ? this.optionValue(element.options[index]) : null; }, selectMany: function(element) { var values, length = element.length; if (!length) return null; for (var i = 0, values = []; i < length; i++) { var opt = element.options[i]; if (opt.selected) values.push(this.optionValue(opt)); } return values; }, optionValue: function(opt) { // extend element because hasAttribute may not be native return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; } } /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = function() {} Abstract.TimedObserver.prototype = { initialize: function(element, frequency, callback) { this.frequency = frequency; this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); this.registerCallback(); }, registerCallback: function() { setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { var value = this.getValue(); var changed = ('string' == typeof this.lastValue && 'string' == typeof value ? this.lastValue != value : String(this.lastValue) != String(value)); if (changed) { this.callback(this.element, value); this.lastValue = value; } } } Form.Element.Observer = Class.create(); Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(); Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = function() {} Abstract.EventObserver.prototype = { initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { Form.getElements(this.element).each(this.registerCallback.bind(this)); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; default: Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } } } Form.Element.EventObserver = Class.create(); Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.EventObserver = Class.create(); Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.serialize(this.element); } }); if (!window.Event) { var Event = new Object(); } Object.extend(Event, { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, element: function(event) { return event.target || event.srcElement; }, isLeftClick: function(event) { return (((event.which) && (event.which == 1)) || ((event.button) && (event.button == 1))); }, pointerX: function(event) { return event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); }, pointerY: function(event) { return event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); }, stop: function(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } }, // find the first node with the given tagName, starting from the // node the event was triggered on; traverses the DOM upwards findElement: function(event, tagName) { var element = Event.element(event); while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != tagName.toUpperCase()))) element = element.parentNode; return element; }, observers: false, _observeAndCache: function(element, name, observer, useCapture) { if (!this.observers) this.observers = []; if (element.addEventListener) { this.observers.push([element, name, observer, useCapture]); element.addEventListener(name, observer, useCapture); } else if (element.attachEvent) { this.observers.push([element, name, observer, useCapture]); element.attachEvent('on' + name, observer); } }, unloadCache: function() { if (!Event.observers) return; for (var i = 0, length = Event.observers.length; i < length; i++) { Event.stopObserving.apply(this, Event.observers[i]); Event.observers[i][0] = null; } Event.observers = false; }, observe: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) name = 'keydown'; Event._observeAndCache(element, name, observer, useCapture); }, stopObserving: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent)) name = 'keydown'; if (element.removeEventListener) { element.removeEventListener(name, observer, useCapture); } else if (element.detachEvent) { try { element.detachEvent('on' + name, observer); } catch (e) {} } } }); /* prevent memory leaks in IE */ if (navigator.appVersion.match(/\bMSIE\b/)) Event.observe(window, 'unload', Event.unloadCache, false); var Position = { // set to true if needed, warning: firefox performance problems // NOT neeeded for page scrolling, only if draggable contained in // scrollable elements includeScrollOffsets: false, // must be called before calling withinIncludingScrolloffset, every time the // page is scrolled prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, realOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return [valueL, valueT]; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; }, positionedOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { if(element.tagName=='BODY') break; var p = Element.getStyle(element, 'position'); if (p == 'relative' || p == 'absolute') break; } } while (element); return [valueL, valueT]; }, offsetParent: function(element) { if (element.offsetParent) return element.offsetParent; if (element == document.body) return element; while ((element = element.parentNode) && element != document.body) if (Element.getStyle(element, 'position') != 'static') return element; return document.body; }, // caches x/y coordinate pair to use with overlap within: function(element, x, y) { if (this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element, x, y); this.xcomp = x; this.ycomp = y; this.offset = this.cumulativeOffset(element); return (y >= this.offset[1] && y < this.offset[1] + element.offsetHeight && x >= this.offset[0] && x < this.offset[0] + element.offsetWidth); }, withinIncludingScrolloffsets: function(element, x, y) { var offsetcache = this.realOffset(element); this.xcomp = x + offsetcache[0] - this.deltaX; this.ycomp = y + offsetcache[1] - this.deltaY; this.offset = this.cumulativeOffset(element); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + element.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + element.offsetWidth); }, // within must be called directly before overlap: function(mode, element) { if (!mode) return 0; if (mode == 'vertical') return ((this.offset[1] + element.offsetHeight) - this.ycomp) / element.offsetHeight; if (mode == 'horizontal') return ((this.offset[0] + element.offsetWidth) - this.xcomp) / element.offsetWidth; }, page: function(forElement) { var valueT = 0, valueL = 0; var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; // Safari fix if (element.offsetParent==document.body) if (Element.getStyle(element,'position')=='absolute') break; } while (element = element.offsetParent); element = forElement; do { if (!window.opera || element.tagName=='BODY') { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } } while (element = element.parentNode); return [valueL, valueT]; }, clone: function(source, target) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || {}) // find page position of source source = $(source); var p = Position.page(source); // find coordinate system to use target = $(target); var delta = [0, 0]; var parent = null; // delta [0,0] will do fine with position: fixed elements, // position:absolute needs offsetParent deltas if (Element.getStyle(target,'position') == 'absolute') { parent = Position.offsetParent(target); delta = Position.page(parent); } // correct by body offsets (fixes Safari) if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } // set position if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if(options.setWidth) target.style.width = source.offsetWidth + 'px'; if(options.setHeight) target.style.height = source.offsetHeight + 'px'; }, absolutize: function(element) { element = $(element); if (element.style.position == 'absolute') return; Position.prepare(); var offsets = Position.positionedOffset(element); var top = offsets[1]; var left = offsets[0]; var width = element.clientWidth; var height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); element._originalWidth = element.style.width; element._originalHeight = element.style.height; element.style.position = 'absolute'; element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.width = width + 'px'; element.style.height = height + 'px'; }, relativize: function(element) { element = $(element); if (element.style.position == 'relative') return; Position.prepare(); element.style.position = 'relative'; var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.height = element._originalHeight; element.style.width = element._originalWidth; } } // Safari returns margins on body which is incorrect if the child is absolutely // positioned. For performance reasons, redefine Position.cumulativeOffset for // KHTML/WebKit only. if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { Position.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return [valueL, valueT]; } } Element.addMethods();_*http://www.mshale.com/scripts/prototype.js  Owbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:25:09 GMTUbytes_Wed, 17 Sep 2008 20:05:48 GMTT2454WASP.NET_"146e87eff023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135fkt   *8=L_lq~*/2NSWkoyO // script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // For details, see the script.aculo.us web site: http://script.aculo.us/ var Scriptaculous = { Version: '1.7.0', require: function(libraryName) { // inserting via DOM fails in Safari 2.0, so brute force approach document.write(''); }, load: function() { if((typeof Prototype=='undefined') || (typeof Element == 'undefined') || (typeof Element.Methods=='undefined') || parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.5) throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); $A(document.getElementsByTagName("script")).findAll( function(s) { return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) }).each( function(s) { var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); var includes = s.src.match(/\?.*load=([a-z,]*)/); (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( function(include) { Scriptaculous.require(path+include+'.js') }); }); } } Scriptaculous.load();_.http://www.mshale.com/scripts/scriptaculous.js  Opbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:24:55 GMTUbytes_Wed, 17 Sep 2008 20:05:48 GMTT4769WASP.NET_"98a47e7f023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135`eny}   $27FYfkx#(+GLPdorO// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ var Builder = { NODEMAP: { AREA: 'map', CAPTION: 'table', COL: 'table', COLGROUP: 'table', LEGEND: 'fieldset', OPTGROUP: 'select', OPTION: 'select', PARAM: 'object', TBODY: 'table', TD: 'table', TFOOT: 'table', TH: 'table', THEAD: 'table', TR: 'table' }, // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, // due to a Firefox bug node: function(elementName) { elementName = elementName.toUpperCase(); // try innerHTML approach var parentTag = this.NODEMAP[elementName] || 'div'; var parentElement = document.createElement(parentTag); try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" + elementName + ">"; } catch(e) {} var element = parentElement.firstChild || null; // see if browser added wrapping tags if(element && (element.tagName.toUpperCase() != elementName)) element = element.getElementsByTagName(elementName)[0]; // fallback to createElement approach if(!element) element = document.createElement(elementName); // abort if nothing could be created if(!element) return; // attributes (or text) if(arguments[1]) if(this._isStringOrNumber(arguments[1]) || (arguments[1] instanceof Array)) { this._children(element, arguments[1]); } else { var attrs = this._attributes(arguments[1]); if(attrs.length) { try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" +elementName + " " + attrs + ">"; } catch(e) {} element = parentElement.firstChild || null; // workaround firefox 1.0.X bug if(!element) { element = document.createElement(elementName); for(attr in arguments[1]) element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; } if(element.tagName.toUpperCase() != elementName) element = parentElement.getElementsByTagName(elementName)[0]; } } // text, or array of children if(arguments[2]) this._children(element, arguments[2]); return element; }, _text: function(text) { return document.createTextNode(text); }, ATTR_MAP: { 'className': 'class', 'htmlFor': 'for' }, _attributes: function(attributes) { var attrs = []; for(attribute in attributes) attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + '="' + attributes[attribute].toString().escapeHTML() + '"'); return attrs.join(" "); }, _children: function(element, children) { if(typeof children=='object') { // array can hold nodes and text children.flatten().each( function(e) { if(typeof e=='object') element.appendChild(e) else if(Builder._isStringOrNumber(e)) element.appendChild(Builder._text(e)); }); } else if(Builder._isStringOrNumber(children)) element.appendChild(Builder._text(children)); }, _isStringOrNumber: function(param) { return(typeof param=='string' || typeof param=='number'); }, build: function(html) { var element = this.node('div'); $(element).update(html.strip()); return element.down(); }, dump: function(scope) { if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); tags.each( function(tag){ scope[tag] = function() { return Builder.node.apply(Builder, [tag].concat($A(arguments))); } }); } } _(http://www.mshale.com/scripts/builder.js  ! Oqbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:25:02 GMTUbytes_Wed, 17 Sep 2008 20:05:49 GMTU38961WASP.NET_"38b70ebf023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135`eny}   $27FYfkx$),HMQeosO1// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) // Martin Bialasinki // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ // converts rgb() and #xxx to #xxxxxx format, // returns self (or first argument) if not convertable String.prototype.parseColor = function() { var color = '#'; if(this.slice(0,4) == 'rgb(') { var cols = this.slice(4,this.length-1).split(','); var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); } else { if(this.slice(0,1) == '#') { if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); if(this.length==7) color = this.toLowerCase(); } } return(color.length==7 ? color : (arguments[0] || this)); } /*--------------------------------------------------------------------------*/ Element.collectTextNodes = function(element) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); }).flatten().join(''); } Element.collectTextNodesIgnoreClass = function(element, className) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? Element.collectTextNodesIgnoreClass(node, className) : '')); }).flatten().join(''); } Element.setContentZoom = function(element, percent) { element = $(element); element.setStyle({fontSize: (percent/100) + 'em'}); if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); return element; } Element.getOpacity = function(element){ return $(element).getStyle('opacity'); } Element.setOpacity = function(element, value){ return $(element).setStyle({opacity:value}); } Element.getInlineOpacity = function(element){ return $(element).style.opacity || ''; } Element.forceRerendering = function(element) { try { element = $(element); var n = document.createTextNode(' '); element.appendChild(n); element.removeChild(n); } catch(e) { } }; /*--------------------------------------------------------------------------*/ Array.prototype.call = function() { var args = arguments; this.each(function(f){ f.apply(this, args) }); } /*--------------------------------------------------------------------------*/ var Effect = { _elementDoesNotExistError: { name: 'ElementDoesNotExistError', message: 'The specified DOM element does not exist, but is required for this effect to operate' }, tagifyText: function(element) { if(typeof Builder == 'undefined') throw("Effect.tagifyText requires including script.aculo.us' builder.js library"); var tagifyStyle = 'position:relative'; if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; element = $(element); $A(element.childNodes).each( function(child) { if(child.nodeType==3) { child.nodeValue.toArray().each( function(character) { element.insertBefore( Builder.node('span',{style: tagifyStyle}, character == ' ' ? String.fromCharCode(160) : character), child); }); Element.remove(child); } }); }, multiple: function(element, effect) { var elements; if(((typeof element == 'object') || (typeof element == 'function')) && (element.length)) elements = element; else elements = $(element).childNodes; var options = Object.extend({ speed: 0.1, delay: 0.0 }, arguments[2] || {}); var masterDelay = options.delay; $A(elements).each( function(element, index) { new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); }); }, PAIRS: { 'slide': ['SlideDown','SlideUp'], 'blind': ['BlindDown','BlindUp'], 'appear': ['Appear','Fade'] }, toggle: function(element, effect) { element = $(element); effect = (effect || 'appear').toLowerCase(); var options = Object.extend({ queue: { position:'end', scope:(element.id || 'global'), limit: 1 } }, arguments[2] || {}); Effect[element.visible() ? Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); } }; var Effect2 = Effect; // deprecated /* ------------- transitions ------------- */ Effect.Transitions = { linear: Prototype.K, sinoidal: function(pos) { return (-Math.cos(pos*Math.PI)/2) + 0.5; }, reverse: function(pos) { return 1-pos; }, flicker: function(pos) { return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; }, wobble: function(pos) { return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; }, pulse: function(pos, pulses) { pulses = pulses || 5; return ( Math.round((pos % (1/pulses)) * pulses) == 0 ? ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) ); }, none: function(pos) { return 0; }, full: function(pos) { return 1; } }; /* ------------- core effects ------------- */ Effect.ScopedQueue = Class.create(); Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { initialize: function() { this.effects = []; this.interval = null; }, _each: function(iterator) { this.effects._each(iterator); }, add: function(effect) { var timestamp = new Date().getTime(); var position = (typeof effect.options.queue == 'string') ? effect.options.queue : effect.options.queue.position; switch(position) { case 'front': // move unstarted effects after this effect this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { e.startOn += effect.finishOn; e.finishOn += effect.finishOn; }); break; case 'with-last': timestamp = this.effects.pluck('startOn').max() || timestamp; break; case 'end': // start effect after last queued effect has finished timestamp = this.effects.pluck('finishOn').max() || timestamp; break; } effect.startOn += timestamp; effect.finishOn += timestamp; if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) this.effects.push(effect); if(!this.interval) this.interval = setInterval(this.loop.bind(this), 15); }, remove: function(effect) { this.effects = this.effects.reject(function(e) { return e==effect }); if(this.effects.length == 0) { clearInterval(this.interval); this.interval = null; } }, loop: function() { var timePos = new Date().getTime(); for(var i=0, len=this.effects.length;i= this.startOn) { if(timePos >= this.finishOn) { this.render(1.0); this.cancel(); this.event('beforeFinish'); if(this.finish) this.finish(); this.event('afterFinish'); return; } var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); var frame = Math.round(pos * this.options.fps * this.options.duration); if(frame > this.currentFrame) { this.render(pos); this.currentFrame = frame; } } }, render: function(pos) { if(this.state == 'idle') { this.state = 'running'; this.event('beforeSetup'); if(this.setup) this.setup(); this.event('afterSetup'); } if(this.state == 'running') { if(this.options.transition) pos = this.options.transition(pos); pos *= (this.options.to-this.options.from); pos += this.options.from; this.position = pos; this.event('beforeUpdate'); if(this.update) this.update(pos); this.event('afterUpdate'); } }, cancel: function() { if(!this.options.sync) Effect.Queues.get(typeof this.options.queue == 'string' ? 'global' : this.options.queue.scope).remove(this); this.state = 'finished'; }, event: function(eventName) { if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); if(this.options[eventName]) this.options[eventName](this); }, inspect: function() { var data = $H(); for(property in this) if(typeof this[property] != 'function') data[property] = this[property]; return '#'; } } Effect.Parallel = Class.create(); Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { initialize: function(effects) { this.effects = effects || []; this.start(arguments[1]); }, update: function(position) { this.effects.invoke('render', position); }, finish: function(position) { this.effects.each( function(effect) { effect.render(1.0); effect.cancel(); effect.event('beforeFinish'); if(effect.finish) effect.finish(position); effect.event('afterFinish'); }); } }); Effect.Event = Class.create(); Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), { initialize: function() { var options = Object.extend({ duration: 0 }, arguments[0] || {}); this.start(options); }, update: Prototype.emptyFunction }); Effect.Opacity = Class.create(); Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); // make this work on IE on elements without 'layout' if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) this.element.setStyle({zoom: 1}); var options = Object.extend({ from: this.element.getOpacity() || 0.0, to: 1.0 }, arguments[1] || {}); this.start(options); }, update: function(position) { this.element.setOpacity(position); } }); Effect.Move = Class.create(); Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ x: 0, y: 0, mode: 'relative' }, arguments[1] || {}); this.start(options); }, setup: function() { // Bug in Opera: Opera returns the "real" position of a static element or // relative element that does not have top/left explicitly set. // ==> Always set top and left for position relative elements in your stylesheets // (to 0 if you do not need them) this.element.makePositioned(); this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); this.originalTop = parseFloat(this.element.getStyle('top') || '0'); if(this.options.mode == 'absolute') { // absolute movement, so we need to calc deltaX and deltaY this.options.x = this.options.x - this.originalLeft; this.options.y = this.options.y - this.originalTop; } }, update: function(position) { this.element.setStyle({ left: Math.round(this.options.x * position + this.originalLeft) + 'px', top: Math.round(this.options.y * position + this.originalTop) + 'px' }); } }); // for backwards compatibility Effect.MoveBy = function(element, toTop, toLeft) { return new Effect.Move(element, Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); }; Effect.Scale = Class.create(); Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { initialize: function(element, percent) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ scaleX: true, scaleY: true, scaleContent: true, scaleFromCenter: false, scaleMode: 'box', // 'box' or 'contents' or {} with provided values scaleFrom: 100.0, scaleTo: percent }, arguments[2] || {}); this.start(options); }, setup: function() { this.restoreAfterFinish = this.options.restoreAfterFinish || false; this.elementPositioning = this.element.getStyle('position'); this.originalStyle = {}; ['top','left','width','height','fontSize'].each( function(k) { this.originalStyle[k] = this.element.style[k]; }.bind(this)); this.originalTop = this.element.offsetTop; this.originalLeft = this.element.offsetLeft; var fontSize = this.element.getStyle('font-size') || '100%'; ['em','px','%','pt'].each( function(fontSizeType) { if(fontSize.indexOf(fontSizeType)>0) { this.fontSize = parseFloat(fontSize); this.fontSizeType = fontSizeType; } }.bind(this)); this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; this.dims = null; if(this.options.scaleMode=='box') this.dims = [this.element.offsetHeight, this.element.offsetWidth]; if(/^content/.test(this.options.scaleMode)) this.dims = [this.element.scrollHeight, this.element.scrollWidth]; if(!this.dims) this.dims = [this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth]; }, update: function(position) { var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); if(this.options.scaleContent && this.fontSize) this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); }, finish: function(position) { if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle); }, setDimensions: function(height, width) { var d = {}; if(this.options.scaleX) d.width = Math.round(width) + 'px'; if(this.options.scaleY) d.height = Math.round(height) + 'px'; if(this.options.scaleFromCenter) { var topd = (height - this.dims[0])/2; var leftd = (width - this.dims[1])/2; if(this.elementPositioning == 'absolute') { if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; } else { if(this.options.scaleY) d.top = -topd + 'px'; if(this.options.scaleX) d.left = -leftd + 'px'; } } this.element.setStyle(d); } }); Effect.Highlight = Class.create(); Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); this.start(options); }, setup: function() { // Prevent executing on elements not in the layout flow if(this.element.getStyle('display')=='none') { this.cancel(); return; } // Disable background image during the effect this.oldStyle = {}; if (!this.options.keepBackgroundImage) { this.oldStyle.backgroundImage = this.element.getStyle('background-image'); this.element.setStyle({backgroundImage: 'none'}); } if(!this.options.endcolor) this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); if(!this.options.restorecolor) this.options.restorecolor = this.element.getStyle('background-color'); // init color calculations this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); }, update: function(position) { this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); }, finish: function() { this.element.setStyle(Object.extend(this.oldStyle, { backgroundColor: this.options.restorecolor })); } }); Effect.ScrollTo = Class.create(); Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); this.start(arguments[1] || {}); }, setup: function() { Position.prepare(); var offsets = Position.cumulativeOffset(this.element); if(this.options.offset) offsets[1] += this.options.offset; var max = window.innerHeight ? window.height - window.innerHeight : document.body.scrollHeight - (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight); this.scrollStart = Position.deltaY; this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; }, update: function(position) { Position.prepare(); window.scrollTo(Position.deltaX, this.scrollStart + (position*this.delta)); } }); /* ------------- combination effects ------------- */ Effect.Fade = function(element) { element = $(element); var oldOpacity = element.getInlineOpacity(); var options = Object.extend({ from: element.getOpacity() || 1.0, to: 0.0, afterFinishInternal: function(effect) { if(effect.options.to!=0) return; effect.element.hide().setStyle({opacity: oldOpacity}); }}, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Appear = function(element) { element = $(element); var options = Object.extend({ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), to: 1.0, // force Safari to render floated elements properly afterFinishInternal: function(effect) { effect.element.forceRerendering(); }, beforeSetup: function(effect) { effect.element.setOpacity(effect.options.from).show(); }}, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Puff = function(element) { element = $(element); var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position'), top: element.style.top, left: element.style.left, width: element.style.width, height: element.style.height }; return new Effect.Parallel( [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], Object.extend({ duration: 1.0, beforeSetupInternal: function(effect) { Position.absolutize(effect.effects[0].element) }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().setStyle(oldStyle); } }, arguments[1] || {}) ); } Effect.BlindUp = function(element) { element = $(element); element.makeClipping(); return new Effect.Scale(element, 0, Object.extend({ scaleContent: false, scaleX: false, restoreAfterFinish: true, afterFinishInternal: function(effect) { effect.element.hide().undoClipping(); } }, arguments[1] || {}) ); } Effect.BlindDown = function(element) { element = $(element); var elementDimensions = element.getDimensions(); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: 0, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { effect.element.makeClipping().setStyle({height: '0px'}).show(); }, afterFinishInternal: function(effect) { effect.element.undoClipping(); } }, arguments[1] || {})); } Effect.SwitchOff = function(element) { element = $(element); var oldOpacity = element.getInlineOpacity(); return new Effect.Appear(element, Object.extend({ duration: 0.4, from: 0, transition: Effect.Transitions.flicker, afterFinishInternal: function(effect) { new Effect.Scale(effect.element, 1, { duration: 0.3, scaleFromCenter: true, scaleX: false, scaleContent: false, restoreAfterFinish: true, beforeSetup: function(effect) { effect.element.makePositioned().makeClipping(); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); } }) } }, arguments[1] || {})); } Effect.DropOut = function(element) { element = $(element); var oldStyle = { top: element.getStyle('top'), left: element.getStyle('left'), opacity: element.getInlineOpacity() }; return new Effect.Parallel( [ new Effect.Move(element, {x: 0, y: 100, sync: true }), new Effect.Opacity(element, { sync: true, to: 0.0 }) ], Object.extend( { duration: 0.5, beforeSetup: function(effect) { effect.effects[0].element.makePositioned(); }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); } }, arguments[1] || {})); } Effect.Shake = function(element) { element = $(element); var oldStyle = { top: element.getStyle('top'), left: element.getStyle('left') }; return new Effect.Move(element, { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { effect.element.undoPositioned().setStyle(oldStyle); }}) }}) }}) }}) }}) }}); } Effect.SlideDown = function(element) { element = $(element).cleanWhitespace(); // SlideDown need to have the content of the element wrapped in a container element with fixed height! var oldInnerBottom = element.down().getStyle('bottom'); var elementDimensions = element.getDimensions(); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: window.opera ? 0 : 1, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera) effect.element.setStyle({top: ''}); effect.element.makeClipping().setStyle({height: '0px'}).show(); }, afterUpdateInternal: function(effect) { effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, afterFinishInternal: function(effect) { effect.element.undoClipping().undoPositioned(); effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } }, arguments[1] || {}) ); } Effect.SlideUp = function(element) { element = $(element).cleanWhitespace(); var oldInnerBottom = element.down().getStyle('bottom'); return new Effect.Scale(element, window.opera ? 0 : 1, Object.extend({ scaleContent: false, scaleX: false, scaleMode: 'box', scaleFrom: 100, restoreAfterFinish: true, beforeStartInternal: function(effect) { effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera) effect.element.setStyle({top: ''}); effect.element.makeClipping().show(); }, afterUpdateInternal: function(effect) { effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom}); effect.element.down().undoPositioned(); } }, arguments[1] || {}) ); } // Bug in opera makes the TD containing this element expand for a instance after finish Effect.Squish = function(element) { return new Effect.Scale(element, window.opera ? 1 : 0, { restoreAfterFinish: true, beforeSetup: function(effect) { effect.element.makeClipping(); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping(); } }); } Effect.Grow = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.full }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: element.getInlineOpacity() }; var dims = element.getDimensions(); var initialMoveX, initialMoveY; var moveX, moveY; switch (options.direction) { case 'top-left': initialMoveX = initialMoveY = moveX = moveY = 0; break; case 'top-right': initialMoveX = dims.width; initialMoveY = moveY = 0; moveX = -dims.width; break; case 'bottom-left': initialMoveX = moveX = 0; initialMoveY = dims.height; moveY = -dims.height; break; case 'bottom-right': initialMoveX = dims.width; initialMoveY = dims.height; moveX = -dims.width; moveY = -dims.height; break; case 'center': initialMoveX = dims.width / 2; initialMoveY = dims.height / 2; moveX = -dims.width / 2; moveY = -dims.height / 2; break; } return new Effect.Move(element, { x: initialMoveX, y: initialMoveY, duration: 0.01, beforeSetup: function(effect) { effect.element.hide().makeClipping().makePositioned(); }, afterFinishInternal: function(effect) { new Effect.Parallel( [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), new Effect.Scale(effect.element, 100, { scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) ], Object.extend({ beforeSetup: function(effect) { effect.effects[0].element.setStyle({height: '0px'}).show(); }, afterFinishInternal: function(effect) { effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); } }, options) ) } }); } Effect.Shrink = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.none }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: element.getInlineOpacity() }; var dims = element.getDimensions(); var moveX, moveY; switch (options.direction) { case 'top-left': moveX = moveY = 0; break; case 'top-right': moveX = dims.width; moveY = 0; break; case 'bottom-left': moveX = 0; moveY = dims.height; break; case 'bottom-right': moveX = dims.width; moveY = dims.height; break; case 'center': moveX = dims.width / 2; moveY = dims.height / 2; break; } return new Effect.Parallel( [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) ], Object.extend({ beforeStartInternal: function(effect) { effect.effects[0].element.makePositioned().makeClipping(); }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } }, options) ); } Effect.Pulsate = function(element) { element = $(element); var options = arguments[1] || {}; var oldOpacity = element.getInlineOpacity(); var transition = options.transition || Effect.Transitions.sinoidal; var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; reverser.bind(transition); return new Effect.Opacity(element, Object.extend(Object.extend({ duration: 2.0, from: 0, afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } }, options), {transition: reverser})); } Effect.Fold = function(element) { element = $(element); var oldStyle = { top: element.style.top, left: element.style.left, width: element.style.width, height: element.style.height }; element.makeClipping(); return new Effect.Scale(element, 5, Object.extend({ scaleContent: false, scaleX: false, afterFinishInternal: function(effect) { new Effect.Scale(element, 1, { scaleContent: false, scaleY: false, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().setStyle(oldStyle); } }); }}, arguments[1] || {})); }; Effect.Morph = Class.create(); Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ style: {} }, arguments[1] || {}); if (typeof options.style == 'string') { if(options.style.indexOf(':') == -1) { var cssText = '', selector = '.' + options.style; $A(document.styleSheets).reverse().each(function(styleSheet) { if (styleSheet.cssRules) cssRules = styleSheet.cssRules; else if (styleSheet.rules) cssRules = styleSheet.rules; $A(cssRules).reverse().each(function(rule) { if (selector == rule.selectorText) { cssText = rule.style.cssText; throw $break; } }); if (cssText) throw $break; }); this.style = cssText.parseStyle(); options.afterFinishInternal = function(effect){ effect.element.addClassName(effect.options.style); effect.transforms.each(function(transform) { if(transform.style != 'opacity') effect.element.style[transform.style.camelize()] = ''; }); } } else this.style = options.style.parseStyle(); } else this.style = $H(options.style) this.start(options); }, setup: function(){ function parseColor(color){ if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; color = color.parseColor(); return $R(0,2).map(function(i){ return parseInt( color.slice(i*2+1,i*2+3), 16 ) }); } this.transforms = this.style.map(function(pair){ var property = pair[0].underscore().dasherize(), value = pair[1], unit = null; if(value.parseColor('#zzzzzz') != '#zzzzzz') { value = value.parseColor(); unit = 'color'; } else if(property == 'opacity') { value = parseFloat(value); if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) this.element.setStyle({zoom: 1}); } else if(Element.CSS_LENGTH.test(value)) var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/), value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null; var originalValue = this.element.getStyle(property); return $H({ style: property, originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), targetValue: unit=='color' ? parseColor(value) : value, unit: unit }); }.bind(this)).reject(function(transform){ return ( (transform.originalValue == transform.targetValue) || ( transform.unit != 'color' && (isNaN(transform.originalValue) || isNaN(transform.targetValue)) ) ) }); }, update: function(position) { var style = $H(), value = null; this.transforms.each(function(transform){ value = transform.unit=='color' ? $R(0,2).inject('#',function(m,v,i){ return m+(Math.round(transform.originalValue[i]+ (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : transform.originalValue + Math.round( ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit; style[transform.style] = value; }); this.element.setStyle(style); } }); Effect.Transform = Class.create(); Object.extend(Effect.Transform.prototype, { initialize: function(tracks){ this.tracks = []; this.options = arguments[1] || {}; this.addTracks(tracks); }, addTracks: function(tracks){ tracks.each(function(track){ var data = $H(track).values().first(); this.tracks.push($H({ ids: $H(track).keys().first(), effect: Effect.Morph, options: { style: data } })); }.bind(this)); return this; }, play: function(){ return new Effect.Parallel( this.tracks.map(function(track){ var elements = [$(track.ids) || $$(track.ids)].flatten(); return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) }); }).flatten(), this.options ); } }); Element.CSS_PROPERTIES = $w( 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + 'fontSize fontWeight height left letterSpacing lineHeight ' + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + 'right textIndent top width wordSpacing zIndex'); Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; String.prototype.parseStyle = function(){ var element = Element.extend(document.createElement('div')); element.innerHTML = '
'; var style = element.down().style, styleRules = $H(); Element.CSS_PROPERTIES.each(function(property){ if(style[property]) styleRules[property] = style[property]; }); if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) { styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]; } return styleRules; }; Element.morph = function(element, style) { new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {})); return element; }; ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( function(f) { Element.Methods[f] = Element[f]; } ); Element.Methods.visualEffect = function(element, effect, options) { s = effect.gsub(/_/, '-').camelize(); effect_class = s.charAt(0).toUpperCase() + s.substring(1); new Effect[effect_class](element, options); return $(element); }; Element.addMethods();_(http://www.mshale.com/scripts/effects.js #$% Osbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:25:00 GMTUbytes_Wed, 17 Sep 2008 20:05:49 GMTU31589WASP.NET_"769ec3e9f023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135afoz~  %38GZgly&+.JOSgouO{e// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ if(typeof Effect == 'undefined') throw("dragdrop.js requires including script.aculo.us' effects.js library"); var Droppables = { drops: [], remove: function(element) { this.drops = this.drops.reject(function(d) { return d.element==$(element) }); }, add: function(element) { element = $(element); var options = Object.extend({ greedy: true, hoverclass: null, tree: false }, arguments[1] || {}); // cache containers if(options.containment) { options._containers = []; var containment = options.containment; if((typeof containment == 'object') && (containment.constructor == Array)) { containment.each( function(c) { options._containers.push($(c)) }); } else { options._containers.push($(containment)); } } if(options.accept) options.accept = [options.accept].flatten(); Element.makePositioned(element); // fix IE options.element = element; this.drops.push(options); }, findDeepestChild: function(drops) { deepest = drops[0]; for (i = 1; i < drops.length; ++i) if (Element.isParent(drops[i].element, deepest.element)) deepest = drops[i]; return deepest; }, isContained: function(element, drop) { var containmentNode; if(drop.tree) { containmentNode = element.treeNode; } else { containmentNode = element.parentNode; } return drop._containers.detect(function(c) { return containmentNode == c }); }, isAffected: function(point, element, drop) { return ( (drop.element!=element) && ((!drop._containers) || this.isContained(element, drop)) && ((!drop.accept) || (Element.classNames(element).detect( function(v) { return drop.accept.include(v) } ) )) && Position.within(drop.element, point[0], point[1]) ); }, deactivate: function(drop) { if(drop.hoverclass) Element.removeClassName(drop.element, drop.hoverclass); this.last_active = null; }, activate: function(drop) { if(drop.hoverclass) Element.addClassName(drop.element, drop.hoverclass); this.last_active = drop; }, show: function(point, element) { if(!this.drops.length) return; var affected = []; if(this.last_active) this.deactivate(this.last_active); this.drops.each( function(drop) { if(Droppables.isAffected(point, element, drop)) affected.push(drop); }); if(affected.length>0) { drop = Droppables.findDeepestChild(affected); Position.within(drop.element, point[0], point[1]); if(drop.onHover) drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); Droppables.activate(drop); } }, fire: function(event, element) { if(!this.last_active) return; Position.prepare(); if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) if (this.last_active.onDrop) this.last_active.onDrop(element, this.last_active.element, event); }, reset: function() { if(this.last_active) this.deactivate(this.last_active); } } var Draggables = { drags: [], observers: [], register: function(draggable) { if(this.drags.length == 0) { this.eventMouseUp = this.endDrag.bindAsEventListener(this); this.eventMouseMove = this.updateDrag.bindAsEventListener(this); this.eventKeypress = this.keyPress.bindAsEventListener(this); Event.observe(document, "mouseup", this.eventMouseUp); Event.observe(document, "mousemove", this.eventMouseMove); Event.observe(document, "keypress", this.eventKeypress); } this.drags.push(draggable); }, unregister: function(draggable) { this.drags = this.drags.reject(function(d) { return d==draggable }); if(this.drags.length == 0) { Event.stopObserving(document, "mouseup", this.eventMouseUp); Event.stopObserving(document, "mousemove", this.eventMouseMove); Event.stopObserving(document, "keypress", this.eventKeypress); } }, activate: function(draggable) { if(draggable.options.delay) { this._timeout = setTimeout(function() { Draggables._timeout = null; window.focus(); Draggables.activeDraggable = draggable; }.bind(this), draggable.options.delay); } else { window.focus(); // allows keypress events if window isn't currently focused, fails for Safari this.activeDraggable = draggable; } }, deactivate: function() { this.activeDraggable = null; }, updateDrag: function(event) { if(!this.activeDraggable) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; // Mozilla-based browsers fire successive mousemove events with // the same coordinates, prevent needless redrawing (moz bug?) if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; this._lastPointer = pointer; this.activeDraggable.updateDrag(event, pointer); }, endDrag: function(event) { if(this._timeout) { clearTimeout(this._timeout); this._timeout = null; } if(!this.activeDraggable) return; this._lastPointer = null; this.activeDraggable.endDrag(event); this.activeDraggable = null; }, keyPress: function(event) { if(this.activeDraggable) this.activeDraggable.keyPress(event); }, addObserver: function(observer) { this.observers.push(observer); this._cacheObserverCallbacks(); }, removeObserver: function(element) { // element instead of observer fixes mem leaks this.observers = this.observers.reject( function(o) { return o.element==element }); this._cacheObserverCallbacks(); }, notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' if(this[eventName+'Count'] > 0) this.observers.each( function(o) { if(o[eventName]) o[eventName](eventName, draggable, event); }); if(draggable.options[eventName]) draggable.options[eventName](draggable, event); }, _cacheObserverCallbacks: function() { ['onStart','onEnd','onDrag'].each( function(eventName) { Draggables[eventName+'Count'] = Draggables.observers.select( function(o) { return o[eventName]; } ).length; }); } } /*--------------------------------------------------------------------------*/ var Draggable = Class.create(); Draggable._dragging = {}; Draggable.prototype = { initialize: function(element) { var defaults = { handle: false, reverteffect: function(element, top_offset, left_offset) { var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, queue: {scope:'_draggable', position:'end'} }); }, endeffect: function(element) { var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0; new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, queue: {scope:'_draggable', position:'end'}, afterFinish: function(){ Draggable._dragging[element] = false } }); }, zindex: 1000, revert: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } delay: 0 }; if(!arguments[1] || typeof arguments[1].endeffect == 'undefined') Object.extend(defaults, { starteffect: function(element) { element._opacity = Element.getOpacity(element); Draggable._dragging[element] = true; new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); } }); var options = Object.extend(defaults, arguments[1] || {}); this.element = $(element); if(options.handle && (typeof options.handle == 'string')) this.handle = this.element.down('.'+options.handle, 0); if(!this.handle) this.handle = $(options.handle); if(!this.handle) this.handle = this.element; if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { options.scroll = $(options.scroll); this._isScrollChild = Element.childOf(this.element, options.scroll); } Element.makePositioned(this.element); // fix IE this.delta = this.currentDelta(); this.options = options; this.dragging = false; this.eventMouseDown = this.initDrag.bindAsEventListener(this); Event.observe(this.handle, "mousedown", this.eventMouseDown); Draggables.register(this); }, destroy: function() { Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); Draggables.unregister(this); }, currentDelta: function() { return([ parseInt(Element.getStyle(this.element,'left') || '0'), parseInt(Element.getStyle(this.element,'top') || '0')]); }, initDrag: function(event) { if(typeof Draggable._dragging[this.element] != 'undefined' && Draggable._dragging[this.element]) return; if(Event.isLeftClick(event)) { // abort on form elements, fixes a Firefox issue var src = Event.element(event); if((tag_name = src.tagName.toUpperCase()) && ( tag_name=='INPUT' || tag_name=='SELECT' || tag_name=='OPTION' || tag_name=='BUTTON' || tag_name=='TEXTAREA')) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; var pos = Position.cumulativeOffset(this.element); this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); Draggables.activate(this); Event.stop(event); } }, startDrag: function(event) { this.dragging = true; if(this.options.zindex) { this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); this.element.style.zIndex = this.options.zindex; } if(this.options.ghosting) { this._clone = this.element.cloneNode(true); Position.absolutize(this.element); this.element.parentNode.insertBefore(this._clone, this.element); } if(this.options.scroll) { if (this.options.scroll == window) { var where = this._getWindowScroll(this.options.scroll); this.originalScrollLeft = where.left; this.originalScrollTop = where.top; } else { this.originalScrollLeft = this.options.scroll.scrollLeft; this.originalScrollTop = this.options.scroll.scrollTop; } } Draggables.notify('onStart', this, event); if(this.options.starteffect) this.options.starteffect(this.element); }, updateDrag: function(event, pointer) { if(!this.dragging) this.startDrag(event); Position.prepare(); Droppables.show(pointer, this.element); Draggables.notify('onDrag', this, event); this.draw(pointer); if(this.options.change) this.options.change(this); if(this.options.scroll) { this.stopScrolling(); var p; if (this.options.scroll == window) { with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } } else { p = Position.page(this.options.scroll); p[0] += this.options.scroll.scrollLeft + Position.deltaX; p[1] += this.options.scroll.scrollTop + Position.deltaY; p.push(p[0]+this.options.scroll.offsetWidth); p.push(p[1]+this.options.scroll.offsetHeight); } var speed = [0,0]; if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); this.startScrolling(speed); } // fix AppleWebKit rendering if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); Event.stop(event); }, finishDrag: function(event, success) { this.dragging = false; if(this.options.ghosting) { Position.relativize(this.element); Element.remove(this._clone); this._clone = null; } if(success) Droppables.fire(event, this.element); Draggables.notify('onEnd', this, event); var revert = this.options.revert; if(revert && typeof revert == 'function') revert = revert(this.element); var d = this.currentDelta(); if(revert && this.options.reverteffect) { this.options.reverteffect(this.element, d[1]-this.delta[1], d[0]-this.delta[0]); } else { this.delta = d; } if(this.options.zindex) this.element.style.zIndex = this.originalZ; if(this.options.endeffect) this.options.endeffect(this.element); Draggables.deactivate(this); Droppables.reset(); }, keyPress: function(event) { if(event.keyCode!=Event.KEY_ESC) return; this.finishDrag(event, false); Event.stop(event); }, endDrag: function(event) { if(!this.dragging) return; this.stopScrolling(); this.finishDrag(event, true); Event.stop(event); }, draw: function(point) { var pos = Position.cumulativeOffset(this.element); if(this.options.ghosting) { var r = Position.realOffset(this.element); pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; } var d = this.currentDelta(); pos[0] -= d[0]; pos[1] -= d[1]; if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; } var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this)); if(this.options.snap) { if(typeof this.options.snap == 'function') { p = this.options.snap(p[0],p[1],this); } else { if(this.options.snap instanceof Array) { p = p.map( function(v, i) { return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) } else { p = p.map( function(v) { return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) } }} var style = this.element.style; if((!this.options.constraint) || (this.options.constraint=='horizontal')) style.left = p[0] + "px"; if((!this.options.constraint) || (this.options.constraint=='vertical')) style.top = p[1] + "px"; if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering }, stopScrolling: function() { if(this.scrollInterval) { clearInterval(this.scrollInterval); this.scrollInterval = null; Draggables._lastScrollPointer = null; } }, startScrolling: function(speed) { if(!(speed[0] || speed[1])) return; this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; this.lastScrolled = new Date(); this.scrollInterval = setInterval(this.scroll.bind(this), 10); }, scroll: function() { var current = new Date(); var delta = current - this.lastScrolled; this.lastScrolled = current; if(this.options.scroll == window) { with (this._getWindowScroll(this.options.scroll)) { if (this.scrollSpeed[0] || this.scrollSpeed[1]) { var d = delta / 1000; this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); } } } else { this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; } Position.prepare(); Droppables.show(Draggables._lastPointer, this.element); Draggables.notify('onDrag', this); if (this._isScrollChild) { Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; if (Draggables._lastScrollPointer[0] < 0) Draggables._lastScrollPointer[0] = 0; if (Draggables._lastScrollPointer[1] < 0) Draggables._lastScrollPointer[1] = 0; this.draw(Draggables._lastScrollPointer); } if(this.options.change) this.options.change(this); }, _getWindowScroll: function(w) { var T, L, W, H; with (w.document) { if (w.document.documentElement && documentElement.scrollTop) { T = documentElement.scrollTop; L = documentElement.scrollLeft; } else if (w.document.body) { T = body.scrollTop; L = body.scrollLeft; } if (w.innerWidth) { W = w.innerWidth; H = w.innerHeight; } else if (w.document.documentElement && documentElement.clientWidth) { W = documentElement.clientWidth; H = documentElement.clientHeight; } else { W = body.offsetWidth; H = body.offsetHeight } } return { top: T, left: L, width: W, height: H }; } } /*--------------------------------------------------------------------------*/ var SortableObserver = Class.create(); SortableObserver.prototype = { initialize: function(element, observer) { this.element = $(element); this.observer = observer; this.lastValue = Sortable.serialize(this.element); }, onStart: function() { this.lastValue = Sortable.serialize(this.element); }, onEnd: function() { Sortable.unmark(); if(this.lastValue != Sortable.serialize(this.element)) this.observer(this.element) } } var Sortable = { SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, sortables: {}, _findRootElement: function(element) { while (element.tagName.toUpperCase() != "BODY") { if(element.id && Sortable.sortables[element.id]) return element; element = element.parentNode; } }, options: function(element) { element = Sortable._findRootElement($(element)); if(!element) return; return Sortable.sortables[element.id]; }, destroy: function(element){ var s = Sortable.options(element); if(s) { Draggables.removeObserver(s.element); s.droppables.each(function(d){ Droppables.remove(d) }); s.draggables.invoke('destroy'); delete Sortable.sortables[s.element.id]; } }, create: function(element) { element = $(element); var options = Object.extend({ element: element, tag: 'li', // assumes li children, override with tag: 'tagname' dropOnEmpty: false, tree: false, treeTag: 'ul', overlap: 'vertical', // one of 'vertical', 'horizontal' constraint: 'vertical', // one of 'vertical', 'horizontal', false containment: element, // also takes array of elements (or id's); or false handle: false, // or a CSS class only: false, delay: 0, hoverclass: null, ghosting: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, format: this.SERIALIZE_RULE, onChange: Prototype.emptyFunction, onUpdate: Prototype.emptyFunction }, arguments[1] || {}); // clear any old sortable with same element this.destroy(element); // build options for the draggables var options_for_draggable = { revert: true, scroll: options.scroll, scrollSpeed: options.scrollSpeed, scrollSensitivity: options.scrollSensitivity, delay: options.delay, ghosting: options.ghosting, constraint: options.constraint, handle: options.handle }; if(options.starteffect) options_for_draggable.starteffect = options.starteffect; if(options.reverteffect) options_for_draggable.reverteffect = options.reverteffect; else if(options.ghosting) options_for_draggable.reverteffect = function(element) { element.style.top = 0; element.style.left = 0; }; if(options.endeffect) options_for_draggable.endeffect = options.endeffect; if(options.zindex) options_for_draggable.zindex = options.zindex; // build options for the droppables var options_for_droppable = { overlap: options.overlap, containment: options.containment, tree: options.tree, hoverclass: options.hoverclass, onHover: Sortable.onHover } var options_for_tree = { onHover: Sortable.onEmptyHover, overlap: options.overlap, containment: options.containment, hoverclass: options.hoverclass } // fix for gecko engine Element.cleanWhitespace(element); options.draggables = []; options.droppables = []; // drop on empty handling if(options.dropOnEmpty || options.tree) { Droppables.add(element, options_for_tree); options.droppables.push(element); } (this.findElements(element, options) || []).each( function(e) { // handles are per-draggable var handle = options.handle ? $(e).down('.'+options.handle,0) : e; options.draggables.push( new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); Droppables.add(e, options_for_droppable); if(options.tree) e.treeNode = element; options.droppables.push(e); }); if(options.tree) { (Sortable.findTreeElements(element, options) || []).each( function(e) { Droppables.add(e, options_for_tree); e.treeNode = element; options.droppables.push(e); }); } // keep reference this.sortables[element.id] = options; // for onupdate Draggables.addObserver(new SortableObserver(element, options.onUpdate)); }, // return all suitable-for-sortable elements in a guaranteed order findElements: function(element, options) { return Element.findChildren( element, options.only, options.tree ? true : false, options.tag); }, findTreeElements: function(element, options) { return Element.findChildren( element, options.only, options.tree ? true : false, options.treeTag); }, onHover: function(element, dropon, overlap) { if(Element.isParent(dropon, element)) return; if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { return; } else if(overlap>0.5) { Sortable.mark(dropon, 'before'); if(dropon.previousSibling != element) { var oldParentNode = element.parentNode; element.style.visibility = "hidden"; // fix gecko rendering dropon.parentNode.insertBefore(element, dropon); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } } else { Sortable.mark(dropon, 'after'); var nextElement = dropon.nextSibling || null; if(nextElement != element) { var oldParentNode = element.parentNode; element.style.visibility = "hidden"; // fix gecko rendering dropon.parentNode.insertBefore(element, nextElement); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } } }, onEmptyHover: function(element, dropon, overlap) { var oldParentNode = element.parentNode; var droponOptions = Sortable.options(dropon); if(!Element.isParent(dropon, element)) { var index; var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); var child = null; if(children) { var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); for (index = 0; index < children.length; index += 1) { if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { offset -= Element.offsetSize (children[index], droponOptions.overlap); } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { child = index + 1 < children.length ? children[index + 1] : null; break; } else { child = children[index]; break; } } } dropon.insertBefore(element, child); Sortable.options(oldParentNode).onChange(element); droponOptions.onChange(element); } }, unmark: function() { if(Sortable._marker) Sortable._marker.hide(); }, mark: function(dropon, position) { // mark on ghosting only var sortable = Sortable.options(dropon.parentNode); if(sortable && !sortable.ghosting) return; if(!Sortable._marker) { Sortable._marker = ($('dropmarker') || Element.extend(document.createElement('DIV'))). hide().addClassName('dropmarker').setStyle({position:'absolute'}); document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); } var offsets = Position.cumulativeOffset(dropon); Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); if(position=='after') if(sortable.overlap == 'horizontal') Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); else Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); Sortable._marker.show(); }, _tree: function(element, options, parent) { var children = Sortable.findElements(element, options) || []; for (var i = 0; i < children.length; ++i) { var match = children[i].id.match(options.format); if (!match) continue; var child = { id: encodeURIComponent(match ? match[1] : null), element: element, parent: parent, children: [], position: parent.children.length, container: $(children[i]).down(options.treeTag) } /* Get the element containing the children and recurse over it */ if (child.container) this._tree(child.container, options, child) parent.children.push (child); } return parent; }, tree: function(element) { element = $(element); var sortableOptions = this.options(element); var options = Object.extend({ tag: sortableOptions.tag, treeTag: sortableOptions.treeTag, only: sortableOptions.only, name: element.id, format: sortableOptions.format }, arguments[1] || {}); var root = { id: null, parent: null, children: [], container: element, position: 0 } return Sortable._tree(element, options, root); }, /* Construct a [i] index for a particular node */ _constructIndex: function(node) { var index = ''; do { if (node.id) index = '[' + node.position + ']' + index; } while ((node = node.parent) != null); return index; }, sequence: function(element) { element = $(element); var options = Object.extend(this.options(element), arguments[1] || {}); return $(this.findElements(element, options) || []).map( function(item) { return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; }); }, setSequence: function(element, new_sequence) { element = $(element); var options = Object.extend(this.options(element), arguments[2] || {}); var nodeMap = {}; this.findElements(element, options).each( function(n) { if (n.id.match(options.format)) nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; n.parentNode.removeChild(n); }); new_sequence.each(function(ident) { var n = nodeMap[ident]; if (n) { n[1].appendChild(n[0]); delete nodeMap[ident]; } }); }, serialize: function(element) { element = $(element); var options = Object.extend(Sortable.options(element), arguments[1] || {}); var name = encodeURIComponent( (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); if (options.tree) { return Sortable.tree(element, arguments[1]).children.map( function (item) { return [name + Sortable._constructIndex(item) + "[id]=" + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); }).flatten().join('&'); } else { return Sortable.sequence(element, arguments[1]).map( function(item) { return name + "[]=" + encodeURIComponent(item); }).join('&'); } } } // Returns true if child is contained within element Element.isParent = function(child, element) { if (!child.parentNode || child == element) return false; if (child.parentNode == element) return true; return Element.isParent(child.parentNode, element); } Element.findChildren = function(element, only, recursive, tagName) { if(!element.hasChildNodes()) return null; tagName = tagName.toUpperCase(); if(only) only = [only].flatten(); var elements = []; $A(element.childNodes).each( function(e) { if(e.tagName && e.tagName.toUpperCase()==tagName && (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) elements.push(e); if(recursive) { var grandchildren = Element.findChildren(e, only, recursive, tagName); if(grandchildren) elements.push(grandchildren); } }); return (elements.length>0 ? elements.flatten() : []); } Element.offsetSize = function (element, type) { return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; } _)http://www.mshale.com/scripts/dragdrop.js '() Osbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078%tw#A5>6g#AUo( *+!-.WNS.base[NS.relative_)http://www.mshale.com/scripts/controls.js1234X$classesZ$classname456UNSURLV%NSURLXNSObject_application/x-javascript9:;=>?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:24:57 GMTUbytes_Wed, 17 Sep 2008 20:05:50 GMTU29815WASP.NET_"4cfc7ce8f023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135afoz~  %38GZgly&+.JOSgouOtw// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan) // (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com) // Contributors: // Richard Livsey // Rahul Bhargava // Rob Wills // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ // Autocompleter.Base handles all the autocompletion functionality // that's independent of the data source for autocompletion. This // includes drawing the autocompletion menu, observing keyboard // and mouse events, and similar. // // Specific autocompleters need to provide, at the very least, // a getUpdatedChoices function that will be invoked every time // the text inside the monitored textbox changes. This method // should get the text for which to provide autocompletion by // invoking this.getToken(), NOT by directly accessing // this.element.value. This is to allow incremental tokenized // autocompletion. Specific auto-completion logic (AJAX, etc) // belongs in getUpdatedChoices. // // Tokenized incremental autocompletion is enabled automatically // when an autocompleter is instantiated with the 'tokens' option // in the options parameter, e.g.: // new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); // will incrementally autocomplete with a comma as the token. // Additionally, ',' in the above example can be replaced with // a token array, e.g. { tokens: [',', '\n'] } which // enables autocompletion on multiple tokens. This is most // useful when one of the tokens is \n (a newline), as it // allows smart autocompletion after linebreaks. if(typeof Effect == 'undefined') throw("controls.js requires including script.aculo.us' effects.js library"); var Autocompleter = {} Autocompleter.Base = function() {}; Autocompleter.Base.prototype = { baseInitialize: function(element, update, options) { this.element = $(element); this.update = $(update); this.hasFocus = false; this.changed = false; this.active = false; this.index = 0; this.entryCount = 0; if(this.setOptions) this.setOptions(options); else this.options = options || {}; this.options.paramName = this.options.paramName || this.element.name; this.options.tokens = this.options.tokens || []; this.options.frequency = this.options.frequency || 0.4; this.options.minChars = this.options.minChars || 1; this.options.onShow = this.options.onShow || function(element, update){ if(!update.style.position || update.style.position=='absolute') { update.style.position = 'absolute'; Position.clone(element, update, { setHeight: false, offsetTop: element.offsetHeight }); } Effect.Appear(update,{duration:0.15}); }; this.options.onHide = this.options.onHide || function(element, update){ new Effect.Fade(update,{duration:0.15}) }; if(typeof(this.options.tokens) == 'string') this.options.tokens = new Array(this.options.tokens); this.observer = null; this.element.setAttribute('autocomplete','off'); Element.hide(this.update); Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this)); Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this)); }, show: function() { if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (navigator.userAgent.indexOf('Opera')<0) && (Element.getStyle(this.update, 'position')=='absolute')) { new Insertion.After(this.update, ''); this.iefix = $(this.update.id+'_iefix'); } if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); }, fixIEOverlapping: function() { Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); this.iefix.style.zIndex = 1; this.update.style.zIndex = 2; Element.show(this.iefix); }, hide: function() { this.stopIndicator(); if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); if(this.iefix) Element.hide(this.iefix); }, startIndicator: function() { if(this.options.indicator) Element.show(this.options.indicator); }, stopIndicator: function() { if(this.options.indicator) Element.hide(this.options.indicator); }, onKeyPress: function(event) { if(this.active) switch(event.keyCode) { case Event.KEY_TAB: case Event.KEY_RETURN: this.selectEntry(); Event.stop(event); case Event.KEY_ESC: this.hide(); this.active = false; Event.stop(event); return; case Event.KEY_LEFT: case Event.KEY_RIGHT: return; case Event.KEY_UP: this.markPrevious(); this.render(); if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); return; case Event.KEY_DOWN: this.markNext(); this.render(); if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); return; } else if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return; this.changed = true; this.hasFocus = true; if(this.observer) clearTimeout(this.observer); this.observer = setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); }, activate: function() { this.changed = false; this.hasFocus = true; this.getUpdatedChoices(); }, onHover: function(event) { var element = Event.findElement(event, 'LI'); if(this.index != element.autocompleteIndex) { this.index = element.autocompleteIndex; this.render(); } Event.stop(event); }, onClick: function(event) { var element = Event.findElement(event, 'LI'); this.index = element.autocompleteIndex; this.selectEntry(); this.hide(); }, onBlur: function(event) { // needed to make click events working setTimeout(this.hide.bind(this), 250); this.hasFocus = false; this.active = false; }, render: function() { if(this.entryCount > 0) { for (var i = 0; i < this.entryCount; i++) this.index==i ? Element.addClassName(this.getEntry(i),"selected") : Element.removeClassName(this.getEntry(i),"selected"); if(this.hasFocus) { this.show(); this.active = true; } } else { this.active = false; this.hide(); } }, markPrevious: function() { if(this.index > 0) this.index-- else this.index = this.entryCount-1; this.getEntry(this.index).scrollIntoView(true); }, markNext: function() { if(this.index < this.entryCount-1) this.index++ else this.index = 0; this.getEntry(this.index).scrollIntoView(false); }, getEntry: function(index) { return this.update.firstChild.childNodes[index]; }, getCurrentEntry: function() { return this.getEntry(this.index); }, selectEntry: function() { this.active = false; this.updateElement(this.getCurrentEntry()); }, updateElement: function(selectedElement) { if (this.options.updateElement) { this.options.updateElement(selectedElement); return; } var value = ''; if (this.options.select) { var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); } else value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); var lastTokenPos = this.findLastToken(); if (lastTokenPos != -1) { var newValue = this.element.value.substr(0, lastTokenPos + 1); var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/); if (whitespace) newValue += whitespace[0]; this.element.value = newValue + value; } else { this.element.value = value; } this.element.focus(); if (this.options.afterUpdateElement) this.options.afterUpdateElement(this.element, selectedElement); }, updateChoices: function(choices) { if(!this.changed && this.hasFocus) { this.update.innerHTML = choices; Element.cleanWhitespace(this.update); Element.cleanWhitespace(this.update.down()); if(this.update.firstChild && this.update.down().childNodes) { this.entryCount = this.update.down().childNodes.length; for (var i = 0; i < this.entryCount; i++) { var entry = this.getEntry(i); entry.autocompleteIndex = i; this.addObservers(entry); } } else { this.entryCount = 0; } this.stopIndicator(); this.index = 0; if(this.entryCount==1 && this.options.autoSelect) { this.selectEntry(); this.hide(); } else { this.render(); } } }, addObservers: function(element) { Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); Event.observe(element, "click", this.onClick.bindAsEventListener(this)); }, onObserverEvent: function() { this.changed = false; if(this.getToken().length>=this.options.minChars) { this.startIndicator(); this.getUpdatedChoices(); } else { this.active = false; this.hide(); } }, getToken: function() { var tokenPos = this.findLastToken(); if (tokenPos != -1) var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,''); else var ret = this.element.value; return /\n/.test(ret) ? '' : ret; }, findLastToken: function() { var lastTokenPos = -1; for (var i=0; i lastTokenPos) lastTokenPos = thisTokenPos; } return lastTokenPos; } } Ajax.Autocompleter = Class.create(); Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { initialize: function(element, update, url, options) { this.baseInitialize(element, update, options); this.options.asynchronous = true; this.options.onComplete = this.onComplete.bind(this); this.options.defaultParams = this.options.parameters || null; this.url = url; }, getUpdatedChoices: function() { entry = encodeURIComponent(this.options.paramName) + '=' + encodeURIComponent(this.getToken()); this.options.parameters = this.options.callback ? this.options.callback(this.element, entry) : entry; if(this.options.defaultParams) this.options.parameters += '&' + this.options.defaultParams; new Ajax.Request(this.url, this.options); }, onComplete: function(request) { this.updateChoices(request.responseText); } }); // The local array autocompleter. Used when you'd prefer to // inject an array of autocompletion options into the page, rather // than sending out Ajax queries, which can be quite slow sometimes. // // The constructor takes four parameters. The first two are, as usual, // the id of the monitored textbox, and id of the autocompletion menu. // The third is the array you want to autocomplete from, and the fourth // is the options block. // // Extra local autocompletion options: // - choices - How many autocompletion choices to offer // // - partialSearch - If false, the autocompleter will match entered // text only at the beginning of strings in the // autocomplete array. Defaults to true, which will // match text at the beginning of any *word* in the // strings in the autocomplete array. If you want to // search anywhere in the string, additionally set // the option fullSearch to true (default: off). // // - fullSsearch - Search anywhere in autocomplete array strings. // // - partialChars - How many characters to enter before triggering // a partial match (unlike minChars, which defines // how many characters are required to do any match // at all). Defaults to 2. // // - ignoreCase - Whether to ignore case when autocompleting. // Defaults to true. // // It's possible to pass in a custom function as the 'selector' // option, if you prefer to write your own autocompletion logic. // In that case, the other options above will not apply unless // you support them. Autocompleter.Local = Class.create(); Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { initialize: function(element, update, array, options) { this.baseInitialize(element, update, options); this.options.array = array; }, getUpdatedChoices: function() { this.updateChoices(this.options.selector(this)); }, setOptions: function(options) { this.options = Object.extend({ choices: 10, partialSearch: true, partialChars: 2, ignoreCase: true, fullSearch: false, selector: function(instance) { var ret = []; // Beginning matches var partial = []; // Inside matches var entry = instance.getToken(); var count = 0; for (var i = 0; i < instance.options.array.length && ret.length < instance.options.choices ; i++) { var elem = instance.options.array[i]; var foundPos = instance.options.ignoreCase ? elem.toLowerCase().indexOf(entry.toLowerCase()) : elem.indexOf(entry); while (foundPos != -1) { if (foundPos == 0 && elem.length != entry.length) { ret.push("
  • " + elem.substr(0, entry.length) + "" + elem.substr(entry.length) + "
  • "); break; } else if (entry.length >= instance.options.partialChars && instance.options.partialSearch && foundPos != -1) { if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { partial.push("
  • " + elem.substr(0, foundPos) + "" + elem.substr(foundPos, entry.length) + "" + elem.substr( foundPos + entry.length) + "
  • "); break; } } foundPos = instance.options.ignoreCase ? elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : elem.indexOf(entry, foundPos + 1); } } if (partial.length) ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) return "
      " + ret.join('') + "
    "; } }, options || {}); } }); // AJAX in-place editor // // see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor // Use this if you notice weird scrolling problems on some browsers, // the DOM might be a bit confused when this gets called so do this // waits 1 ms (with setTimeout) until it does the activation Field.scrollFreeActivate = function(field) { setTimeout(function() { Field.activate(field); }, 1); } Ajax.InPlaceEditor = Class.create(); Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99"; Ajax.InPlaceEditor.prototype = { initialize: function(element, url, options) { this.url = url; this.element = $(element); this.options = Object.extend({ paramName: "value", okButton: true, okText: "ok", cancelLink: true, cancelText: "cancel", savingText: "Saving...", clickToEditText: "Click to edit", okText: "ok", rows: 1, onComplete: function(transport, element) { new Effect.Highlight(element, {startcolor: this.options.highlightcolor}); }, onFailure: function(transport) { alert("Error communicating with the server: " + transport.responseText.stripTags()); }, callback: function(form) { return Form.serialize(form); }, handleLineBreaks: true, loadingText: 'Loading...', savingClassName: 'inplaceeditor-saving', loadingClassName: 'inplaceeditor-loading', formClassName: 'inplaceeditor-form', highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor, highlightendcolor: "#FFFFFF", externalControl: null, submitOnBlur: false, ajaxOptions: {}, evalScripts: false }, options || {}); if(!this.options.formId && this.element.id) { this.options.formId = this.element.id + "-inplaceeditor"; if ($(this.options.formId)) { // there's already a form with that name, don't specify an id this.options.formId = null; } } if (this.options.externalControl) { this.options.externalControl = $(this.options.externalControl); } this.originalBackground = Element.getStyle(this.element, 'background-color'); if (!this.originalBackground) { this.originalBackground = "transparent"; } this.element.title = this.options.clickToEditText; this.onclickListener = this.enterEditMode.bindAsEventListener(this); this.mouseoverListener = this.enterHover.bindAsEventListener(this); this.mouseoutListener = this.leaveHover.bindAsEventListener(this); Event.observe(this.element, 'click', this.onclickListener); Event.observe(this.element, 'mouseover', this.mouseoverListener); Event.observe(this.element, 'mouseout', this.mouseoutListener); if (this.options.externalControl) { Event.observe(this.options.externalControl, 'click', this.onclickListener); Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener); Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener); } }, enterEditMode: function(evt) { if (this.saving) return; if (this.editing) return; this.editing = true; this.onEnterEditMode(); if (this.options.externalControl) { Element.hide(this.options.externalControl); } Element.hide(this.element); this.createForm(); this.element.parentNode.insertBefore(this.form, this.element); if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField); // stop the event to avoid a page refresh in Safari if (evt) { Event.stop(evt); } return false; }, createForm: function() { this.form = document.createElement("form"); this.form.id = this.options.formId; Element.addClassName(this.form, this.options.formClassName) this.form.onsubmit = this.onSubmit.bind(this); this.createEditField(); if (this.options.textarea) { var br = document.createElement("br"); this.form.appendChild(br); } if (this.options.okButton) { okButton = document.createElement("input"); okButton.type = "submit"; okButton.value = this.options.okText; okButton.className = 'editor_ok_button'; this.form.appendChild(okButton); } if (this.options.cancelLink) { cancelLink = document.createElement("a"); cancelLink.href = "#"; cancelLink.appendChild(document.createTextNode(this.options.cancelText)); cancelLink.onclick = this.onclickCancel.bind(this); cancelLink.className = 'editor_cancel'; this.form.appendChild(cancelLink); } }, hasHTMLLineBreaks: function(string) { if (!this.options.handleLineBreaks) return false; return string.match(/
    /i); }, convertHTMLLineBreaks: function(string) { return string.replace(/
    /gi, "\n").replace(//gi, "\n").replace(/<\/p>/gi, "\n").replace(/

    /gi, ""); }, createEditField: function() { var text; if(this.options.loadTextURL) { text = this.options.loadingText; } else { text = this.getText(); } var obj = this; if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) { this.options.textarea = false; var textField = document.createElement("input"); textField.obj = this; textField.type = "text"; textField.name = this.options.paramName; textField.value = text; textField.style.backgroundColor = this.options.highlightcolor; textField.className = 'editor_field'; var size = this.options.size || this.options.cols || 0; if (size != 0) textField.size = size; if (this.options.submitOnBlur) textField.onblur = this.onSubmit.bind(this); this.editField = textField; } else { this.options.textarea = true; var textArea = document.createElement("textarea"); textArea.obj = this; textArea.name = this.options.paramName; textArea.value = this.convertHTMLLineBreaks(text); textArea.rows = this.options.rows; textArea.cols = this.options.cols || 40; textArea.className = 'editor_field'; if (this.options.submitOnBlur) textArea.onblur = this.onSubmit.bind(this); this.editField = textArea; } if(this.options.loadTextURL) { this.loadExternalText(); } this.form.appendChild(this.editField); }, getText: function() { return this.element.innerHTML; }, loadExternalText: function() { Element.addClassName(this.form, this.options.loadingClassName); this.editField.disabled = true; new Ajax.Request( this.options.loadTextURL, Object.extend({ asynchronous: true, onComplete: this.onLoadedExternalText.bind(this) }, this.options.ajaxOptions) ); }, onLoadedExternalText: function(transport) { Element.removeClassName(this.form, this.options.loadingClassName); this.editField.disabled = false; this.editField.value = transport.responseText.stripTags(); Field.scrollFreeActivate(this.editField); }, onclickCancel: function() { this.onComplete(); this.leaveEditMode(); return false; }, onFailure: function(transport) { this.options.onFailure(transport); if (this.oldInnerHTML) { this.element.innerHTML = this.oldInnerHTML; this.oldInnerHTML = null; } return false; }, onSubmit: function() { // onLoading resets these so we need to save them away for the Ajax call var form = this.form; var value = this.editField.value; // do this first, sometimes the ajax call returns before we get a chance to switch on Saving... // which means this will actually switch on Saving... *after* we've left edit mode causing Saving... // to be displayed indefinitely this.onLoading(); if (this.options.evalScripts) { new Ajax.Request( this.url, Object.extend({ parameters: this.options.callback(form, value), onComplete: this.onComplete.bind(this), onFailure: this.onFailure.bind(this), asynchronous:true, evalScripts:true }, this.options.ajaxOptions)); } else { new Ajax.Updater( { success: this.element, // don't update on failure (this could be an option) failure: null }, this.url, Object.extend({ parameters: this.options.callback(form, value), onComplete: this.onComplete.bind(this), onFailure: this.onFailure.bind(this) }, this.options.ajaxOptions)); } // stop the event to avoid a page refresh in Safari if (arguments.length > 1) { Event.stop(arguments[0]); } return false; }, onLoading: function() { this.saving = true; this.removeForm(); this.leaveHover(); this.showSaving(); }, showSaving: function() { this.oldInnerHTML = this.element.innerHTML; this.element.innerHTML = this.options.savingText; Element.addClassName(this.element, this.options.savingClassName); this.element.style.backgroundColor = this.originalBackground; Element.show(this.element); }, removeForm: function() { if(this.form) { if (this.form.parentNode) Element.remove(this.form); this.form = null; } }, enterHover: function() { if (this.saving) return; this.element.style.backgroundColor = this.options.highlightcolor; if (this.effect) { this.effect.cancel(); } Element.addClassName(this.element, this.options.hoverClassName) }, leaveHover: function() { if (this.options.backgroundColor) { this.element.style.backgroundColor = this.oldBackground; } Element.removeClassName(this.element, this.options.hoverClassName) if (this.saving) return; this.effect = new Effect.Highlight(this.element, { startcolor: this.options.highlightcolor, endcolor: this.options.highlightendcolor, restorecolor: this.originalBackground }); }, leaveEditMode: function() { Element.removeClassName(this.element, this.options.savingClassName); this.removeForm(); this.leaveHover(); this.element.style.backgroundColor = this.originalBackground; Element.show(this.element); if (this.options.externalControl) { Element.show(this.options.externalControl); } this.editing = false; this.saving = false; this.oldInnerHTML = null; this.onLeaveEditMode(); }, onComplete: function(transport) { this.leaveEditMode(); this.options.onComplete.bind(this)(transport, this.element); }, onEnterEditMode: function() {}, onLeaveEditMode: function() {}, dispose: function() { if (this.oldInnerHTML) { this.element.innerHTML = this.oldInnerHTML; } this.leaveEditMode(); Event.stopObserving(this.element, 'click', this.onclickListener); Event.stopObserving(this.element, 'mouseover', this.mouseoverListener); Event.stopObserving(this.element, 'mouseout', this.mouseoutListener); if (this.options.externalControl) { Event.stopObserving(this.options.externalControl, 'click', this.onclickListener); Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener); Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener); } } }; Ajax.InPlaceCollectionEditor = Class.create(); Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype); Object.extend(Ajax.InPlaceCollectionEditor.prototype, { createEditField: function() { if (!this.cached_selectTag) { var selectTag = document.createElement("select"); var collection = this.options.collection || []; var optionTag; collection.each(function(e,i) { optionTag = document.createElement("option"); optionTag.value = (e instanceof Array) ? e[0] : e; if((typeof this.options.value == 'undefined') && ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true; if(this.options.value==optionTag.value) optionTag.selected = true; optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e)); selectTag.appendChild(optionTag); }.bind(this)); this.cached_selectTag = selectTag; } this.editField = this.cached_selectTag; if(this.options.loadTextURL) this.loadExternalText(); this.form.appendChild(this.editField); this.options.callback = function(form, value) { return "value=" + encodeURIComponent(value); } } }); // Delayed observer, like Form.Element.Observer, // but waits for delay after last key input // Ideal for live-search fields Form.Element.DelayedObserver = Class.create(); Form.Element.DelayedObserver.prototype = { initialize: function(element, delay, callback) { this.delay = delay || 0.5; this.element = $(element); this.callback = callback; this.timer = null; this.lastValue = $F(this.element); Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); }, delayedListener: function(event) { if(this.lastValue == $F(this.element)) return; if(this.timer) clearTimeout(this.timer); this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); this.lastValue = $F(this.element); }, onTimerEvent: function() { this.timer = null; this.callback(this.element, $F(this.element)); } }; _)http://www.mshale.com/scripts/controls.js +,- Oqbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 10 Nov 2007 23:25:11 GMTUbytes_Wed, 17 Sep 2008 20:05:52 GMTU10680WASP.NET_"283a97f0f023c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135_dmx|  #16EXejw$),HMQeosO)// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 // Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ if(!Control) var Control = {}; Control.Slider = Class.create(); // options: // axis: 'vertical', or 'horizontal' (default) // // callbacks: // onChange(value) // onSlide(value) Control.Slider.prototype = { initialize: function(handle, track, options) { var slider = this; if(handle instanceof Array) { this.handles = handle.collect( function(e) { return $(e) }); } else { this.handles = [$(handle)]; } this.track = $(track); this.options = options || {}; this.axis = this.options.axis || 'horizontal'; this.increment = this.options.increment || 1; this.step = parseInt(this.options.step || '1'); this.range = this.options.range || $R(0,1); this.value = 0; // assure backwards compat this.values = this.handles.map( function() { return 0 }); this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; this.options.startSpan = $(this.options.startSpan || null); this.options.endSpan = $(this.options.endSpan || null); this.restricted = this.options.restricted || false; this.maximum = this.options.maximum || this.range.end; this.minimum = this.options.minimum || this.range.start; // Will be used to align the handle onto the track, if necessary this.alignX = parseInt(this.options.alignX || '0'); this.alignY = parseInt(this.options.alignY || '0'); this.trackLength = this.maximumOffset() - this.minimumOffset(); this.handleLength = this.isVertical() ? (this.handles[0].offsetHeight != 0 ? this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : this.handles[0].style.width.replace(/px$/,"")); this.active = false; this.dragging = false; this.disabled = false; if(this.options.disabled) this.setDisabled(); // Allowed values array this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; if(this.allowedValues) { this.minimum = this.allowedValues.min(); this.maximum = this.allowedValues.max(); } this.eventMouseDown = this.startDrag.bindAsEventListener(this); this.eventMouseUp = this.endDrag.bindAsEventListener(this); this.eventMouseMove = this.update.bindAsEventListener(this); // Initialize handles in reverse (make sure first handle is active) this.handles.each( function(h,i) { i = slider.handles.length-1-i; slider.setValue(parseFloat( (slider.options.sliderValue instanceof Array ? slider.options.sliderValue[i] : slider.options.sliderValue) || slider.range.start), i); Element.makePositioned(h); // fix IE Event.observe(h, "mousedown", slider.eventMouseDown); }); Event.observe(this.track, "mousedown", this.eventMouseDown); Event.observe(document, "mouseup", this.eventMouseUp); Event.observe(document, "mousemove", this.eventMouseMove); this.initialized = true; }, dispose: function() { var slider = this; Event.stopObserving(this.track, "mousedown", this.eventMouseDown); Event.stopObserving(document, "mouseup", this.eventMouseUp); Event.stopObserving(document, "mousemove", this.eventMouseMove); this.handles.each( function(h) { Event.stopObserving(h, "mousedown", slider.eventMouseDown); }); }, setDisabled: function(){ this.disabled = true; }, setEnabled: function(){ this.disabled = false; }, getNearestValue: function(value){ if(this.allowedValues){ if(value >= this.allowedValues.max()) return(this.allowedValues.max()); if(value <= this.allowedValues.min()) return(this.allowedValues.min()); var offset = Math.abs(this.allowedValues[0] - value); var newValue = this.allowedValues[0]; this.allowedValues.each( function(v) { var currentOffset = Math.abs(v - value); if(currentOffset <= offset){ newValue = v; offset = currentOffset; } }); return newValue; } if(value > this.range.end) return this.range.end; if(value < this.range.start) return this.range.start; return value; }, setValue: function(sliderValue, handleIdx){ if(!this.active) { this.activeHandleIdx = handleIdx || 0; this.activeHandle = this.handles[this.activeHandleIdx]; this.updateStyles(); } handleIdx = handleIdx || this.activeHandleIdx || 0; if(this.initialized && this.restricted) { if((handleIdx>0) && (sliderValuethis.values[handleIdx+1])) sliderValue = this.values[handleIdx+1]; } sliderValue = this.getNearestValue(sliderValue); this.values[handleIdx] = sliderValue; this.value = this.values[0]; // assure backwards compat this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = this.translateToPx(sliderValue); this.drawSpans(); if(!this.dragging || !this.event) this.updateFinished(); }, setValueBy: function(delta, handleIdx) { this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, handleIdx || this.activeHandleIdx || 0); }, translateToPx: function(value) { return Math.round( ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * (value - this.range.start)) + "px"; }, translateToValue: function(offset) { return ((offset/(this.trackLength-this.handleLength) * (this.range.end-this.range.start)) + this.range.start); }, getRange: function(range) { var v = this.values.sortBy(Prototype.K); range = range || 0; return $R(v[range],v[range+1]); }, minimumOffset: function(){ return(this.isVertical() ? this.alignY : this.alignX); }, maximumOffset: function(){ return(this.isVertical() ? (this.track.offsetHeight != 0 ? this.track.offsetHeight : this.track.style.height.replace(/px$/,"")) - this.alignY : (this.track.offsetWidth != 0 ? this.track.offsetWidth : this.track.style.width.replace(/px$/,"")) - this.alignY); }, isVertical: function(){ return (this.axis == 'vertical'); }, drawSpans: function() { var slider = this; if(this.spans) $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); if(this.options.startSpan) this.setSpan(this.options.startSpan, $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); if(this.options.endSpan) this.setSpan(this.options.endSpan, $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); }, setSpan: function(span, range) { if(this.isVertical()) { span.style.top = this.translateToPx(range.start); span.style.height = this.translateToPx(range.end - range.start + this.range.start); } else { span.style.left = this.translateToPx(range.start); span.style.width = this.translateToPx(range.end - range.start + this.range.start); } }, updateStyles: function() { this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); Element.addClassName(this.activeHandle, 'selected'); }, startDrag: function(event) { if(Event.isLeftClick(event)) { if(!this.disabled){ this.active = true; var handle = Event.element(event); var pointer = [Event.pointerX(event), Event.pointerY(event)]; var track = handle; if(track==this.track) { var offsets = Position.cumulativeOffset(this.track); this.event = event; this.setValue(this.translateToValue( (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) )); var offsets = Position.cumulativeOffset(this.activeHandle); this.offsetX = (pointer[0] - offsets[0]); this.offsetY = (pointer[1] - offsets[1]); } else { // find the handle (prevents issues with Safari) while((this.handles.indexOf(handle) == -1) && handle.parentNode) handle = handle.parentNode; if(this.handles.indexOf(handle)!=-1) { this.activeHandle = handle; this.activeHandleIdx = this.handles.indexOf(this.activeHandle); this.updateStyles(); var offsets = Position.cumulativeOffset(this.activeHandle); this.offsetX = (pointer[0] - offsets[0]); this.offsetY = (pointer[1] - offsets[1]); } } } Event.stop(event); } }, update: function(event) { if(this.active) { if(!this.dragging) this.dragging = true; this.draw(event); // fix AppleWebKit rendering if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); Event.stop(event); } }, draw: function(event) { var pointer = [Event.pointerX(event), Event.pointerY(event)]; var offsets = Position.cumulativeOffset(this.track); pointer[0] -= this.offsetX + offsets[0]; pointer[1] -= this.offsetY + offsets[1]; this.event = event; this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); if(this.initialized && this.options.onSlide) this.options.onSlide(this.values.length>1 ? this.values : this.value, this); }, endDrag: function(event) { if(this.active && this.dragging) { this.finishDrag(event, true); Event.stop(event); } this.active = false; this.dragging = false; }, finishDrag: function(event, success) { this.active = false; this.dragging = false; this.updateFinished(); }, updateFinished: function() { if(this.initialized && this.options.onChange) this.options.onChange(this.values.length>1 ? this.values : this.value, this); this.event = null; } }_'http://www.mshale.com/scripts/slider.js /012Ombplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-ModifiedZConnection]Accept-RangesTDate^Content-LengthTEtag\Content-TypeUX-Cf1_CFEngine 7.1-a _Wed, 21 Nov 2007 14:36:27 GMTZkeep-aliveUbytes_Wed, 17 Sep 2008 20:05:53 GMTS726_""157da8490acfc9b9cc5ac946fdaee4af"ZfD.lax1:hf12fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135dir}!/4CHU[m#&BGK_pmO#addthis_services { background-color: #FFFFFF; } #addthis_services a { padding: 0px 0px 0px 4px; color:#333333; display: block; font-weight: normal; } #addthis_dropdown a:hover { background-color: #F5F5F5; } #addthis_dropdown a { text-decoration: none; font-family:Geneva, Arial, Helvetica, sans-serif; font-size: 12px; } #addthis_dropdown img { border:none; vertical-align:middle; width: 16px; height: 16px; } #addthis_dropdown { z-index: 1000000; text-align: left; width: 230px; position: absolute; display: none; border: #CCCCCC solid 1px; padding: 1px 1px 0px 1px; overflow: hidden; background-color: #FFFFFF; font-family:Geneva, Arial, Helvetica, sans-serif; } _,http://s7.addthis.com/css/addthis_widget.cssXtext/css 456 O}bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 17 Nov 2007 18:49:44 GMTUbytes_Wed, 17 Sep 2008 20:05:52 GMTT8321WASP.NET_"7ef3899e4a29c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135lqz   "0>CRerw  #058TY]qoO //v1.7 // Flash Player Version Detection // Detect Client Browser type // Copyright 2005-2007 Adobe Systems Incorporated. All rights reserved. var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false; var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false; var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false; function ControlVersion() { var version; var axo; var e; // NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry try { // version will be set for 7.X or greater players axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); version = axo.GetVariable("$version"); } catch (e) { } if (!version) { try { // version will be set for 6.X players only axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); // installed player is some revision of 6.0 // GetVariable("$version") crashes for versions 6.0.22 through 6.0.29, // so we have to be careful. // default to the first public version version = "WIN 6,0,21,0"; // throws if AllowScripAccess does not exist (introduced in 6.0r47) axo.AllowScriptAccess = "always"; // safe to call for 6.0r47 or greater version = axo.GetVariable("$version"); } catch (e) { } } if (!version) { try { // version will be set for 4.X or 5.X player axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); version = axo.GetVariable("$version"); } catch (e) { } } if (!version) { try { // version will be set for 3.X player axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); version = "WIN 3,0,18,0"; } catch (e) { } } if (!version) { try { // version will be set for 2.X player axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); version = "WIN 2,0,0,11"; } catch (e) { version = -1; } } return version; } // JavaScript helper required to detect Flash Player PlugIn version information function GetSwfVer(){ // NS/Opera version >= 3 check for Flash plugin in plugin array var flashVer = -1; if (navigator.plugins != null && navigator.plugins.length > 0) { if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) { var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : ""; var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description; var descArray = flashDescription.split(" "); var tempArrayMajor = descArray[2].split("."); var versionMajor = tempArrayMajor[0]; var versionMinor = tempArrayMajor[1]; var versionRevision = descArray[3]; if (versionRevision == "") { versionRevision = descArray[4]; } if (versionRevision[0] == "d") { versionRevision = versionRevision.substring(1); } else if (versionRevision[0] == "r") { versionRevision = versionRevision.substring(1); if (versionRevision.indexOf("d") > 0) { versionRevision = versionRevision.substring(0, versionRevision.indexOf("d")); } } var flashVer = versionMajor + "." + versionMinor + "." + versionRevision; } } // MSN/WebTV 2.6 supports Flash 4 else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4; // WebTV 2.5 supports Flash 3 else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3; // older WebTV supports Flash 2 else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2; else if ( isIE && isWin && !isOpera ) { flashVer = ControlVersion(); } return flashVer; } // When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision) { versionStr = GetSwfVer(); if (versionStr == -1 ) { return false; } else if (versionStr != 0) { if(isIE && isWin && !isOpera) { // Given "WIN 2,0,0,11" tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"] tempString = tempArray[1]; // "2,0,0,11" versionArray = tempString.split(","); // ['2', '0', '0', '11'] } else { versionArray = versionStr.split("."); } var versionMajor = versionArray[0]; var versionMinor = versionArray[1]; var versionRevision = versionArray[2]; // is the major.revision >= requested major.revision AND the minor version >= requested minor if (versionMajor > parseFloat(reqMajorVer)) { return true; } else if (versionMajor == parseFloat(reqMajorVer)) { if (versionMinor > parseFloat(reqMinorVer)) return true; else if (versionMinor == parseFloat(reqMinorVer)) { if (versionRevision >= parseFloat(reqRevision)) return true; } } return false; } } function AC_AddExtension(src, ext) { if (src.indexOf('?') != -1) return src.replace(/\?/, ext+'?'); else return src + ext; } function AC_Generateobj(objAttrs, params, embedAttrs) { var str = ''; if (isIE && isWin && !isOpera) { str += ' '; } str += ''; } else { str += '?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Thu, 03 Apr 2008 19:30:48 GMTUbytes_Wed, 17 Sep 2008 20:05:52 GMTT7485WASP.NET_"ecbfa37c195c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135kpy ,1@S`er"%AFJ^olO=GIF89aP      " &#$)&'*'(,)*0./2/0523866:78=;<@=>B?@DBCHFGJGHMKLPNOROPTRSYVWZWX\Z[`^_b_`dbcifgighmkkpnoqopqpoussxvwzwx|{{  " &$)(.,21638275:9>=CAFEJINMRQVUYX[V[Z^]bafgjimmqrvuyy|vz{~}₅ㆉ䊍发撕痚癜藛蛝螡ꤦꦨ몭쮰ﺼ!,P 3P0 Tha…Lx0"C *H1FnbC&Kqɂ'It`H#aNlC칓HB̩Q)PM>xQjGҜiSkL2~t*װFV-{jW[:m{vn\@*t/ܱYnt"6vT6E#aBʕ-c,ٲOˠC8eϞŔqsѰckNM_6 ڵ٨[wh- R 󅷡>\bt͗[g:]߹g]x׫]zk??{ÛO~wG`yX-= A(r%7Ӈ ($h(y0("U+Ҩ)∢'h%I#9cF$K~Y0>)֋R>v op +`)dihlp)tix|矀*蠄 'ldhRiFjf&iIjbʦ&ʚ&Zg+*l"avBFd|Vkfvʳb4覫[g'a!￙ l'~B G,Wl (ǩv,r&*&{Ǡ2#10|VBT@x-IB ]\x> ^w1LJ:lzPC^ f%Nz]dd2^`dX>IRLd#0 ~̥D!)uh=^瞂W%oz@!(/@x^|dsRry2NNNꔧD'*Px` Sa:4}C')͔R0E ,L8ʩ)7Ov'@*GS1y8wp2! KDv"`%XCa عD[*H=CVDt"1ͫ^s +H|g@WI35B $ @ @*+e:jF|A86 CPpPV}@\P?}h:qTr*,{t)<.(`'Gd`4S'0 `q |W79`h+Y*2L`/bA@w[KwcVqo'̀,u(NfʀBtA\>C Ng*V4w" &1QprC꾐Z fp3sd jh &q38 LxsU6 Nx > L̺YЀ ?a`z9i} :a@uV6X@bNЈ4RczJݺ/jRxQճqw+XD s2 @A804"!)vrCw3y+r@27Dq ^YH5t"dX D(Oyy(j,PU@al@ITla| @NAX\5pԻќ1JJe*Dݺ^ -! ]l@%X7Ѭ۽]3}8!eJh<1NّRYd$Z|I_@ps cd̐b*YOeR-d$T=+ i :wPu1y!Csp@C`ֽ^lpZ1 n.P$Z3~d0 틂FhEWuG|BOu|q@;b @sT} u~g ((yby=;`rc b_c ~a @v p7HG{%DMr';@s 8TH(&p<1fPrSx;pFypgy 0/cpS" pOxgt` !C~cg8ATpzX8tw〒 w “SbmxcJE~ ~Mᄇ*) }HH{M8cPFG0x>Sl(' x7z76cPF#1j@mdFC.\ަ&&F`yq  uvF8{kM@f2s`vӸ y&\c0Mt P:&jg9`gpgdc npHzv?p Q 9S ,C;XM&)yn?c^p8>Y[=e&EZ20) o@\% Jf4 ,v;K-&ِ3q`; k_ {`x)_ `[@RrY&ty1) k`U[rz:I&+eo@>|8Åp_S5'ԙbEN?%. X&cy g{3d P g0+(ctak P:!7Ɣ*<9:@D<ʜC9};ՙ8:xhHV*ePu)&^YtSPL-9&;mKgn~x7 :G 6b'*+`&,C-ɪ oqJ,+#@LJEReWykTzġ c ɥZ'F&PY`LwYKm*&83v4&|;od?0(WT:F&\`S] r@ͺL7I3J&[3I͂-ԫavE){ RGM d ?ԅy +jB[pj@3(=m˱L M 1'=„;]زZZ" ~b I!7&a*!Hved%sTtyb7y[{eDQԓaw7D00LsT jer%; 0jb^mdP&-PL 0@[fJ o!зbK~+˻ CKU)MR^Zɑk" P}(*, o_)aص$P : rGV`w7.[x nĀ?ef v^ &f09Jb),|_0&n +&PtZp6誎&D+ijaD캥5tY > 0{2Ǟ PG) d00L~|W|?PnوUF٩xo6 c|\p pWarTYpz '@JRyU Z@c   XD`Pg,[p  `[T*|E/  S?`K:`a`f , Tt5Y34 ; \P`lJJ`E:@PSðE36=wYkj|U ?˖I =''zbS/Z[ӳ:  $@ð,Em?*A^>Nz_S]yŶì iEp ,P[cj1=d 8}`'(_ 0:#PFM<&%-6_?z79<"pX6` \\\+F?d\y^^H*\*\8c9`Aa&fbV[y9'M9ZbЩ]ړ `T<d0 q D^]IppbpgZ\ge[fH\+ ,qbY5UYj]fUf"k'o.g'k4n>@7)3 `Ǭ -PƚRL| ʝ0 {~븞'+zf;c#^g=nK*뼾FFX>^^@z{{@n|N~^o  x@ > C:*:-7p.(6o2-0?1:78p*oG7?992:; ;O/J6?F/YFO]`0VO=QH:3P@|002>0C8=<6EB?7=`C8o3G0o?667/E9-?.h4@C@6/7oE@?=06//CO1}_ EnO9U9P` MMEfDɍ)Q>uU,_ƜYfΝ=ZhҥMFZj֭][lڵe*c3^d O,ÒIƓZ20a d? O%){T ;OzPUMbd'Pi'!:` "Ja B䢡 I"6ݼƒ=*&T*.)oψ9UbD:" fHKa !'6)J+2K-K/WC|#3!#@>|C@@v!lVA?譔*V==61΄x $ !E+`(R1>Xe#hdN:?(eVC#&c&fx8!D$bH=xV^'i^gqQgB%/ҐDd" U‘d#9IJ>Ĥ%#INR&%L~(OIUD"e9KZҖe.uK^җf049LbӘDf2Lf6әτf49MjVӚf6Mnvӛg89Nr4;_3http://www.mshale.com/Media/7/gif/2008/4/header.gifYimage/gif =>?;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Fri, 07 Dec 2007 23:09:31 GMTUbytes_Wed, 17 Sep 2008 20:05:52 GMTT1043WASP.NET_"1263f392639c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135  "$&(*,.0246=KY^m#'=JORnswoOGIF89aDf"DU@DY@YHp"`;7L0gPb]UO0ppn v {0c}@00а`L0@p*r0> u`E Pp\@3]0ʰ`@V0`,HAXȰÇ $$ŋ3V, Qa 0H -lHQKTTtR.$ C)\HN >8cP&@HP U[bA ^᥏,fAHx!Kv M ,8A84@r&8A#ȋ7YÆ8p"oH@aC YoƒУ @س;_`http://www.mshale.com/Monarch/Widgets/ArticleWidgets/SidebarWidgets/NewsbarWidget/Images/rss.gif ABC;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Wed, 25 Apr 2007 22:49:49 GMTUbytes_Wed, 17 Sep 2008 20:05:52 GMTS162WASP.NET_"82db9578c87c71:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd".024  ')+-/13579;BP^cr "'+ANSVrw{oOGIF89a ⩩wwwggg! , OBS dpW!9EG4ފ6.sah2H::3l\Oy@, s;_fhttp://www.mshale.com/Monarch/Styles/ClassicNewsPortal/StylingImages/Mshale_Mshale_Default/envelop.gif EFG;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Wed, 25 Apr 2007 22:49:50 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTS170WASP.NET_"3ae4b88c87c71:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd".024  ')+-/13579;BP^cr !&*@MRUqvzoOGIF89aεwwwoooggg! ,Wpd5I `pf 9~+*wA|/4;F jV,kQDgx?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Tue, 19 Aug 2008 15:40:49 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTU15313WASP.NET_"dc3a6bf4112c91:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135 !#%'.<JO^q~/<AD`ei}oO;JFIF``C     C   " D!1A"Qa2q#BRb$34r 5T6!1AQaq"#2BR34 ?k'U;n@qe2Gi V)!ӬV*xSkB:\IqNlB e"PZJӨish.5Zk j4-Җ lX1UMB4Ru,=$eҭo,2%WM V}(g [mrG1$ȔJBoRMV 8)-AOPt) RWbtԐڬ]rqv!>J)qR2!9w7ū\6s@+iGFLNme=%ܩ J55=/O]pC/pRA=*3fO!ݽ>gh3+PX25UA$ԫ_oS5FFrm=̧FhБ:3#:VRw%mW.R3ճi ArTn*2Į?NG' NG@R,:\WW; IEa1$_sLO'B(ͶO-*Ry(4zb5Ḗd2(6ES}c_Jg溍1)SGef_cm :>w2Oq2-eU) .Cz UfIK3ŹˠE8[5,=a'E\ŲNLFG)yOvf$k6(dfyU%JA->=v DsաwlsVs<6VY:W7[ަӑ>=hS&j j5TGD/N `^zFM̙^B0ICN76nB*0M2 d$|D! R5$i7kbٟTIkyJВ b)%Ync - %ZBJ΀b[O\X4P2q[$qSDH#Ų EmRa/H:H ZYw' Ifo!AV i _C kcN6hR]sꐨ&I9rZ]JF?6y*C]z""7R!JR/Bgncv 9N:SҝJY'zk~ZM& bMVtl[eŐ66jzZiBTsc|n{H<ם^*IRT0LHv3Na@/ʀaBB/ta>}?!)Lk4ѤHH`:BcКhKmIEҴSGi #IJJt+(HURZ'@VnÃ[IY_ڢx}tPvsN^uM|W^`a-F I,m|YJNV[~lI ox4mJq */,Je)KSau:I?8z hm5Sn[q!/PFRv;MDą0'RP @b)\BmHq)(t#' *07{Bݬ1-M#x 6}Mg&!Y)Vsk '|MyK.H"lyLVisa ft얃EOE@ d=G6JܵoNN~qM P:W+9c뫒 夜g(-W(ҭr+uv>Fb1?&9l(v0 viC4Y-#Wi i*2m Lg1u$ԂoԞJMEͱ.{xB{$FNKlBVu IRMǨ$TioUoTڋ֥R!21RpG({Ǖslo㺥h٢ .9u&=}R(n" 9{؋|kӦT&7MPPz$9[JMl D[Ĺ>1p2J9RrG%.*ս0h+`seX%$z]fg:UC{-kBRT}{bsU)qYHa-,Ҁ7J;1.b=%i1^jJRWlJ+SN0f{ZRpy'8`8MX6Vqt9Zif{57Zǹ4PkmMPBn@ppv|{J[, I>Td-cJQe)poy:Ӻ ] \f}kTU\Y eg .y KO(pIm#3Jlwk-ƚ3-+C[)ԫؠ6v?TvI)1jKcmZZAZcRn2[Yp^c*-ĩ++c#0)aI+>"IX2vZ&jAA j 8D X'!D jdȽV,=<9Ř}מRK(iN*RA6/a h*'n mK5OZYeś%)@/O$(F]\ZR$T[N@,g?ĸ T3 4ǿt<#2τRM®-a͜Ѳ9t m VVl( 'o*wSۺY?Þ"8@EVC]Ry+@p{.aM-\CF߁B;\X9}E[/LT*L*#2㡶v^˹%'p=}0>XlWMSk};w1&:yRŕ L]?'7!+ZznluHTX삨ON [`mNRNRtw#jYs E'J%'괥 퀐r[vmJ~ޖ*>Ü Mr TIC?rcnqeˍ J5hK\2}(բgۯYe-r )u*vCJ)dIiӢaIKENCi֩415-k)咥tNN>8X&ݣrAmkT })4: NpOʜ26LIRH[NBm}sJCa zZ%)(Xm~syvw4ʜqR[J6x+Sj^SjZUorRRqvBZtIҝ?yK}njfyJgy\WTVcERIJ*PHĘryM䢫8#Do.."VovV+qˡ>ذ5~pROp?53m<ĒGb{72t8©IjC}R($GV:Y{nxN$$ 4j\%1FuK eZAn#1qs{ C|#Jf≲ID/b_=KLh9Բ8JR翖 S izPY8 5G@.|sƈ7b랥[}!նօof8"P!@) 3Z|pA^%Ar( QĬ!r[3s8p4}V`q5h%UB>y|~c@B>'T{s{~|G5iPܜ|TE_u @M4ÕhtsI=ʔet Lw4D2&%|68tRCN/W,&D}ק"8@iiQco\weICI 3ʒSMv{>BSLdv;Ni%'$xHTqLf-TX8lFPi 6>!Ӫ/!jm%I%@[zUK3&1qZY6nTX 8+{ -f ҤA #VG&{Nd,QEU9f%TEq0=I\D9Jy$CھffRK\rcG.*nHQe T_FKV[t^YYG.;%\ZRD<ߝZ@if[capT u9s4e| j%,ArjVS{^{hB:#\sZ* N?Ҩ7D )U Ż,ҵ- tWiniXqZ """7#)KDfL4'e;sss25[_妤Rbᵱcdq&.sU٥ƯFO~2͒:y1tR`;oM¬PT!ADg?4n34\E|?Ed̐KSJaӥx@VYTffUPx[Nr-54m?- q+t!#|KnB&*ԡr+Eu͛ [;pR'X$ 1Z8R(][O(~Zv P4g-"uM(r]T.R/x (-*: P)M.m}Ho@8f4.5&Vj(E:픺%++fG-u#+r^s/rdm :ӼIE @a0bHe2L`Rx䎶89^]ԛq[DTŮ1KrŁ%LÄRB!)RN,Fe%78NKqFЫ[pX|il7Hm#(^S4bҠJP[srq N.Km.0S2$t7 #mṈu{0Ǿ:*oN,0/]smQHm酷W BMl+^UTɨW3>0“C?ߦ~Xz+2UݨpJPѴOݘUs:{%i[7;܏AxQudnni]JѰV 2T*_v JF[QI= {5k QyVАƊ@ARo8ȥPiK-%)C]4%` PnL"$Y.; 'um#\͕`uz=<3r.\R,ē~.U ŰIFJUacD\kwD-j 0G~O\8fړntƈJ{qM|#bSB2\×c<%.*ȸMm늉ęӽS3 iD >bJbDt VjNXH؏^ؗ =яJty0UiݩƅGGᴨ-!oeBBnus2: -*i|$%%D 5Zj\8m/rܤ c ْ sx`J7&g]էQ"ztƎ-vEƭߡ!C L9Ina MYHC(J6I6Ƕ3uBzUMAO11ʭMc{eSLaȉJCNIʶ%u~1\Q-j)D7-N,St뉶m;to}vЅIu7ܚRKG_&SNJD36iJMlw8VÙmJr keZR,*ƣ{xtZ&1Aɭ5P^l`z{y&iS=K-Z]o8+Gd5Q'#˝iirP_L" ӻ״T8ԟsASc |Gf smY\НEqOΔz,iuil7<;Ғ`7?\~yzNf;P ШN'='$fK-+!sRx›6lpTUZS&52Vm\] i;|V7g̷\c\D0Rː7Clt۠ wƮ xլדy!3YDe(IItmFC Ӿм.t5f9O>}6Gl~\Yny^*I?LFq\8)!WbWt,X-Z\䓥Ӡ)edQsc m].Tmҗ]"E$iU>xcmn INEˈ g ud̶ JRS͍_~,eHqQ)Yu2m֊ȌO$N8W YM4Z*HݛV~6h6Դ9+RV$6$R0 Dvn,6R'u*IYTMwxpv5}^}4Odko/o_\Mn%eHZu~ H$ɬP6ON!p&=fEpyjf"`0$fEm c]!z }Om.K(J~C,;o\|DĊs K嫼O؜ $)7ƚm~E1-2ds$ $ uظzZxEZX4։.9N)}>Qd%kH{Fq6-PWkU>p' fA>3޻.\rYiX(m@Ns,HmTѫ)e%d nFrર׉0_X;wI*ګ#%%jt$bИZGyk#D#嚷9fuq!(<6Z$)Z}nnԶtڒ Jb![m LSl5چp QXKXaJUe)\_ ZW*3AVǼ_eRn/emYvIVU@dU>)皂=#f,b?4c|q0ZK9FVm-嶗tnڅ8f,ZuHu$-|a Q+*|j*&fSHpB;⠥ c@ '6-tI>P9^Bz4[2S"dwm{}Ͷy[[T'܋ < 2nHW3%RjqܫA_v 'Hq{'Y֚2>VtӨ~"e׮#E[Ԁ9֩.߻nY&12,i05Ͱ!ֹ6IMTud-:,T(1JQڪUsW6s^aF) n +F8"ZġjJukPizPAz`9fF-9"nRZ B5*5IW¦KvNXoj7* R IN"-\HT|f5+)mWsl!D$iUτS<0.L-O@sudsOZaG_j/mg_rrJI7̭!%—!51iAChK$ۭx  /LSJQ$nשAq+/XDv>d.^6\O|p=Sk7.%SaBHf9N9J#,n)SRurKiJF17X-EKn41Y$x5$Y{#.Gǘn%n}OKyꐼՓ$aعG{w) dry/X*'V崲,$*m،HvdIPBSl,S 4sTa:B[JTR.GMzSsfVR.ݸC8=,֬)^E'w*?l>E5َ IRy/o?Ϛ̹%8 5/UGO鈶)´6Wl0ho:"BMm1o6J;W##A`iyzB}O8 TjrPܗ6'7',ˍ+"FB͂sÃsWōci5 iLZbS)Mq}7wLW*4dڹ%g z&J\?%{yv+r\Pv×)(nX'Ԓ~\mlj񫞥n?UA[A))dn~|L5oJAJ-"l.J_< E(UL֫\}zRAVT PYߗ5dc(Qj)j3&KA8N!=~`I+‘xUA'W~!2~"<MA*e0nu% `rr:ל`l Ϡ|4hntM]jher9WiSCXL7Dk%(f֢־b-c2&\ea.AC{`ӱF_*ȟXqqB IRبxy ,8[*Q*çw$!juث.IH}OESV XS9*n l` !C<7DIN-J@I#n*ՉakΆTmߠ?\I>M"ůXk#6ETʒW_pLjnQhV.RY:gyC…(G}7; TIj'@:("#m8*AHF$s$ReܡM~`UBu2)DTnBK#ġxNV rbKbtqt@cmCǡ gi⫶O*9v\SC8=Oֿ0k"\ӵPqAIqx,sJw]_~q6{2TgVɫ|BNi29Pm6J:VԂEAv߶=fp#RwhYMˆ#I͒ި벜RA IPB|=/>-6+Ҕ Pڬv7ll,8x? Sי檟-ZB^}WؓT%Jg5ņe҅ss~kKA?T<1-\4Hs.\6vAkm: (hȧJMLFx?E)Hzp~QI6N:lʒ;Q çB)Mݔmfݿ hA ;{(RoKS2&_uly#M`f]!AaUIl@BSm~q ť;ؑ[e(N9y:AW!͞hT"m/KҖu((>d}*PD?/BwcT5fM6#ƫ1)p]y]QtfxA7$`+HҮT?l'ԆW!=VAᡖd3086EJJF-i5nLpTJW So^mĥ=]v Ĕ┤)r{ oI 06">$9(GqC.'`)zL!+W1GRIԝ:'o,y㙆+I K!!>=W5˝ .GK C,.tRVυ:H{]+H)*'55=[j?m4J&r-$% (6 0VJ|p74ӡuPTBw& :Fi,}ÌcMX^eG'J!J ~]դq-I VPn')ǜ%,%jT5BJgji3jJT4T47,+&-*/0Jk_m+$W"iGC o, əE UWz}7ďdN߂+b3= S'S'/S*(E܅9Ȋ>'Pf"Oύj͈ cH;) cnTWP -oМ Eχ9N%PNmb{uWKBVHH i}%*Pqj|iylTn6 )ݴn$ +(\Vڑ xP c3J{CKHO R,WبwTyע"4@-Zۜș#e]Z}ijֽ 6JĎn}s_ePCh>#í8^pGx5C*Od:؅u:l,9-iJ}$_cbdf: @/9k%BHWRlL>Y傦7B'/ˋJAK %iEؑnգ5vA p\P,*ʍQeQZU.Tu"RW W-zcz;m:|*i'|0"yxodo]) XV6qI(N4R֥8)CcOG;ajk@|iPȁ:wPRÄHԝp+5y/,lcfPiyr[ U8Nl~D)DLƜ J"ʼn(\!Al\}0ǩk]/{N|ft6Qo||J0A42tvk\A})q;?MdVf)*d5IZP-w=R|ǘ8k :6-a[zbnt:q"!./r%I.:wR `9֦J6Rj6De#/m@؋Ba"o:p-p+eF`U(̇cE | wB6* ?  nN)\sW,4Rdq-U==DzR^ u=p;*zTI1(6,N|Y"X?#  .8ټ'C-p.H2$Ӷ -)Є_}$Al k@T@D<@V+[uY@o`[-Y*ycJl7#gvU _cepyilΛaN<:C-W9ڭMv[nC st!5 (mC ZHK)o0p&B#"S Zk'L!ϢOMuPW *OuT<'"ӭ<'\IMKPU,-CI9#W/K[r o`o:U@CbTJ-]zM9A2CZ[k$eEУ\U/S]46GRW(8'QSc۹cuvgs)ٹ%XG4Dy3dD.(64 a ۏ ZG lN܅0 F~Ueloū 2[3J֢F tе2;`B͔-YPM[;z?}%5l) Lցs._qtw=[BSvElQLV ;oLqé mm 1p$u65X_[cb(,{c5$f !moLBҒGaDy`eI*r^W  ob2N&VAD돨< FE4E vdvl)g8N1+!$7) z_zbFKl;r(ظqDV nAT~͵K-rGGq2i7K*+Scr-]>]ҶѓblV5[:b(@ #PI[gʙ:*@OE|8Ď:#켸_?9\|WBos +y.I]B6J]Ҿg8NԨ ߸ţ.56dujae. *i}mI=:+m2B@;oZL [IZ3'G҂mM*p3I-S? S#66L%*n@:E|#XRՕT0*T H)N |lO} 1ΠoۧP9M%[y!*TD;'*e(; c|kf;nGRT@齯n BAR?ZYL\Y͡. @p;Y`ӈK.ZCpWm`;jO9S H[Kn[*5#Z $3kֽ6x 0cJGp@-,lB{yf&柌k[uhHPMq3WEןmǠh71  ";cE=qd Vc1 j$f q䴟 D19\5%+|k  [lf31&*uƕԕ"Q|)oiK\7[a }nKjNiOe'A)Ž'H&f-$iD "uaX] +_Phttp://www.mshale.com/Media/4/jpg/2008/8/Doctors%20without%20Borders%20Image.jpgZimage/jpeg NOPLOqbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Thu, 03 Apr 2008 19:20:38 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTT1469WASP.NET_"1c556bccbf95c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135pu~   $27FYfkx$),HMQeosOJFIF,,C     C   <*"  1!1A"Qa 2Rq#B!!"12 ?ֳ]Zc뿥%Gc4V$ZF|Y*[ڃud !OCZ[n-$ OX Ce&L(puk )1:Cֱ:ks[-c삖B7 ?=CIsc=#ea*]V;iIUMv?35(T3@B S}IIĝtkY>ۅ|.GnjQ\WGSNCeKԧqP;&o۬Ky" \x#P[Ňy`9FJl\[ m۫bt0(J3"X,S~V_ރ#>g7gs!&ۀJIP-@fɦjLI.Ɣʷ+(Z 6|(7N̵/r%/*g2&*TPaOV$X^Ơj˱afǍ]jTf[m? *W682ry]Pz=Nj2DT NDFkp )RU*[ ͮqf/de'BQZjl\Z:YZH* d1-mqt4Jf皶Y\U&a;77@6j|wrvڡȐ銧RҞ}5W JK}jqo,Jqf̝L:=锦}(ʅZmuQ\+`&-HlzV2)lu6 ~Nc9sv W+_wnĥ+qxL;8_8http://www.mshale.com/Media/8/jpg/2008/4/AnnaOtieno3.jpg RSTUObplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-ModifiedZConnection]Accept-RangesTDate^Content-LengthTEtag\Content-TypeUX-Cf1_CFEngine 7.1-a _Tue, 15 Apr 2008 15:28:13 GMTZkeep-aliveUbytes_Wed, 17 Sep 2008 20:05:53 GMTT7924_""23376be82b145e8d8174ca21e191da38"_application/octet-streamZfD.lax1:hf12ghhi6_NSMutableDictionary\NSDictionary12kll6_NSHTTPURLResponseInternal12noop6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135hmv &49HMZ`r2?DGchlqOif (typeof addthis_widget=="undefined"){var addthis_widget='addthis'; var at12O='http://s7.addthis.com/'; var at12o='http://s7.addthis.com/services/'; var at12Y='http://s7.addthis.com/select/'; function at12y( ){addthis_url=encodeURIComponent(addthis_url); addthis_title=encodeURIComponent(addthis_title); addthis_title=addthis_title.replace(/'/g,'\\\''); var at12I=''; at12I+=''; document.write(at12I); }function at12A(at12a){return document.getElementById(at12a); }function addthis_clearclosewin( ){if (typeof at12E!="undefined")clearTimeout(at12E); }function addthis_onmouseover(at12e,at12U,at12u,at12Z,at12z){addthis_clearclosewin( ); addthis_url=at12u; addthis_title=at12Z; addthis_pub=at12z; at12X=at12A('addthis_favorites'); at12X.src=at12o+'favorites.png'; at12X=at12A('addthis_delicious'); at12X.src=at12o+'delicious.png'; at12X=at12A('addthis_digg'); at12X.src=at12o+'digg.png'; at12X=at12A('addthis_reddit'); at12X.src=at12o+'reddit.gif'; at12X=at12A('addthis_google'); at12X.src=at12o+'goog.png'; at12X=at12A('addthis_furl'); at12X.src=at12o+'furl.gif'; at12X=at12A('addthis_su'); at12X.src=at12o+'su.png'; at12X=at12A('addthis_live'); at12X.src=at12o+'live.gif'; at12X=at12A('addthis_myweb'); at12X.src=at12o+'yahoo-myweb.png'; at12X=at12A('addthis_facebook'); at12X.src=at12o+'facebook.gif'; at12X=at12A('addthis_myspace'); at12X.src=at12o+'myspace.png'; at12X=at12A('addthis_more'); at12X.src=at12o+'plus-16x16-light.gif'; var at12x=at12e.getElementsByTagName('img'); if (at12x)at12e=at12x[0]; var at12W=at12A('addthis_dropdown'); at12W.style.display='block'; var at12w=at12V(at12e); at12v=at12w[0]; at12T=at12w[1]; var at12t=at12S( ); var at12s=at12R( ); if (at12v-at12s[0]+at12W.clientWidth+024>at12t[0])at12v=at12v-0157; if (at12T-at12s[1]+at12W.clientHeight+at12e.clientHeight+024>at12t[1])at12T=at12T-0235; at12W.style.left=at12v+'px'; at12W.style.top=(at12T+at12e.clientHeight)+'px'; return false; }function addthis_onmouseout( ){addthis_closewinwait( ); }function addthis_closewinwait( ){at12E=setTimeout("addthis_closewin()",0764);}function addthis_closewin( ){var at12W=at12A('addthis_dropdown'); at12W.style.display='none'; return false; }function addthis_to(at12r){addthis_closewin( ); if (at12r=='favorites'){addthis_url=decodeURIComponent(addthis_url); addthis_title=decodeURIComponent(addthis_title); if (document.all)window.external.AddFavorite(addthis_url,addthis_title); else window.sidebar.addPanel(addthis_title,addthis_url,''); return false; }window.open(at12i(at12r),'addthis','scrollbars=yes,menubar=no,width=620,height=400,resizable=yes,toolbar=no,location=no,status=no'); return false; }function at12i(at12r){return 'http://www.addthis.com/bookmark.php?v=12&winname=addthis&pub='+addthis_pub+'&s='+at12r+'&url='+addthis_url+'&title='+addthis_title; }function at12V(at12Q){var at12q=0,at12P=0; do {at12q+=at12Q.offsetTop || 0; at12P+=at12Q.offsetLeft || 0; at12Q=at12Q.offsetParent; }while (at12Q); return [at12P,at12q]; }function at12S( ){var at12p=0; var at12N=0; if (typeof(window.innerWidth)=='number'){at12p=window.innerWidth; at12N=window.innerHeight; }else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)){at12p=document.documentElement.clientWidth; at12N=document.documentElement.clientHeight; }else if (document.body && (document.body.clientWidth || document.body.clientHeight)){at12p=document.body.clientWidth; at12N=document.body.clientHeight; }return [at12p,at12N]; }function at12R( ){var at12n=0; var at12M=0; if (typeof(window.pageYOffset)=='number'){at12M=window.pageYOffset; at12n=window.pageXOffset; }else if (document.body && (document.body.scrollLeft || document.body.scrollTop)){at12M=document.body.scrollTop; at12n=document.body.scrollLeft; }else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)){at12M=document.documentElement.scrollTop; at12n=document.documentElement.scrollLeft; }return [at12n,at12M]; }function at12m( ){at12L=document.createElement('link'); at12L.rel='stylesheet'; at12L.type='text/css'; at12L.href=at12O+'css/addthis_widget.css'; at12L.media='all'; document.lastChild.firstChild.appendChild(at12L); }function at12l( ){at12m( ); var at12K='

    '; at12k=document.createElement('div'); at12k.innerHTML=at12K; document.body.insertBefore(at12k,document.body.firstChild); at12k.style.zIndex=03641100; }at12l( ); }at12y( ); _0http://s7.addthis.com/js/addthis_widget.php?v=12Ytext/html WXY;Ogbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-ModifiedZConnection]Accept-RangesTDate^Content-LengthTEtag\Content-TypeUX-Cf1_CFEngine 7.1-a _Fri, 10 Aug 2007 02:56:46 GMTZkeep-aliveUbytes_Wed, 17 Sep 2008 20:05:53 GMTT1536_""61c73a7a21a3d9013ec390335fdb2b97"ZfC.lax1:hf12fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135\ajuy(-<ANTf  <AEYpgOGIF89a} 2Dk'g/6EB|$9  !249\5GYR|fm!,/WS<`2FGJqqH]TdnÌBk]NtD"&3 ?Lwgw7d%i:mLsGuHuI{Q|S}T(}-GƐ&Ҧؼܸ1 ŎK֩ScN/'~Nƻʿɝ͸!9,}sC*\ȰÇ#8Ү3jȱǏ C9D;I\ɲe\\z4ic8oٲOh?O)!"HܘJujXGj֬c8]u6u5.ְ_{p]&X0bzAh0k %-i4jrQ䄊|dPPnMxc\*lj~̛qc޸NQ1bUIcVM-`qC ew+u ۇ^\wpG+={rx GKy'j_"fX"%"&"",rb*r*  EKˊ!D -R@E4pޓOZfIK_ &^)abfeț,2 v2 *A'|`M !˚k+R0E3pޣfJ**ʩbjW!҇ T  0OŪ*wUeճfH_U@ނm~- |b*t'h|[ @A`D2$p7G,K!mdáPTEZ<1;ш% @.L#l8<@-t('H'L7PG-TSDI\w5C;_$http://s7.addthis.com/button1-bm.gif [\];Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Fri, 07 Dec 2007 23:13:45 GMTUbytes_Wed, 17 Sep 2008 20:05:55 GMTR43WASP.NET_"9ca893d02639c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd".024   !#%')+-4BPUdw3@EHdimoO+GIF89a!,D;_Xhttp://www.mshale.com/Monarch/Styles/ClassicNewsPortal/StylingElements/Images/spacer.gif _`a;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Fri, 16 Nov 2007 21:42:05 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTS381WASP.NET_"cea6ea879928c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135 !#%'13579;=?ACELZhm| -26LY^a}oO}GIF89a 9Q8^r,FKa )r#>TiCZ/i{1JQf"<&@G]ְيXl4蚦atJc!,@pH,уh(rXXL G RLNQCIHf"j6t %ͼ #g{DUCrCCRB*CC %!"(sG 'D'H KNOD$ C %+&B+, C) HA;_ohttp://www.mshale.com/Monarch/Widgets/ArticleWidgets/CommentWidgets/CommentDisplayWidget/images/blueComment.gif cde;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Fri, 16 Nov 2007 23:27:25 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTS687WASP.NET_"98b9293fa828c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135 !#%'13579;=?ACELZhm| -26LY^a}oOGIF89a<fff䏟RjOhsꍐztuz觬{}`v왧֬ݽ毺ނi~~˧fffޞ򕙦ޖ\sucyޒ{ʝϥĝ؂͔҆m!,<Frd2'*8ШtJMYlA*`B.:-i;n̨3ʆ~}6ravw|myo!r_`h!*1sbcd%o(e ´ (##&&1']vԬ.쿱ƿ⻽ 2Am]j @^1*@1N\@J4D-H( 5F4H'I39rD̕7kP6hɢ( ,~@Ev_X'*ExWHeg=\x l/Mغ_ @,_0KÇ9j)0e/m[C2RjXװ_s!m]D!N.`׹KNzuғDq tBӫ_Ͼ ;_ohttp://www.mshale.com/Monarch/Widgets/ArticleWidgets/CommentWidgets/CommentLoginFormWidget/images/btn_Login.gif g`h;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 08 Dec 2007 18:38:37 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTS381WASP.NET_"4457ca8bc939c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135 "$.02468:<>@BIWejy */3IV[^zo_lhttp://www.mshale.com/Monarch/Widgets/ArticleWidgets/CommentWidgets/PostCommentWidget/images/blueComment.gif jkl;O-bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078G#A5CvX#Ak_n *+!-.WNS.base[NS.relative_*http://www.google.com/logos/Logo_25wht.gif1234X$classesZ$classname456UNSURLV%NSURLXNSObjectYimage/gif9:;=>?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP VServer]Last-Modified]Cache-ControlTDate^Content-LengthWExpires\Content-TypeSAgeSgws_Wed, 07 Jun 2006 19:52:13 GMTVpublic_Wed, 17 Sep 2008 20:05:54 GMTT1607_Sun, 17 Jan 2038 19:14:07 GMTQ112bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13`eny}  /7DHLls 'l5OGGIF89aK l rx'-( "s,;qt{1.(92:@N{`j(F3JHYv8E(R@aYsdTihzo{ȓ𭲿 JuϐX1bJwkdkؿy؇ۂț۲Ztګܵf`mH??6^6ÎӜe~e`_Ʌːdʉ (ܐ m˨@ʳpeαΕhptP؍[ݯ⫛ܴ{iO;YEoa蔇汩)ZKʼnɭ6'6)QH\UnhҔ 72B S`^QD 4 D  ĵ/ "9PEP8`u tYAM)^~%Ch`@X0 Zy$E镽 4ZPd p[g$0 @a )ppBA(.Wn4;_*http://www.google.com/logos/Logo_25wht.gif n>o;Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078#A5Cw2߀#AS *+!-.WNS.base[NS.relative_dhttp://www.mshale.com/Monarch/Widgets/FooterWidgets/TextWidgets/FooterCopyRightWidget/Images/rss.gif1234X$classesZ$classname456UNSURLV%NSURLXNSObjectYimage/gif9:;=>?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Sat, 17 Nov 2007 19:38:23 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTT1043WASP.NET_"4793d6a5129c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135  &(*,.02468:AO]bq "'+ANSVrw{o_dhttp://www.mshale.com/Monarch/Widgets/FooterWidgets/TextWidgets/FooterCopyRightWidget/Images/rss.gif qrUstuv_WebResourceTextEncodingName_WebResourceFrameNameO Blacks Without Borders
     
     Web  Mshale 
     
    Reader Login
    Username:
    Password:
     Save Login?
    Free Sign-up
    Forgot Password?
    Reader Control Panel
    Blacks Without Borders
    Credit - Blacks without borders
    Charles Henderson, who first went to South Africa on a visit, and now lives there, is seen here serving wine at the home of South African golfer Ernie Els. Photo Courtesy of Blacks without Borders.

    “America really no longer feels like home to me. South Africa does, and it is.” 

    Cora Vaughn, a successful African American litigation lawyer in Chicago, Illinois, always dreamed of living in South Africa. In fact, her mental connection to the continent was strong. But that wasn’t enough – she desired a physical connection as well. Vaughn was making a million dollars a year in the United States and faced two options: stay at her lucrative practice or open a bed and breakfast in South Africa. Vaughn moved from the United States to South Africa. And she’s not the only one. 

    Exactly what is “The American Dream”? For some it’s the ability to achieve one’s goals in America through the simple combination of freedom, opportunity and hard work. For others it’s a notion that ironically is best fulfilled abroad. More and more African Americans are leaving the United States to chase the American dream … in South Africa. And Blacks Without Borders, a documentary produced by Stafford U. Bailey and Judy Thayer–Bailey of 20 Four Productions, has chronicled this movement by following the journey twelve African Americans who are living fulfilling lives in South Africa. 

    “We thought it was important to see African Americans doing extremely well – but also achieving their goals. There’s more than just what’s going on in The States.”

    Stafford U. Bailey, director and co-producer of Blacks Without Borders recently expressed the impetus behind the documentary. Too often there are missed opportunities in certain parts of the African American community – the chance to travel abroad, the ability to fairly provide for one’s family, and the access to significant educational and career resources. Furthermore, this lack of opportunity has altered the scope of what many believe is possible. Bailey and Thayer-Bailey created this documentary to display the success of African Americans in South Africa as well as the beauty and opportunity within the country, overcoming the fresh memories of apartheid. The issues of South Africa such as xenophobia and the racial divide are also displayed, but in a light that shines on progress and hope. And as Judy Thayer-Bailey stated, “we thought it would be a great idea to see the side that’s not seen a lot.”

    In 2006 and 2007, Bailey and Thayer-Bailey traveled to South Africa with cameras in tow in search of unique stories of opportunity, success and hope. They explored Johannesburg, Cape Town, Durban, Pretoria and Eastern Cape and the stories each place had to tell. Bailey and Thayer-Bailey documented the beautiful land of South Africa where certain parts resemble Beverly Hills, the delicious food, the amazing lifestyles of the twelve individuals and their families, and the businesses these folks have managed to successfully lead. Perhaps the most significant element they captured is the pain – how the country is picking up the pieces post-apartheid. It was barely fifteen years ago when apartheid was officially dismantled. But the memories are still fresh while the remnants are still present. One individual in the documentary, Charles Henderson has dedicated his life in South Africa to addressing the scars that apartheid left.  

    “The real beauty of my experience is being able to see people for who they really are – no matter what their background. Just being able to experience the beauty of humanity.”

    In 1991, after completing Harvard Business School, Charles Henderson visited South Africa to visit friends and assist in a primary health care project sponsored by Otis Elevators. In 1993 he moved to South Africa for good. Henderson is now the founder and managing director of LEAD, a business that facilitates workshops on leadership, customer service, and overcoming apartheid. And perhaps his past life uniquely parallels the struggles and turmoil of South Africa’s past in such a way that he truly knows how to address the individual and collective pain. As a teenager, Henderson ran the streets of Harlem, New York and found himself addicted to drugs and caught in a dangerous lifestyle. And though the cause may be perpendicular, the effect is parallel – Henderson had to overcome his painful past in order to push towards a better life. The people of South Africa too, are doing the same. 

    Blacks Without Borders is a documentary, but it also aims to be a window of opportunity for African Americans of all ages. Bailey and Thayer-Bailey hope to show their documentary to teenagers as well as adults - just one glimpse may be enough to stretch the international potential of “The American Dream.” 

    When Charles Henderson was asked about what he would like others to ultimately know about South Africa and his personal experiences, he replied, “You have to come and see for yourself, really.”

    So what’s keeping you?

    For more information please visit www.BlacksWithoutBorders.net

    Comments 0 comments for this article
    Google
    UUTF-8P_1http://www.mshale.com/article.cfm?articleID=18205xy~z {|};Osbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Tue, 27 May 2008 04:51:56 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTU23442WASP.NET_"927ca863b5bfc81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135rw  %38GZgly&+.JOSgouO[GIF89aZuusuF93U*Rj8ﱲVWR440拍)ۉCϲt7hQP1Ӭ+f'!c/i4F?K<&c+ȧ؎kq H!!$V 1Wy:v 0w,J,͵W Z*C;ԄKђ~.y2.IGXa03͛չl5j"|&)x2ʁ]u<9}[:j8ddgS|Hڋ;@f D렛'3B .j^p…X >9HN4jOat#K˘3k̹ϠCM4h7S^ͺkf۸s{נ{ N>b"F -&*9㒗o'.6>w0:ȑ!V~Ô%[1MsFdN7;9Kq& Fx\?c%hi .@C"jQ6\a{c`\W'Xyc6*6Y#5^|yߐDidiLHNT2 UWV\ c\ ZAÙ cX`A!c ᤐxxcyXa{4F(:"Y'G6%䤔V"D>v駠*ꨤjXꪬ*무 Vr`%7p gf0D gM|A!{qw)taX莊f|%A$p }䖋)ߪfIj$̶F,l')rcE|𱇯7`1g1 `!|Ý:Ѧ'i8PX&6rK*`BC\4f=LgoXE6<0Y4`(lh}=ۮP, qw4D4a@!9X0ir ~pH3FJ8@ \ކM8O:9 Ӛ%:?GgGsiW6L@ǣ8RpG/ҟMׯ}hp{\!]Hp F\p@, 6`'|I59 4PA<P1T9Rd\. ƫsf,ԥ ` TAhpys t$Cg94H.zKb&zz[QІ{X" dDGk2 h#cM` aыkl?%,xu B0u8!,`,ô$H1+ b`@*ȀT` 0IH)S2iL@ԆKyq @3]gl@ 0 0W `f3 L,#NqxB-x` z?93ۛVsyf=Sc}\Xr=Bo3_p};!#̑0]s̤&##L4kb (0SNX`vhĴv? (`ҙ\<߉kuPCAP0[Sb*hJeR R(ՙ<NmmH4FKҚv GhOѢJکնl{[mb|}L֧=@i.V##ȉ†iBbMY< ޥ+ehԁhr@Q0'oY08t27x҃G`umT І4iEwX^C _-Eq7buw£?Z;M_ŘsGJ _3Ltx_K%'LoY` Zh(0(xʐ { zq\0F+@}2 W,r*/PqکqR/~`).&*7f-O[Rd~0է(1K૧qps %G5 ey hlq e!e1 I {)Ucjs9p^hRچMVyz:rR_^xxٖ^JBH jFKolڦ,Q醅s#@0) 2 nO %=!  "-|0 +" p{.QS[?X+)@Zpl!Ƕ6?0u|[n ~86޳g`7}d\\a֡ *'  !+wbf:@`CjHJp\*j5xFx BD _ǘFU1@Cka+d.$ɔ3;4 ^U_wa t)y31)` n o& +*9y,1(`J*hJkq.a}UGbq6 6VZݧeT?"]p[vvmZ#e.+1\ٕ>+*{ >^ M7+jp2 Tl4-AtAWjLfu.9wЦPu1x4EV 0b>d:K`JTJ` S@m:uT:kDlexڻ '7l  (+=zZ ZXJ #W- ,f:j 9w1lH ' `s'φ2N 9 W I©#(` q4HKJ9nEҬ .`tp tp`v po> HKS-S.I0\~ 35 4s<M4#K0k4 A P˱,0 ( |.$TPXBGu*|0K{.~-{}ӏoV*X $gغ ~6DZukof{;ZpZoqLʛp#Λ ;;"D؁,G:"a>8i%% N4(5k~=}TП 2`Bҥp!Qf HR5AT&G6C0}A )* .`~CXbƍ?F\7(ddYfΝ=CJҍRZY5bG[lڴE1F:&+8!{ 8xhC'A ݱt։k.c^7n屃Qj3oU>߆  Ę>! ,P [A,. C 7M "D5(Dr8hp 8""Æ8ar%dv9` #-%$L'4vB*$Xb @'l3̟Jꮥ- 0hM7$ D6U;⠭K 2JȞlVaJKEK̟ [ W4SM1}DЌ+PFk`=VcUT2mFp3Dxym g1:e.kDm@9*p,@l;ض[j@7cAQ1V({@A#2$ܷOeɷALjW߅סW'U~@ex\g&Nil , Ѕ CXL >T:xr$gPb ~jiI*$JlzA@La~NA%R4Us /4FR~a F B$d ׬Cb"#s0;D ܮcxr@ du`-1 N <@Bd.v`  M#44fC <6 МB :!,`A;3+X!%` ' ?m̋ts6WCD`!8\@HLp3anx F1Kc@$B$lQ`m?3tkZ)PU!`]a5f1Y̍b"< 8/bܥ-_2r̻sZwGh ;u0m˕00}ҤnLMfVխ_-Jb`F (q >#c A @ 8ް"XπVK¨8aaBP`xN`Iy-xpҕ" 0f'tT2Ml8<;4cac-b(1+t#tr#ɃldCz6Ӛ4'dEԼK$\%q@Ah7d3cW1̃ҙN'Yx91 W\߄_ 'Scw~wVC>i_\3:&<B0 1`E u g9x . o"Fq &5iSzoq1q& _ + ƶE[ٔEىz~UoY-#OFwX_4H| zxoX Eh4tٌ),^RcLr CSy3@H &M"+{pR&3gďɅo& i B!dJSB<((0\[YE\<rcB0gkH$)=6q[rd0؄8Nt! =# #x*Ȇ1򉡢D(c c0 H 8 kFȪ Q AV*ۿc2Ӄo?p5ǘF%fhyp bx,xP?BгX8Ght\Ghǰ3 :|GP9U:V3OV*HL4ZHP%Z5[Œȓb3l S -p+$>Y1M\,` D=9 YKP 8_EcDu.@`=H`$S( Xx!LxÂ|xlnbpvS "hSB4E[y:xSӴ%);DcـN{H4;1;tGH«5@:0!hÔЂpQIzIId8Hh7BpȚЯ1* 38 Xрk "Ğ@8T˚R 8`1QKC-!̱R*Xj"h(PhaWQh8SІ\Pm0SX}5S Jh/o0/*肗Ӳ}Cx]H9,Acdb`\ X~`YpYIT2+@˞I:{2#"!; | §Eu`HګNI5(x0#(\1K8("%>˛K 8>XT?o#pu D?h0@PQņ Peuu`4h^uru.`Qʠ eC]&`](pYyYڇk[Tr(5`Z5Mld-|zx7ZãcOHɔ)(zZOuOh)_ölɼequZ >?BDT Ei] (DT\ =D-`m" OjVjUKĦ=]ȸY\]c2$AڜRC Q:h(h m.m^'p^ZS8euP]X&%S iA$v`eVW_jĸH-͘5̣݇~]^eZ1@f^ bb_Cd N뼇k֌g fV1\1(PFgGm&p5*3+ xU Q7>s1֠Z~i%TJH"/Bjz7pqqpp V(II6F'P0&jA|Ȃ'7O 0\i b(( GV^rz9)rPsfef9Ptdp8& >>Ϟ+Btsfys~XB@ xKKtJ_MN?n-'Xw\P/շ}nȃ9ZHg$pDxnϝB (4p7A x'xw0 w W 0!*H y(ރwvoNNrx?V SqVH9W{rV0Son(yؒv `B@V&:`"ƌ5""X"G,idVl١FZW2J++pdp9i2SΚf&eɬNRj*֬Zr-YUdIU\ 7fH`Aƛ. 1@,Tq)b.V9&SAr>pgY(~\5زgӎM*CtNT wnʗpI[xq I8 \Ct6mlAwI0bE' XFE2J PУP 8 @h0` I 83@(#-*6A- eaE  $58HԈ7ExSWYj%]z%ae)#4A ł B,t1 Bpe.j^t$c8KM&=|YЄh!pAV@U6Jz)AZej +J<0/`mŠ묰)k*x*d GeFG}L  D[x@F򔰠 3EhBƇ@ m+NS] -| -#FdAV4Ď7Alp#CYp#QiV{|ƖBI+- KK SQK4cj(W+MH]{ eo^'M6U  Z=&4B,p & 6 F!` 7pYEփ ڧ~0:ilWjt:ӊq*ǭ쪒nl;m|Sn9춋O1B) $@xүnP+S=԰)C-#\2 n^A)#gHҤ4<8#3+# ؠ@a/ Ql. $~{0*@{Ё nX,XR " `O{ h 8$$oE$ a+`ЌR$r9ʀRuBO@6D rլ;$"*h!+zV#ӂ p0EIpk\Zj%B eA|׾`mTAϘUG0m Qb/ҊkH.Ĕ`|`4̬">&  G+2~\23+3ղ6XAC~_>I Y Z&␃.\B _2xQ bwg11ԢqDp8Qi7w:tLh0Q-ce~(dc-X/JX5"\rYO2anw[T x#8C r+2~_jj$2'<`l2.(Jz,dPrV"!&5B[$8v{*`僻G+@ 8~5GisWjMX#DABd!t|8HK;3){^Mu!ǿV?OX\fL,|0BBb@ q b"EJ`&ah@< ca;B )Rޣ~9CTnS3! }H#/S<3s~R/x<%߱[Y*>OAv_|8%(Lx B>zAE2,*Xv^m32i#@@ۓ#GGl ΙD %ڈ85QV N@7bYH_/F Wjli/F_H nmIIrD@( <@h%l%_A$@$%4\ @!K]4wק2,X@"ߑ5AQ!Cu`V j"A>""&"."#6#>"$F$N"~ޘ^|% q&1F Y *='4ۈ( 9^^M-:t1 L5,(~,@A#d?|VSQUEAn5)1pG!`{%\9K#@^9!T6fDʉFND(L>RF{8B7j> mm4B8ߙX?<A@HX %6|Ҕ,*@3@3< * 4 X \{-萚€teXl5A@m]E3"7"%֥]%^#Zbib'B `z&/( R![**='؞{<(@,"1 (lC0@ 3 MD< pV`\;v[ki;6 OMѹсnU d{,ԕ'CDE̦#}0pJnbt^vBovSp~s^D:ZW`/Z HAuQ5D5\ :&@<J1A @' B@%! {WreWv%24X~&'Ve̥^("__n1Ba@b1f;0F#F8`^O:)z!”j,l޵Ђ1I8:ӔV c]d)&ϨR{d$#΀mZf@#~B}Vr{2j@PKoB@1cDBs NF(7ߙ'FҶ3lj"s%y"EuZ@`0LzCL22(,<A3,@3j õF@̗6A喨[kj F.%N{t$b   d#@"zFF >,uFh!l_i#xR8f&P@*dFh-==VBVuDH~<@Sb4&z_bE?43g4B3g:cv'~4;cs#@(,(CYs@7?df d\3&fF%@`ggv¶jCBZt.B)54x77\0 OJh\%|sa T)HU>.kVKkrAMk]CC>ܥOSgUC6Pbg7 rF@S#cV5F txXO5*b $X${B[Od^,B]_?:DL.:ȘFhCL$@/ Hdo4ȆHf9@gPl͝v Lep؂<;ܙj0!fgD:>jݶ9GAk9'G99ʙLl.sc3 .J~v+w^0zF5|4C3@кz䈁Up3Ln {WVn4 DA/k7h@6 p@gD+`PcC8"rE{|A_7( ckNPib8U_ =+V)F\i*¥C/)LF+@ȗ6ce9;l9FT4DD~19U1ESLzf @yӟ{\0~̀H D swigEm3:M@#l:Ҷ@ѳl{\} =V870(B Ȃ,&\AShy x4z6" 忁8|A1f;J?kp1Oځ8 3J(PE H2a$R{(/A*u i FnnP +(TZ`Cj&i@H2APd}Nv1Z1Q*Q=@ T8 $dl ((i)r*r{FnIFpԁ!<(³H<;;B`jxq,ő!DӣT~+-OuU R_Je* tPϟ 3))a p5ӝjPQ7)UM:t lF/}VC{Pq̮VW."#BƎСt5{=$; )p :JQ #ɩNuZ: {XĪ xb4F-MBl},D yC4 Cq̃$@||6h2XdPB$D49jMwCTE-~H4@ <1,I%AD@A*Kz$D%'NX ăLaY -#""RP:.L- (qœ`I'F b4 ;@2#d^ũpZR=ܡ5d4aWVu+=CXIpU7I:P~.--"Y QȓM@9aN-  {F }5kpi?< B %d$x|$4!SĨ e*C * EPE'ůa`*h} 5:@V(vQ:V vdM2P\D`yq07q&I҈*KY(YAbW5 .O U0IJ{<kH[Bf e û1NBC)֘p,Lكpϳ_<--L=M VQ&(`! W)`c,΁ PPЂ<uQ)GC)d'ԇGb$i%J!\@ I.|/=)0ST}='e)Cr: U h pS;1$ƠWouV%dN8ke,sA}uXbטW`ȪPH߹%cB Ble.r:@&za8S˚8Ŵ! A]0j- LuѬ7pjZC#j0 T^.M'o"<oPb5 8(`)@<דP!>1<7XF2ndTD(L1 p.Ħ'/XdvrTȎ@Gթ@Aޱ(b b@KFϔaJ:@SoB6`Z6ָ8VX.83q!̙MR4Y y 3eC;(,s^K#c?Hk6&hNYE `weY8eh|V` .X @kn$ ʎn\`a۪ca#;c,d~/d LBp_ $vJb$FdBBO` AJBJF'`zKDᬖ E` x z1b,iBAN-^˸B^pj VP-KT z)ElR‚ Q&Rk(3[ N`8aN $or8E3 a-a7ࠁࠞ:(kQv*0'I"ޭƇh -¸ FA|$Q>rH5liJ2/r`L2,seXRSR)*&fTG B X b-,. ,ҎG2isBMhGRd4$ p|QƭZZ8c$[$C%]R`̥<҅vvR8x9~c`aB`<"ja*#6*Ĩ8.ٲþ?*L>AK nBrLa& EAn"S,V6}.&A|7Y@G O 1n aό(rPW{x%$to1{TWF%JA T02d4!t/T+>AgCv-$(Aoq:h>F@;V)Q.KtWD aCi oxU~ir@RDnd̂j#aKRl•sJ7dS%xt;M OشM@:r%`ܰ%pRNNR:lMc#sRa~2cb` 9  cWz d3;3"UR=q/b]2>!MbphCA?bDM81hU$,0ACjhutl$ȍF@kY Xl(. *b'Ԏ&nk &0q"Z B7[Lk'%ܑЮoKV.+!6uT@xA"‚"۪2`~zaC%u6@$oԉȸ `  a׌P!٢֡r` `zA? l(><&$CVUiH>zujpDJD~?9Dh t`HQp'6͈T/BQ҄':2(,Q6nvoB+j ,گub#kt");g Kرw[ - :`h+(n'0Z#7K][(۱]]Y3 ZpN0lmf zZ> BCdM6Rq!  @f`@T RJeD\ePA@OF6U&f $q]1dTj=ٮ` LXwtv"<ZR4:'xB {6Ptl{'ty" XAȇ%c<țK'~yBcI8ȍ</)%|!thTZ\ƍZ@mb;@́ .6-`뵾%Rpܷ~ 20c ~%# *#= M֥'Ɓ`IKRCB <0@|9|1ĉ+Z1#E,qi&ch<#{ 3̙4kڼ3Ν<{ 4PQV=)CTZO"\"@h8Cv~,ٚ;rKŇsjŹ'o;`WN9#50_ Ȑ}@f-2U˔ u\+Y`*}R>:լ[~ ; Sھ;ݼ)jrċ?<9OpIT952sw5{Un(2DufE(r+_ll{AWa /_ƟY &dʀ5V8~lO"Hb&b*Ȣc28!-#]:c>(z֝vV@x}"lMh.X#)" TEI-.y)p `" eTU"T8J=iȡkbhHc> Cwܸ^iHu0h$Y)/M&6N/XVFm)xy*.WrdR c `3fY+eΌ~ FJnj4/7nn *Ve,x*L&#(HT8b8UlGXF^;DƬY`q"`̎5d{(Xn2+:6|,Eo> tqD%EPzEukT@0:6Lż8a j`p4!kv&yxsQd+Lx.6s;j1 yO{ՒzAׁ&UW
    _adDisplayFrame8_Rhttp://www.mshale.com/Monarch/Widgets/AdvertisingWidgets/AdDisplay.cfm?adID=268008 LO{bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Tue, 27 May 2008 02:55:50 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTU25220WASP.NET_"68c8832ba5bfc81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135y~  -;@Obot !.36RW[oo}ObJFIFddC     C   X" \   !1Aa"Qq7v#2B'FRWu $3be%46EUr5CTVdst5!1Q2A"aqBR#S ?z()Š((((((((((d_'*D9g7jUɪ?e#ß\d'E5'"gi5Ljڜ*a,O#eH]4Y2mƔ3XRP}٫JJ!Q^ @y%8^&u6IVu,jzS2`Z%E)[~VҦR*.=5^su`NېlAl vj_.Y<{s> q\Eq6˓J!6p$=;W~+}v*y71,ӆ뱸Qg\_v U2{%_섌y NiëԒ -cr>_9ev@M˳ޘݮb2ueAR| -Ј,i2Xb\:r{0={PoE6hVd0>r\[9V=[`ַV,>gCgP)1 EQXK)#@rk[9DW,!B\II)# "! ȶL`M]wn?[?Hlp('s6mʝ|sqn7v)51 67$ sʎܬ)k.H"UzɷK5 +\gXR\H$1։ K[eđ!)S->4;,cѳ4y:d^OɌFhs*䤧``p4V!t#wȿz[S۽m(X)GR*3>ʹ!Q P\ Чz1q犵 N]Rb%dQBf:֤@ 'GS{&4m*>RNqT`N:<8JIq '$৹U7%KXԃsOʍȞh6ꕗ-\RsFg}*BN]D\ =W_f!V02#=&[]wNA}E%ЗjZ O,{k $ES ZS BJHɪ*[~m״tm9x2De t,4P OJTP:CvZاxF֖I\/RTPFDn垼pҚ[ZҢA#* gkިZ-nҚeMJ ~)io{aiCR:GY]ͳ93b{d 7jae+i"B{ 98Y")[b̩9~.:%vǪIJܮs-/gaϖz1ӏjQt~ۡżѱ,uw0 mrR% H\0msv+Au8a7-VBB8FON'(H>^M)a M` 4.c ^mPK}wS/eȍ{\חo㚑w{[ Ylw=tιѯ?)>)lv%}P{)k7V uqvwxG-QmAц"p /+\+jJeD <7eb{N"(^-)_z])7JFFZoW w+}TH+`a)kp!д>Xu~Iq!'8J=9OB2֢AZ[S%rJQC]kz|sJiikJԔ)I@ʈymNmXճ"ܓ'KmU/''83uŦmxͧE$] .BˁDv$7ع,/pq-+Qǩv>nY7y{"%R[qJ˽Té!R=_΃t ݷMjL{>O9M.'B3SXg&#!:n+O veqMc+֔%e*VBTGCWCMR j/M_/rtkl˻mx/(RJYHAu`Dγ]:/N-i] 6P`G=DR| rs_+ ~͸B L!.Lt RB # BW H;խǁ|qQ`75yXmՀ+Xy=3Vm;a-tdZלm)#A]çPE6gdFUvsۍqZ *=jwk^_-2SDɍv-KrG/\yLWU#'*dVIjICS/P C>Dd"hi6 n4Br2=uuZIb&\ /ў@QKb\H"Υ8mڨϦFI:[OZq锭H_ .)`eJE=+.u;GCKrJqJJ&[g ] 7F6_-,) _AD[ß"z OSݞ#Lzc]{իo?1] ȅԤ!$)!Y%|sxڰmz[|]4e\Et)q~xNFrS!WJo^XnZ",-6bF/ƚ9Оğwh{>4UUMjUr6co^4ImaidJ-9Ϟ1SmB%#&CElJ[nBT@k/%G@JJIdx֚}]Md뚡9lLZSH J])PJgS2*x5(]]'k{dNڜF:Xp kS':["uqu*c9q%,\.@eErF1׉ӻfvԐ.:OwsQ̨}'%% ZR㒀3ݚAn%ٷ:id3 Ç!mbT=c#<{b1yǂOЩ/h)Xn+HU^U5(em*t/ǎK!.A')䞀Qm*t/ǎK!.A')䞀W`RDdd ȁ5d#(7";uaI9 Ʊ衫jCqw[θH ʰ;UQEHQ@Q@Q@Q@Q@Q@Q@rVؗ. P!: Oպ ?f*>V[6i,4ZύVGڋūuE_d(pOǓպj_Q`sW (pKOVGڋūuE_d(%},y>7-[j/~??u}n}9ZW>_B>\Ǔպj_Q`sW (pKOVGڋūuE_d(%},y>7-[j/~??u}n}9v[l }#+}AZPiJR|!^}+&ұ pO7nV/n~۾U| w3=(Q()`OBN!1aHa҄hO%5ҚzoZ3cT]VljY(gWBy7Tk 6A ݬuđJyxp|6O)A=N*S<1EsnVkMձ5yzi(KWg{%*A*O ]3NN۵=d%#kRљaY*%4גscUn.7e75wKq؎jH!\Vce`f5mLͻՐEjtB[(mm%i<R+$&NTu22M0\m e2$8^dQ\Shmj[.q@MSb]xe% I C)!] D`3TQEV8QERE7ٻʹOQ{nSG . ?f*>R}EٻwʷOK{PQZMct!A!YP}E-EM,Λ N&BAr{pxY}Bʤ`ƊL[ U{*m-)oEt$uQ)'kI U[`pSI&"X+6ۧvu93ۼˠZ(t#9#8ύ#[=ލҌj3Q9>l3)C>JW%%I*R>k5>kJI}dKZ'7O`$tj# lŮ+pQMkf޷FYm9."cvMlFq<S@'o?cm4VeV)%rI M`a_%^L{HjFnui![`†~ [ۆtш{c]٫ju:cNe;(ؗ-|wkW]hzR͋W[#9DIV JAo].W_ۼΘlnTk|$#'hR֥-EG+R@ V=o[۶"b]E(ꦭװXIs7k)S3-ĻeI@=.t[jS䅖]P>J|GV ԞɻrR1EGx A- SeO|ÉU׻<|z6Jp TU翻qƺ(cFW{oJe=owr)~\"ea>ݻ[CO7nVw0j5=kL+VJvsBJ:c?xs-*%$!wIQ]i-TŽF䘨p)+ǚExG&s-8mu6oV}*g81uJ|ޣoC]7{dj#礤s qQnrBV *@Hp/ gɭIҎT#8^MǟVղ`/IwCQ[Y ed}D;edcTՓ.RYDl)9ugWSण>:Qm`Mz&a% %a (dUj7m$'N u1Z8ףt[_yՕW fctM֚pWUy@4v TBKj4qsfzGjۃrZmy z<*?}fbcJ99Qz-t'*MlVi5wZB!=GjseWipPS&{^]bߣj6S :[ `RSXontrozn0NnTC )(uk} [8XoQi n*k_#! ǸcκfwɁ5%R Џv;ǻnϺƠzRcpQZqgӻ=pn3-n#vEzVp1\*KOGFSsmԓY wM^}AvLwm[T'_Im! ɶft=b/ݥRoPt@>=zn6*-FJYu=>ݑY<05ud+y&mFIPyķS)I(BGS R%!#bݜ}tiZ [%/i 8:d1:+t qK+R}8Ί* C߿7qW)/q~UEaQ{sn!'^|tDGQJ0@d]/]aRu=~\s;m#雽=]i?W-W} SͧT;tfڵMy7 2]/ OHQ> ۑ8rIi՗ZV62$FͨIA SS\5 Կr%Ġ ) ATK%j8:~RԐ֘?G5CmJ ϢB(Jޏ:V}di+6@9S&Od1A襤Q}O.{u^kK;7u1chGZE6d:]BI#zy5.=]eI\#W¸ ֛ndxJ[TG{ɤ<펧wbR^Cm'M~&\nBD:{TBT82e!9sbvj5-ê/i'5]M^ XáD(e ]bw}4N~nN9>i0 *ʇ 9r5J.VK Qwm۞Z, pVf9XFsSTѢsCXvoZk6 d2>\yRVndNGd[R @1?CZ(t%jB‡<䂒zӲN%(- C߿7qW)/q~Uh!ea>ݻ[CO7nVw0j (aS_-j/kK%>۬((VAI=qδZfW55F'#$6IJSIC:%JNT31N5qzTF]̔-H9}A{&@CtopB˛ 7%EI.-$(;ɫaJָ6բkYM^.)Z;,$^K6u=# UJl;mIVA3J@JhXR)9:D`q!ISIsە腯/fs둊-I[IDriN|9eؕ.9?UoUfqR-2)^B#XZfnA6uD+2r{~K%`VэQfxr VWP_@@܆nS )yR,'~0+qwoҗ $˟sx(JR c`| U';}0{J{-k5Y~\WBZi҄8|G 3TN?{nHQEVXQ{nS!^}B˵}EٻwʷOQ{snazS.vmԒmr$CX 7&TLESBю >,2܆ӨK-%+BRzG.0h۽{ K[VKW{:PK؆OYA*2Nq^==$vW)e.bH4!%RyUuJۭ1~jjWT\a3찢rT@+L7 N1Z4#gVٿ%Y/"#Ai[K:ХIP 5??KlTҚ}CW2 ! @w+ZY#/K*Z~Zfhzy?4˧76[l5ї!R*^N8HI:'d6ݸ5 9aV ')ۍ2tO4onyٰxR}EٻwʷLڟUY]Erh1TN$y52L#ڍMk % @wҧ˃-#{醕nJw(B7wW-[mڙsq&!ZטM`edd3&R=iEX#- ABHT {FEZ>?>RbR+SnpRRn#YBa$604Ŧ9L]G%交a O@-DI$bDElѺ^;xMd3&!8ÅrZP 85,k2&r`` ~;mMO4'(ZBB#;QVb''qqvL5)ۣ@>[|8Rdq呝4Ֆ|Y5nCHY_A tWϧ_N1q~TBd:]qd$EHH01 u)`#mb:[y8դ^ˢVcUi-PG5R-jDIY .?ΤA*QH͡Z {.WGaĚaEi:a*ZR,Hѿ)F ( C߿7qW)/q~Uh!ea>ݻ[WcM1bI\#.u쑀(Q=5/'^|uwvv߻;u.L6`ܘqxR@<ՑKJrdDqw<]ukwFX}7ػK<:^-C=J>ۋh9 i.jR HvCJC) `uamMn'"F} -paȵͿgF҈vKyv]`8=8%*J'#6hi':ojQu[v0J^'*H) meD$GL jۘ(rr0>Mz2NnE5vƊɿ:O:OptŲxfxȴS>IRXPT99NzZ so3V6ٹJ\Pڔ#x&F6+|Wc~mrY`ߓݓQn.&.5w-}8\qĕW^jIk (= yJY*uH}BT'(>cIru4-PbAZJ"qH>˶;S#DCZm Il+VI8#cHۛdScBa\PwczVzk6uMޓ6#V8KŻ] UK_GOGQ56iI_}KpzYhB!K# ;g>ђ~ۨ^ul+@OvkpF1MѦ>v}i.=W(:R)JJQ c^daJwSrԺfo%ȱe)sZ}h q $(d cCb{%W6czһ2z$ =J@QC4E^ܯVEPMu ҂B=)@pzt콬z_ik{=Z8/yc@Kr-SGܸ̼ش^lyiEp9=koQ{nUݬګ~C1M"-@Rdp^Z߿7qW*kݹn]ZQk&P)>'0=˦ono@m{({7 ւuKR *$.«ۮwʷO\Dd^OlR\ǴR gݒ]Fee|]%Kb;C!2Xj,ZGK8֥GҜȷT27/ IiN3*2q{Rh$ 993./ \n=~/_c!Em?6F^H rBqZ"oNMW,c N}0럙S#'k8D1kFc՝q0B=rZ:rZXYeo;k]K/OGjBC)ȩwR䋗7.lro~롇& ĸ{4N.=_/[Zwz\4[ lIrb*˩ ;@ f~f~fJHz:ƅ&:lDZ퐀uJ lz_nӯ'Ɓ"t0tiCEMO%8p2Tm/-8H%`y}[52aL+}i89e|U|[n2ޞ\ԉN0aE!G%Xp֙vtĄ':uJa0-I J},$p:ba Qf'/]⵨͇iXKKoZ婈ad!J2%S@c9ʀjݹSf6I(q{IMrLvJZtYZA :zwT./;OWkBz_n|tH;l~}|tʒ]h#@UZG*QTs|**ƭr󣗝]G*Ύ^twƎ_i =~u<8;-ĕdt@o mgUȚS-ږ럑[A@UڤI8XNOwtPcRoM = nl^#I^@C͸ÞsCkQ'>$c6s~&s1XpRˣ +QF=egSi,][2!$#W,$qޡR~.چsY$6„6_"bq]V"+)=lޯMS|*>a_ Ip}=ura6@*[nUYpa"+˝fܻμVΫ,.}VvCp'n?,9}VvGp'n,4{gGo~[YxH{l}tQ.L{QwxUҭxWӾbx9ծTr pm-m)-qGN5mNN5)%T0 25֛-ŷi}+Y/< Vˍ(qK9@H84dgnr򹻑*䩐dƊZB!V+-iG@Wztb-UybڔYŭS*JN}A>Ty/99ADUj myF{єmW±[mWmkL4q6% g~ҀpA 9E]Cگ#'`f;c;[$+`(q*8_;9=,V_Ey5zv٨7YZq٧ܯPd CVd=h})vQ -ގKi'Qz\S-bkx(!VfR[ͩZi ̸q /q%G ''A]RUX*uMm-,ko uVJtr -P_2i4Of0qmH'^5ފz11Ys${eg=ssX3;sjvoUFDy=_AyHBNDgfBш!HHzgO}9N»ucٕG6VQʶ ?:9ծTr |՝9N|#|r=Yvce6zӿ/:EM=of؜ Yɏj+* Tv*HW3Q[~h$*G*Wh|QoN\yQʬ|mxI*?8_})^sA^=l X51es{ʣm1O Ŏ!+O#X|!mg&}g2huЦK-Ԅ>#?Нn 5b}G*~TGCQ%CkWUiTnQΗ^n}浯]澼l{*`K} 9QJ)I)'&} Vy/uZ`Sz $]',1ɥg,qeS/ RO2)g,9G7BYKSj '98*>=՗ 7vMr <%DЊ½8ъ[ƒYՇt o}Υ=ߞYIq?-JvߡџR.ۤ!z Ba}8 }O:N=!=++qɷ Bb1VK)^ RUi{GϱcFଙ}Ō*1^+ERz 3,$qVYSIw?zKrRsZ"5 S`xK->Yhs|H+Զ?pg+OZR.lwԮtxn~vQ%5EW믞hظzФ⭕hXDد}ה$\6zl ^c ʛ %*zOBޭ^i52d RyjNw8Qs5rӮҖ]PyȄʂ V1Z-G5P. .qrp5o2ny0K gKV5<;H3]vJA.e]3zx}սVrR$͞i3ދ SpuRGb}Rl[Z)D FݛMp 2%kri ҁ! 5!MΧ=>DŽ굩NqOx~yU 9H:@jx+Jӱr= [U=<=CHR:umVB6iY. !O,֓|>9[4OIKϑ}}~Wk8gwclt1I3~ӓ+#+ЩnIЪW 3ڧn9 UGiU\{zN-[qG'[U1o&"=\G> WǸ?bݧ6F-6[ -A{m?uX^7"P8_}3b_Cim-Jc yEJ9T|k^&G )HV.xZp&Lx xJ@𥉉I= Y pYmx{-} U^+N(Ҟk*I'I%/7-Sqe* p&F@EvSJJRJg)9湱9vv:.FT^ws!'mN+\KG"=ƔvR4&JôBd\[RX{@2D ]WwÊ1LH=ڋiX޲jc/t66rFzzSahG )|b2Ĭ(c^j+TkKs IG6^h+OTR圭((mtɌa bLe,V<43nf_qz) &a/r8fg ^N$u75*SgFY#$syw pƟXOVo¶J_jH+˩S%*Qt[6Fol%hзQnoКZ|RRk2H?"Ӻ8rg4G9-whVnK\\U`tǐkhK^ۼKcuQ-I 䃂HbD'k*eIy1t'֣ka+J-eiuRP>"` LG¹Nn XL~Q-O=׈6#O$xg!I5Ӆagf0zpq g9QǗZגe#ߊŒ^^u ﮯ'!5RrzUIP'I%yIy^ yh݊w?{ p#kHǙIU%]ʸT?(3<|I[#NԿVvtbA$<꺑]FJM8QWQ?WGTn *ŦBTz=Pfk;m:>n[BB^RcωﮈWv"t0h+. }nC:2sn5)iaDOAӠunaP}S'x} cJm~#8>Z-:EsQ?l]ڀs'+YPgg,:W*ZiSU,5UT[9)I񪨠s[m3? ѲLybM DUJϫB/iOT`t=¥7mӨ6 ,xV!G?YWɤЖ?>ւ3$+2+.2ӪҲ<n IJa'\c]b۳r2AHS# u$p:m)Rʗ KVz)aH#+%W{,vGsEQR{^];W c4z@*$5M92-!JSӧWeI[J|+՟Y:٬!iXC$i?T"Q'6 %P}U@ ԣ t/$wጐ[yJ?8-U_㧋mO P+"c[ WClAQ9+UNjn\RV .9`V+;71@Ow)܅k2vG_@tIn3O.VEY2=kRJS^r5=(J!]q3ajNU*uTrVq^ )/mC%@^+Yo>xv$rmv0~t'gt=ɨnu5Qj+=Pqm |!iI +G7Meњ̊:'kU9Kޣן]q&oQk.<{fNɫ]?.:%]{'dtnG}VÁ)qQdxvz-`xu9=y)]rR9?}axgpR0<"␶=E[ojew06_j8%neIk%w3XiDc,)!NIF*QHMB:>XRXR2*,IRХd;B_uj+\8uaX[*=x]iR:UBkjd,y$sQWJʽ*ȠTyf])3yA|Yl͖8?0>]q'%`tSX>5d*IJǾ)F** N T֭ lҊCRT=1[H dhEkmÃ?}!Xuv$8YPz㼜}jQ-fuZޝk=DԸύDn;hd9찇p~^ƌOH j=؍bՏߧ9G-}4Q*"}I$vZG6 Dm+ qi]Msaqs6+:( Pk:7NN^dU%uhT߅SbPyd>5I_*@:n8릲sIĿ[]4{z3?f=|)I P~] [c2 υyȦcTF{J1W^sȬ~=V5~]dTq/oVf& {վO fįAM+Qxe:yV5YOʿuz=e#Y{*ԷC^nHfs#23\q9s[w7Po8ϼf~90ve0x~97Xavh@vmAYiw?`u 暂{Y7)v<hgk{)Ddj餲_?)3R dxZX4޽^@Kq津${±d֕H8Eqgu.p㔥|?*V[Q.6<|ԏ'. L%}Tm7 ,<NB~+z2K9 I*(~QÒrK3IF&.UoܱIn֋TqYfp;QOBQv6Som?ٺ}!$qJ́ލZ֓zzvLj̷\e6iJ RA=#5=[L\īkl{ڕtКΫS|!7d1ͭCe{4''ᎽҼֹ&$ͥ(=Iʒ:m!%]'^Ǘz\6n\w^s -EkSZQm}¼PsjK!AHq!IRNA>uW%WGJu[THZǙ5agP&mC @\ O'&6 C|v{{E;59NJA'J ʙ#]1XWp$)8=:27+XY쉍q=7# ]!)\o~ܔ½WMH[HS{Qn~ְ6"v5e`KQBz+N+u'[̟T_bsmкfqjuDm% dTӿg*R92k`Ȯ^NGr(ZZS%”C `|*ӟ䴼0TV luk|0O^cj(֖ ۚ +<|!%*:>5+z&f:O$|몊Kx^H[G>Ue1C>ٔ%`,u>ͽr6h@#*j4O2H%(j rY98` RQ>#[mκ!dtX2(^?آpR 3Яsv\,PTc>?V*Hfu!AY+YIH>bV>Sw'*j_/W"JYͯ'IzM ޼aQ"rYJ4 @p3\~W'5$<<$(Oh@RxtW!]H8JjP^׸Tƫj!2՜5l6gy kւ}L"&zp}o\]l!ֹ86ȎwKNN\X[AԠ=~㦿i6[nZsa>d]+Zz#=:VmGٟWGt؁Gw7Ou#A#囧mekJk]5ON[Fuy*VpҎI }eɬ5GNMH\[ ,mC~DU!n*={fs_1IʵH%Zۖ䥠d$tJ_U1~c4~N:iI)'+STկsCi|қ#r/6*lDru>9JIϴ$ck6im-ߧ-v֢Z>_n'-jVJ`z?T N0M2`L^ݮajC#O&7T=++W{"48o5pQK|i LtsukJz%>ȨqcΔTyƐҁV=:c=H΃ML2$r=}ԎR 1@J1Y,ՙx.@D'0PH ]OJY;<3,_K@L֔iSmb_uޠp!)$wrOA\raibҋt0Q=Fp\OФ]m»:۩ 6:gz1ljCN? ke'#=J_SZ]`#õOﬦq˟BkX'O ;T;=DG)9&;[}OLDeH pT$S]$6MI#]r ޣ0R< ^k%*ysʢ{AR.)|N4`f Ӟ,ZlH}VZ*S 8!X@tT{|BNNY]!#-86k'mI JGǵu߽oRHӧKȍr~r`mq*уt}I䵨8s_>r4ms^[ھx 8ˮԥ@deyEVlVUģ'fC `\.))N@d#N.2Hυa\k<++=1BF2{+W-ӕ R6ką+ 4U6[TFTһSi)?v+j7)zUĥ8xSۿJ.:Mk?y:(bRgA^iGd1: k.Gx5T1VFGo|wg@8Hs]ta(bMT`[8o&4gpH>QJDi6[V߆ir?cov޻ݯy:(t#ʴE.ޯ{Oue[cy3x:(xHn(ךc#gtt-jXNJkLbqe) $hङ&_Ahttp://www.mshale.com/Media/24/jpg/2008/5/realtorbanner052708.jpg qrUtO
    _adDisplayFrame11_Rhttp://www.mshale.com/Monarch/Widgets/AdvertisingWidgets/AdDisplay.cfm?adID=26800F L qrUt_ -->_Rhttp://www.mshale.com/Monarch/Widgets/AdvertisingWidgets/AdDisplay.cfm?ADID=26800F ;Oqbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR VServer]Last-Modified]Accept-RangesTDate^Content-Length_Content-Location\X-Powered-ByTEtag\Content-Type_Microsoft-IIS/6.0_Thu, 03 Apr 2008 21:12:01 GMTUbytes_Wed, 17 Sep 2008 20:05:53 GMTT3225WASP.NET_"b2a35ccf95c81:4963"12effg6_NSMutableDictionary\NSDictionary12ijj6_NSHTTPURLResponseInternal12lmmn6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135sx   &49H[hmz$),HMQeosO GIF89aZ33ffff!d,Z0I8ͻ`(dih*A45ȣ |pH,O,Y^t'(sJZجv'zn@:T| ,vr}8(Rz3}y=\- u^s=d^ ^}/ӫ^,;*Ld,4vٸ)x:HqYZBbŋܸ4n65@yHb\70cJ T60yN?[ ḍ 䂠 TXRkG}pf *vYʶ%^TJm&e-enn BUaZY, uȸyhLq%{=0 UO1^M4hU@hpIi@ͺoa {SքQ9ANf t-Gw.`44H|<<{8%Ѷ#7(' sSpՕ|8(`y/@HwXt{Gy`qw{GUb+jhƎHbA9N L,B`xIf5iCWS`QƕfhjKeJHȆ͛q|F<H'H!$9E:bb0X֍yIIoΞ9W !b衒Sp=y*'0SHE< |ã%E+.5 Vr@0"RZnR+.HGưD*_"c&9Cycº|"in+"xB> /,)蕏 ` !4BB0r 2pʯ{|ЛpgR7  Q(  M9 csR;֠7t(t`;@5P3cGʕj36Tui6/]4l *D_6׭H ٸ7ErY-`2e,zhSXޠicD׽r酤KڸkvKxz ;a9 cO&̷: 7_ʶݐA$ _oY>v~K3s'rOL$)AE@{W/ƷmLN새ocݕ0ZyFi@ vd(`v(bVhDXKJ9*ZVtԳb%%:ͯ0Lh҇@$Ib A2* JE8dQ1N$@3OIJE`SV! Ȃ CeRY( |NZ؎ אO @?f/%g@>? s=`'c)JX%(z3ax:?l.j& $L|\az_")LD',+) 6A ';=F脡$X )@+ tbJY1P_&tK*;h<b {ˠ̄TͪB1LPts"c4iS‹Dtjv h 7*' $UUOSr;1TAJq ]z`I3ʉ-['Y^ճQā8ǩhvmKYJٷjdز`|OcB4pamfUXb~plf/zN~ֶKϘpǎ[g|PTUD%rq(Ri23?.-dU AE4zi$3zֺ2M-In3B|6CqsJ *ܔnBn{fz"%M#9F9@2 >~K-.ޒp͇=d\v*w)Vq-v!%ʻA 3\i.(_./ )K)sњ}l 6= ~Vrt~{ 7-=Svt}?;bzn'R{-3AO?@~ucI}$;, gxo' 878 Ȃ?^|bZyf2]yY``x瀀YsPfTw~#(xԠz f{ D(,;Ww+RjP|{DPeE8PG4XW 17_S p@*A TxWF[0"SjqnFYzy0nh7qCY`{t49T (|1%8ሟSs!@bN VdhirWԊvHPj R)3=E(H`ʸ }Xqh}H˸(e rWq|%"&؎+jX.Up7D;2fdž<Џ%ZY|z:X#PX"9 I,V<B]39#9BfrEВz3P c1T64jyH"f$2DA%:s?M)HDLpSxfYPIP`OgY!`)ؖp)zlyɈ"{9!B@ƒ' ;_;http://www.mshale.com/Media/21/gif/2008/4/target728x901.gif qrUtO
    _adDisplayFrame9_Rhttp://www.mshale.com/Monarch/Widgets/AdvertisingWidgets/AdDisplay.cfm?adID=26800E!3Ien5.../3}BBBGlggglRuvv&z?js**H*Q.1]f#X##(QQQVbY<YkYtY}]~~~1rVmx-CL K#$$N$X$a(../3344#8:N::?sB&BBGHGGKR<RiRrWWxWWWI;IAIBIvI{IIINuAL?DFOZ}"W./2/=5,5>5