bplist00EI_WebSubresources_WebMainResource_WebSubframeArchives$)048?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR _Content-EncodingVServer]Last-Modified]Cache-ControlTDateZSet-CookieWExpires_Transfer-Encoding\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:52:06 GMTVpublic_Sat, 17 Mar 2007 23:20:00 GMT_=S=blogger=_XlFz9wgc6zgvrm5B_Mi6w; Domain=.blogger.com; Path=/_Mon, 16 Apr 2007 23:20:00 GMTXIdentity12fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135rw   ")7EJU]q~2;@DZglopO/** * Copyright 2005 Google Inc. * Author: Lexi Baugher * * CSS for collapsible hierarchy of archive links */ #ArchiveList .toggle { cursor: pointer; font-family: Arial, sans-serif; /* this font has support for the dingbats */ } #ArchiveList .toggle-open { /* Work around IE's differently-sized dingbat by resizing up to look like the rest of the characters for this font size. */ _font-size: 1.7em; line-height: 0.6em; } #ArchiveList { text-align: left; } #ArchiveList a.post-count-link, #ArchiveList a.post-count-link:link, #ArchiveList a.post-count-link:visited { text-decoration: none; } #ArchiveList a.toggle, #ArchiveList a.toggle:link, #ArchiveList a.toggle:visited, #ArchiveList a.toggle:hover { color: inherit; /* done in JS for IE */ text-decoration: none; } .BlogArchive #ArchiveList ul li { background: none; list-style: none; list-style-image: none; list-style-position: outside; border-width: 0; padding-left: 15px; text-indent: -15px; margin-left: 0; background-image: none; } .BlogArchive #ArchiveList ul ul li { padding-left: 1.2em; } .BlogArchive #ArchiveList ul { margin: 0; padding: 0; list-style: none; list-style-image: none; border-width: 0; } .BlogArchive #ArchiveList ul ul { margin-top: 5px; } .BlogArchive #ArchiveList ul.posts li { padding-left: 1.3em; } #ArchiveList .collapsed ul { display: none; } _:http://www2.blogger.com/widgets/3319451950-blogarchive.cssXtext/css  Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR _Content-EncodingVServer]Last-Modified]Cache-ControlTDateZSet-CookieWExpires_Transfer-Encoding\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 10:55:43 GMTVpublic_Sat, 17 Mar 2007 23:20:00 GMT_=S=blogger=rgmb-LnuVlpReLsZi8CXAg; Domain=.blogger.com; Path=/_Mon, 16 Apr 2007 23:20:00 GMTXIdentity12fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135kpy"0>CNVjw| +49=S`ehpO)/* backlinks controls */ .backlink-toggle-zippy { padding-right: 11px; margin-right: 0.1em; cursor: pointer; cursor: hand; background: url("http://www.blogger.com/img/triangle.gif") no-repeat left center; } .expanded-backlink .backlink-toggle-zippy { background-image: url("http://www.blogger.com/img/triangle_open.gif") } .collapsed-backlink .collapseable { display: none; } .status-msg-wrap { font-size: 110%; width: 90%; margin: 10px auto; position: relative; } .status-msg-border { border: 1px solid #000000; filter:alpha(opacity=40); -moz-opacity:.40; opacity:.40; width: 100%; position: relative; } .status-msg-bg { background-color: #cccccc; opacity:.80; filter:alpha(opacity=30); -moz-opacity:.80; width: 100%; position: relative; z-index: 1; } .status-msg-body { text-align: center; padding: .3em 0; width: 100%; position: absolute; z-index: 4; } .status-msg-hidden { visibility: hidden; padding: .3em 0; } .status-msg-wrap a { padding-left: .4em; text-decoration: underline; }_3http://www2.blogger.com/widgets/2791266615-blog.css Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078Ȁ*+!-.WNS.base[NS.relative_5http://www2.blogger.com/widgets/2097585883-widgets.js1234X$classesZ$classname456UNSURLV%NSURLXNSObject_text/javascript9:;=>?ISZNS.objectsWNS.keys@ABCDEFGHJKLMNOPQR _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpiresZSet-Cookie\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:54:40 GMTVpublic_Sat, 17 Mar 2007 23:20:00 GMTXIdentity_Mon, 16 Apr 2007 23:20:00 GMT_=S=blogger=ofe2Dt46-EGPcAvHzorGfw; Domain=.blogger.com; Path=/12fggh6_NSMutableDictionary\NSDictionary12jkk6_NSHTTPURLResponseInternal12mnno6_NSHTTPURLResponse]NSURLResponse$)2DILbd #/135mr{   &-;INbju?DH^kpspOvar w_Da=this;String.prototype.dc=function(a){return this.indexOf(a)==0};String.prototype.bc=function(a){var b=this.length-a.length;return b>=0&&this.lastIndexOf(a,b)==b};String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")};String.prototype.subs=function(){var a=this;for(var b=0;b=0;c--){this[c+b]=this[c]}for(var d=0;d != <"+b+">"}w_f.fail(c)}};w_f.typeOf=function(a,b,c){if(typeof a==b)return;if(a||a==""){try{if(b== w_f.TYPE_MAP[typeof a]||a instanceof b){return}}catch(d){}}if(c===undefined){if(typeof b=="function"){var e=b.toString().match(/^\s*function\s+([^\s\{]+)/);if(e)b=e[1]}c="AS_Assert.typeOf failed: <"+a+"> not typeof "+b}w_f.fail(c)};w_f.TYPE_MAP={string:String,number:Number,"boolean":Boolean};w_f.numArgs=function(a,b){var c=w_f.numArgs.caller;if(c&&c.arguments.length!=a){if(b===undefined){b=c.name+" expected "+a+" arguments but received "+c.arguments.length}w_f.fail(b)}};var w_W=false;function w_I(a){try{throw a;}catch(b){w_X(b)}}function w_X(a,b){var c="Javascript exception: "+(b?b:"")+" "+a;if(w_T()){c+=" "+a.name+": "+a.message+" ("+a.number+")"}var d="";if(typeof a=="string"){d=a+"\n"}else{for(var e in a){try{d+=e+": "+a[e]+"\n"}catch(f){}}}d+=w_U(w_X.caller);w_da(c+"\n"+d,1)}var w_Ca=/function (\w+)/;function w_ba(a){var b=w_Ca.exec(String(a));if(b){return b[1]}return""}function w_U(a){try{if(!w_T()&&!(w_H("safari")||w_H("konqueror"))&&w_H("mozilla")){return Error().stack}if(!a)return""; var b="- "+w_ba(a)+"(";for(var c=0;c0)b+=", ";var d=String(a.arguments[c]);if(d.length>40){d=d.substr(0,40)+"..."}b+=d}b+=")\n";b+=w_U(a.caller);return b}catch(e){return"[Cannot get stack trace]: "+e+"\n"}}var w_ea;var w_v=null,w_O=false;function w_ca(){if((w_v==null||w_v.closed)&&!w_O){try{w_O=true;w_v=window.open("","debug","width=700,height=500,toolbar=no,resizable=yes,scrollbars=yes,left=16,top=16,screenx=16,screeny=16");w_v.blur();w_v.document.open();w_O=false;var a= "To turn off this debugging window,hit 'D' inside the main caribou window, then close this window.
";w_V(a)}catch(b){}}}function w_da(a,b){if(!w_W){if(typeof w_j!="undefined"){w_j(w__(a))}return}try{var c=(new Date).getTime()-w_ea,d="["+c+"] "+w__(a).replace(/\n/g,"
")+"
";if(b==1){d="Error: "+d+"";w_v.focus()}}catch(e){}w_V(d)}function w_V(a){if(!w_W){return}try{w_ca();w_v.document.write(a);w_v.scrollTo(0,1000000)}catch(b){}} ;function w_H(a){if(a in w_N){return w_N[a]}return w_N[a]=navigator.userAgent.toLowerCase().indexOf(a)!=-1}var w_N={};function w_T(){return w_H("msie")&&!window.opera}function w_Ia(a){if(typeof Error!="undefined"){throw new Error(a||"Assertion Failed");}else{throw a;}}function w_ka(a){if(a===undefined)a="Assertion failed";if(typeof w_I!="undefined")w_I(a+"\n");w_Ia(a)}function w_G(a,b){if(!a){if(b===undefined)b="Assertion failed";w_ka(b)}};function w_5(a,b){a.style.display=b?"":"none"}function w_qa(a, b){a.style.display=b?"block":"none"}function w_ra(a,b){a.style.display=b?"inline":"none"}function w_k(a,b){if(a==null||a.className==null)return false;if(a.className==b){return true}var c=a.className.split(" ");for(var d=0;d/g;function w__(a){if(!a)return"";return a.replace(w_ya,"&").replace(w_Ga,"<").replace(w_Fa,">").replace(w_Ha,""")}var w_Ha=/\"/g;function w_Aa(a){return document.getElementById(a)}function w_Ba(a){return document.all[a]}var w_za= document.getElementById?w_Aa:w_Ba;function w_j(a){try{if(window.parent!=window&&window.parent.log){window.parent.log(window.name+"::"+a);return}}catch(b){}var c=w_za("log");if(c){var d="

"+new Date+""+a+"

";c.innerHTML=d+c.innerHTML}else{window.status=a}};var w_M;function w_va(){var a=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest=="undefined"&&typeof ActiveXObject!="undefined"){for(var b=0;b"+c.stack);throw c;}};var w_Ea=0,w_R=0;if("undefined"==typeof w_j){w_j=function(){}}function w_la(a){var b=-1;try{b=a.status}catch(c){}return b}function w_ma(a){var b=null;try{b=a.statusText}catch(c){}return b}function w_na(a,b,c,d){if(a.readyState==4){try{var e=true;if(d){try{e=!(false===d(a))}catch(f){w_j("Message ("+b+") handling failed: "+f);throw f;}}var g=w_la(a);if(200===g){w_j("Message ("+b+") received after "+((new Date).getTime()-c)+" ms");try{var h=(new Date).getTime();if(e&&a.responseText.length){eval(a.responseText)}w_j("Message ("+ b+") processing took "+((new Date).getTime()-h)+" ms")}catch(f){w_j("Message ("+b+") processing failed: "+f);alert(f+"\n"+f.stack+"\n\n"+a.responseText);throw f;}}else if(204==g){w_j("Message ("+b+") received after "+((new Date).getTime()-c)+" ms")}else{w_j("Message ("+b+") failed with response "+g+" "+w_ma(a)+" after "+((new Date).getTime()-c)+" ms.")}}finally{--w_R}}}function w_oa(a,b,c){var d="";if(b){var e="";for(var f=0;f=0;){m=m.substring(0,n)+"&"+m.substring(n+1)}w_j("Message ("+i+") sent: POST "+m+".");++w_R;w_wa(j,a,d,k)};function w_i(a,b,c,d,e,f){this.instanceId=a;this.sectionId=b;this.markups=c;if(d){this.rootElement=d}if(e){this.data=e}if(f){this.m=f;if(!w_i.IsValidDisplayMode(f)){throw"bad display mode: "+f;}}else{this.m=w_i.DISPLAY_MODE_NONE}this.isNew=false}w_i.IsValidDisplayMode=function(a){return a==w_i.DISPLAY_MODE_SNIPPET||a==w_i.DISPLAY_MODE_FULL||a==w_i.DISPLAY_MODE_LAYOUT||a==w_i.DISPLAY_MODE_NONE};w_i.DISPLAY_MODE_FULL="displayModeFull";w_i.DISPLAY_MODE_SNIPPET="displayModeSnippet";w_i.DISPLAY_MODE_LAYOUT= "displayModeLayout";w_i.DISPLAY_MODE_NONE="displayModeNone";function w_b(a){this.P=true;this.X=new w_u(this);this.b=a;this.q=null}w_b.DATA_NAMESPACE_PREFIX="data";w_b.ACTION_NAMESPACE_PREFIX="b";w_b.INTERPRET_ATTR_NAMESPACE_PREFIX="expr";w_b.prototype.Qa=function(){var a=this.b.rootElement;a.innerHTML="";if(this.B()==w_i.DISPLAY_MODE_LAYOUT){a.appendChild(this.M("layout"))}else{a.appendChild(this.M("main"))}return a};w_b.prototype.Ab=function(a){this.q=a};w_b.prototype.g=function(){return this.b}; w_b.prototype.j=function(a){return document.getElementById(this.b.instanceId+"_"+a)};w_b.prototype.L=function(a){var b=this.j(a);if(!b){throw"did not find element for id "+a;}return b};w_b.prototype.i=function(){return this.b["data"]};w_b.prototype.wa=function(a){return this.b.data=a};w_b.prototype.hb=function(){return this.b["isNew"]};w_b.prototype.wb=function(a){return this.b.isNew=a};w_b.prototype.M=function(a,b){var c=b;if(!c){c=this.i()}if(!c){c={}}var d=new w_h;d.z("widget",this.Xa());d.La(c); var e=this.ka(a,d,w_h.DEFAULT_DICTIONARY_KEY);return this.ja(e,document)};w_b.prototype.Xa=function(){var a={};a["type"]=this.q.e();a["instanceId"]=this.b.instanceId;a["sectionId"]=this.b.sectionId;a["actionUrl"]=w_.O;var b=w_.Da+"&widgetType="+this.q.e()+"&widgetId="+this.b.instanceId+"&action="+w_.EDIT_WIDGET_ACTION;a["quickEditUrl"]=b;return a};w_b.prototype.ka=function(a,b,c){var d=this.ab(a);w_f.isTrue(d!=null,"Markup chunk not found for "+a);var e=d.varName?d.varName:"",f=b.i(c);w_f.isTrue(f!= null,"No data found for call: "+c);b.z(e,f);var g=this.D(d.rootNode,b);b.ra(e);return g};w_b.prototype.D=function(a,b){w_f.isTrue(a!=null,"Null node");var c=a;if(a.attributes){var d=[],e=[];for(var f=0;f"+a["template"]+"\n",c=this.lb(b);a.parsedTemplate=this.C(c);return a};w_b.prototype.Vb=function(a,b,c){this.Ma(a,this.j(b),c)};w_b.prototype.Ma=function(a,b,c){var d=this.q;if(b){b[a]=function(e){return d[c](e)}}}; w_b.ConfigureWidget=function(a,b){if(!b){b="config"}var c=document.forms[b]["widgetId"].value,d=document.forms[b]["widgetType"].value,e=w_g.ProcessForm(document.forms[b],a);if(e.success){w_.SaveWidget(e.values,c,d)}};function w_(){}w_.Init=function(a,b,c){w_.v={};w_.Da=a;w_.O=b;w_.cc=c;w_.Ea=null;if(!w_.W){w_.W={}}};w_.TrapClicks=function(a){var b;try{b=a.document.getElementsByTagName("A")}catch(c){return}for(var d=0;d0&&a.substring(0,4)!="http"){a="http://"+a}return a};w_.GetFirstElementInElementWithClass=function(a,b){if(w_k(a,b)){return a}if(a){var c=a.childNodes.length;for(var d=0;db){return LayoutsMessages.NUMBER_TOO_LARGE+" "+b}return undefined}};function w_h(){this.h=[];for(var a in w_.Ea){this.h[this.h.length]=a}}w_h.DEFAULT_DICTIONARY_KEY="";w_h.MAX_DICTIONARY_DEPTH=50;w_h.SEPARATOR_CHAR=".";w_h.prototype.z=function(a,b){if(this.h.length>=w_h.MAX_DICTIONARY_DEPTH){w_f.raise("Cannot add another dictionary: "+a)}if(a.indexOf(w_h.SEPARATOR_CHAR)> -1){w_f.raise("Cannot add dictionary name containing '.': "+a)}var c={};c.name=a;c.data=b;this.h[this.h.length]=c};w_h.prototype.ra=function(a){var b=this.h[this.h.length-1];if(b.name!=a){w_f.raise("Dictionary "+a+" is not the last one, and can't be deleted: "+b.name)}this.h.splice(this.h.length-1,1)};w_h.prototype.K=function(a){if(a==null)a=w_h.DEFAULT_DICTIONARY_KEY;for(var b=this.h.length-1;b>=0;--b){if(this.h[b].name==a){return this.h[b].data}}return null};w_h.prototype.fa=function(){return this.K(w_h.DEFAULT_DICTIONARY_KEY)}; w_h.prototype.La=function(a){this.z(w_h.DEFAULT_DICTIONARY_KEY,a)};w_h.prototype.i=function(a){var b=this.K(a);if(b)return b;var c=a.split(w_h.SEPARATOR_CHAR);if(c.length==1){b=this.fa();return b[a]}b=this.K(c[0]);var d=0;if(b){d=1}else{b=this.fa()}for(var e=d;e0&&c[0].currentStyle){d=c[0].parentNode.currentStyle.color}for(var e=0;e"+e["title"]+"";c.appendChild(f)}};w_d.prototype.Ya=function(a){var b=this.b.rootElement.getElementsByTagName("A");for(var c in b){var d=b[c];if(d.href==a)return d.parentNode}};w_d.prototype.jb=function(a){var b=a.getElementsByTagName("UL");if(b.length>0&&!w_k(b[0],"posts")){return}var c=this.$a(a),d=a.getElementsByTagName("LI"),e=d.length;return e-1};w_e.prototype.ma=function(a){a=a||window.event; var b=a.target||a.srcElement;this.a.r("nextposts",{path:b.href});return false};w_e.prototype.Oa=function(a){var b="";if(document.selection){b=document.selection.createRange().text}else if(window.getSelection){b=window.getSelection()}else if(document.getSelection){b=document.getSelection()}window.open(a+"?t="+encodeURIComponent(b)+"&u="+encodeURIComponent(window.location.href)+"&n="+encodeURIComponent(document.title),"bloggerForm","scrollbars=no,width=475,height=300,top=175,left=75,status=yes,resizable=yes"); return false};var _BlogView=w_e;function w_o(a){this.a=a;this.b=a.g()}w_o.WIDGET_TYPE_NAME="Header";w_o.prototype.e=function(){return w_o.WIDGET_TYPE_NAME};w_o.prototype.k=function(){return false};w_o.prototype.c=function(){return this.a};w_o.prototype.d=function(a,b){this.a.f(b)};w_o.FilterMap={title:w_g.GetRequiredStringFilter(),description:null,securityToken:null};w_o.ConfigureWidget=function(){w_b.ConfigureWidget(w_o.FilterMap)};var _HeaderView=w_o;_HeaderView.prototype=w_o.prototype;_HeaderView._ConfigureWidget=_HeaderView.ConfigureWidget;function w_n(a,b){this.a=a;this.b=a.g();this.Tb=b}w_n.prototype.c=function(){return this.a};w_n.prototype.e=function(){return this.Tb};w_n.prototype.d=function(a,b){if(a=="configure"){this.a.f(b)}};w_n.prototype.N=function(){return this.b.data["content"]&&this.b.data["content"].length>0};w_n.ConfigureWidget=function(a){setFormAndSubmit();var b=document.forms.stuffform["widgetId"].value,c=document.forms.stuffform["securityToken"].value,d=document.getElementById("hiddenTextarea"),e=document.getElementById("title"), f={content:d.value,title:e.value,securityToken:c};w_.SaveWidget(f,b,a)};function w_L(a){w_n.call(this,a,"Text")}w_L.inherits(w_n);w_L.ConfigureWidget=function(){w_n.ConfigureWidget("Text")};function w_K(a){w_n.call(this,a,"HTML")}w_K.inherits(w_n);w_K.ConfigureWidget=function(){w_n.ConfigureWidget("HTML")};var _TextView=w_L;_TextView.prototype=w_L.prototype;_TextView._ConfigureWidget=_TextView.ConfigureWidget;var _HTMLView=w_K;_HTMLView.prototype=w_K.prototype;_HTMLView._ConfigureWidget=_HTMLView.ConfigureWidget;function w_s(a){this.a=a;this.b=a.g()}w_s.WIDGET_TYPE_NAME="Image";w_s.prototype.c=function(){return this.a};w_s.prototype.e=function(){return w_s.WIDGET_TYPE_NAME};w_s.prototype.k=function(){return false};w_s.prototype.o=function(){if(this.b.data["resize"]!="true"){return}var a=this.a.j(this.b.instanceId+"_img"),b=this.b.rootElement;if(!a||!b){return}var c;if(document.defaultView){c=parseInt(document.defaultView.getComputedStyle(b,null).width,10)}else if(b.currentStyle){a.style.display="none";c= b.offsetWidth;a.style.display=""}else{return}if(a.width>c){a.height=Math.round(c/a.width*a.height);a.width=c}a.style.visibility="visible"};w_s.prototype.d=function(a,b){if(a=="configure"){this.a.f(b)}};w_s.prototype.N=function(){return this.b["data"]["sourceUrl"]&&this.b["data"]["sourceUrl"].length>0};var _ImageView=w_s;function w_$(a){document.write('

Friday, March 02, 2007

LEAVE OUR Language ALONE!



Toby expresses his objection to the fact that some hearing people are trying to change our language. Please DON'T change us and our language! Check out: Peoples Sign Language. You will understand why I wanted to express my objection after you view it!

47 comments:

Luis said...

Thank you for your sharing. I find that is very repulsive for her to invent a new sign language, PSL, in order to make her special person. I think she is ignorant. Her new sign language PSL is simply very conspicious to oppress to the deaf communities and ASL. My simple question: Do Deaf Communities embrace her new sign language, PSL? For me, I don't think so.
Is she hearing?

Luis said...

Thank you for your sharing. I find that is very repulsive for her to invent a new sign language, PSL, in order to make her special person. I think she is ignorant. Her new sign language PSL is simply very conspicious to oppress to the deaf communities and ASL. My simple question: Do Deaf Communities embrace her new sign language, PSL? For me, I don't think so.
Is she hearing?

Michele said...

A-W-F-U-L!! I could not bring myself to watch it anymore after a few minutes. Her signing for Parent is really awful! Whats more, she is deaf, not hearing as she stated in her website. She also is not signing in ASL but in Sim-Com using English and signs together.

Michele said...

See that statement in her website -- she mentions that she has a hearing loss.

"Artist Statement - I have a profound bilateral hearing loss and live between the Deaf/Hard-of-Hearing and Hearing cultures."

Anonymous said...

Thank you for your wonderful vlog and warning us about "PSL". I was so digusted. I totally agreed with you! LEAVE ASL ALONE!

Thank you so much for boughtup "PSL" to deafread.com It is important!!

CMS from Boston

Lisa said...

Thank you very much for letting us know. I had emailed her asking to LEAVE ASL ALONE.
ASL is a MUST. I can not tolerate the new sign languane!

Melissa said...

I am going to try to see from her point of view and myself, as a feminist who want equality.

I can see her "points" but she does NOT have the power to change ASL.

Look at DeafMute - it is something we all discuss and debate with.

Not ONE person. Nope.

Personally, when I analyze too much into things like "mother" "father" "girl" "boy"

If you think too much of it, it is NOT equal but that is how ASL works.

I'd never try to change ASL myself... but I do see the reasons behind it, though.

I want female and male to be equal and also in visual.

Again, I'd never try to change anything like she did.

It has to do with history.

Who has the power to change the history of ASL?

I don't think anyone wants to do that... and I think that's a mistake she bought up.

She could have used it as a discussion, but NOT to promote it and calling it "Peoples Sign Language".

BEG said...

A couple of thoughts:
First of all, she is deaf, as stated elsewhere on her website.

Second of all, there's nothing here that isn't the same kind of thing that SEE, PSE, etc attempted to do and failed; people have been trying to change ASL for over a hundred years and they have not succeeded. Change comes from widespread acceptance by native speakers. I'm reminded by ongoing efforts by various people to create gender neutral pronouns in English like sie, hir, etc -- all of which have been wildly successful (not).

Third, though, I think she does bring up food for thought. Not to change ASL, no that won't happen, but to increase an awareness of some aspects of our language. I think it's useful in English to debate the effects of the default being "him" -- whether or not we change that. Likewise, I think it's useful to be aware of the power balance represented in using upper half/lower half representations. Language shapes how people think; it's important to be able to step back and look at it critically, I think.

Finally, I'm very much amused that I picked up several ASL signs from her! Her video was very simple, direct, and slowly and clearly signed. I was even able to lipread most of what she said in order to pick up individual signs. I love the irony.

Anonymous said...

Whoa whoa whoa.. PSL is horrible. I am going to email her and STOP this crap. Her signs are stink. That made me real pissed off about this. I agreed with you and thank you. Her email is mjregas@calarts.edu and tell her stop it.

Anonymous said...

Looks like that the so called People's Sign Language was founded in 2001. 2001 was shown in the end. It seems that we just found that out awhile ago so obviously that the People's Sign Language isn't as popular as ASL.

Julie B.

Anonymous said...

PSD REALLY SO UGLY !!!!!!!!!!! LEAVE ASL ALONE !!!!!!!!! ASL POWER !!!!!!!!!!

Toby Welch said...

Julie B.,

Yes, She invented PSL in 2001, however, she is still publishing on her website. She posted to Xanga.com. I think she removed it last Wednesday. I don't want her to spread her video to people. That is why I shared with you all.

Brance said...

Oh Please!
Give us a break!
because of the power of Blog and/or Vlog from Deaf Community we can pour cold water on hearing people's ideas or invent any kind of commuciations for the Deaf.
Thanks,
Brance

Billy Koch said...

I'm sorry I was laughing at the video. Seriously PSL will NOT pick up.. There is too much time and tradition put in ASL. And secondly she isn't even a communication major, nor any kind of phd individual. So, I really don't think ASL will be threatened. So relax folks - let her keep showing the video on how challenging her signs will be. Because you know no one is going to fall for it. I surely ain't. And if you do a google, you won't see ANY Listing of People Sign Language - all points to ASL or British Sign Language. So relax folks!

Jac said...

Thank you for letting us know. I watched her PSL video, my mouth dropped out! It is hard to believe how she change our langauge on her own that she can think it would work for her art! PLUS I noticed her mouth as almost talking more like a strong oral with language sign, it is hard for me to look at them. I am really glad that you did email her plus all of us did not please with that so I agreed with you to leave our natural ASL !
Thumb-UP!

Jon said...

Toby,

Should I worry about PSL.. hmmm.. No!

First time that I saw it today! No one bring it up in ASL community since 2001!

I couldn't understand her by ASL+PSL+SimCom = What?

Kenton said...

HUH?!? Excuse me while I run to the bathroon to throw up.

(BAAARRRFFFF!!!)

Better now... oh no...

(BAAARRRFFFF!!!)

I'm all righty now... oh no, not again!

(BAAARRRFFFF!!!)

(Dialing VRS to call Doctor...)

Doctor: "This is Dr. Know-Everything. How may I help you?"

Me: "I think I have PSL virus."

Doctor: "Oh, sorry to hear that. Cure is to sign everything in ASL twice, and call me again in the morning."

Me: "Thanks, Dr. Know-Everything."

Carl Schroeder said...

Toby,

PSL is not innovative. It is a riot! I'm both amused and not amused. I laughed because it's silly. I was shocked...it's like trying to change the English words for parents.

Father begins with voiceless consonant because in the past he was always away from home to hunt so he's not heard. Mother begins with a voiced consonant because in the past she was always home and talked too loud. Now these English words are changed to make them more mutually responsible. We can say rader for father and roder for mother.

See how crazy I could become?

LOL, Carl

Anonymous said...

maam, i find this ain't funny at all. where in the world did you find the PSL information from ? how are you going to change that from asl to psl. for your info. i have no idea what your are talk about. change asl to psl is NOT going to happen period! what are you try to do? destory the asl and change to PSL? oh what a disgust, my kids don't sign 100 perfect but kids try their best and it will come out better result but will i tell my kids, my family, and even friend and say, that wrong sign this. that really insult. what a sick i can't even explain cause i only watch half of it and i say what the (beep) is this. i can't even explain as you just saw it! man that piece of crap! sorry if you do not like it but i find it so idiotic to change our culture of the asl sign. again, it is so sick to see this.

Lantana said...

Gag me. What is this woman's motivation?

Reminds me of when my school required all of the staff to take Total Communication. The final results? Mass confusion. In the end TC messed up the whole language!

The woman in this video is dangerous, avoid her.

Dragon 21 said...

GOSH!!!! I want to scream at her. NO NO NO NO NO NO NO NO NO NO NO NO NO!!!!!!!!!!! I just ate my lunch and I almost puke!

JD

Nick said...

Unbeliveable to watch her video! My stomach just started to growl.
ASL is very precious and beautiful language. Thanks to Thomas H. Gallaudet, who brought Laurent Clerc from France, establish the combination of French and Martha's Vineyard into American School for the Deaf. ASL are still used by deaf and hard of hearing for over 200 years despite of the effect of oral methods, SEE, Cued Speech, etc. Also thanks to William Stroke, who discoverd ASL a true language and the lingustic founded in 1970's for deaf and hard of hearing professionals.
To this point of PSL, I regret that this language won't fit into our society and language. It could have misleading among our American people. She should have attend Gallaudet University to see herself how much deaf and hard of hearing use ASL on the campus.

Nick

Anonymous said...

I find it interesting how we tell hearing people to leave our language alone, then we sometimes adopt a sign that was invented by a hearing person. One example is the sign for "vlog" (two Ls coming up like a picture). A linguist told me that it comes from the CSDVRS interpreters who always explain at the beginning of a call "the caller and I can see each other on the videoscreen". Watch when they explain it and you'll see them sign it almost every time.

drmzz said...

Crazy. She misrepresented ASL with SimCom and this silly invented language of hers. Totally nutty.

Oscar the Observer said...

If hearing people can not change male vs female or man vs woman etc etc, how can we even bother to start with our own language too?!

*shudder*

But one person here was right, we can not really worry too much since our language is to much set in stone but I agree we need to fight to make sure traitors in our midst don't sully ASL!!

Anonymous said...

Oh jeez! I cant believe that!!!!!
How can she do that without deaf community knowledgement until now.

Anonymous said...

Find it very odd. Never see PSL before. The way she talk orally and sign language at same time, but oddly enough not make sense in a way.

I embrace ASL is so precious in our (deafies) language.

Thanks for the sharing with us.

Barb DiGi said...

When I first saw of it, I thought it was pre-April Fool's Day joke that must have belonged to deafjoke.com. Oops, wrong me!

By the way, she claimed to have a hearing loss and lived in both cultures. It is obvious that she hasn't really experience to be immersed in ASL environment. It is also obvious she lack the leadership skills. So let's just take this as a joke not a threat cuz it ain't gonna change ASL!

Long live ASL!

Anonymous said...

In Few Seconds, I sudden dont like her language! NO way...I dont want to learn her sign language!
This is very stupid and ugly..with both half side of face, even use the sign for gay and lesbian..
Threw those PSL away!!
STAY on ASL..STOP CHANGE OUR LANGUAGE!! ITS OUR DEAF LANGUAGES.
I cant believe what I seen this PSL. How can She make those PSL?
(From other PLANET?)..as PSL?
My Heart Belong to ASL. PERIOD!!!

William said...

GAWD. What a witch. Best to email her at mjregas@calarts.edu to stop immediately before she took off to the wrong message via net or live stage.
The vlog will be the most powerful msg in the world. Anytime, people will see her vlog. The hearing ppl will get the wrong msg. We cannot let this go til we e-shout nicely. She might be stubborn to continue, might be difficult to remove her PSL worship. There is a sign of warning. Who knows.

Carol Randall said...

Hi there, I was so shocked and very disgusting about Melissa's stupid idea about PSL . I feel alike yell at her, NO She could not JUDGE Deafies's ASL ! It is NATURE DEAF's language !!!! RID OF PSL !!!!!! I was really PISSED OFF . I noticed PSL seems alike Homemade language . I could not accept that kinda of stupid PSL !
Thank you,

LS said...

Hmmm. Strange isn't it? I don't find her as threatening but as an artist expresses her idea.

PSL equals PSE. It will never materialize before our eyes. Let her enjoy promoting her "artist" expression. In time it will fade away quietly...

ASL is my heart and so are in everyone who embrace, love and cherish it.

ASL forever!

BEG said...

Anonymous on the vlog sign: The natural thing in any language is to grow and borrow. Just as in English we have rodeo, wrangler, cowboy, ranch, siesta, chocolate, tomato, etc, from Spanish and Native American languages, ASL will incorporate signs from a variety of sources, in the natural course of things. What will ultimately settle the sign for "vlog" (I have seen more than one sign for vlog, including a tendency to spell it out as well) will depend on what the preponderance of native speakers decide. This means ASL is still in the hands of deaf people.

Words have to be added. I'm sure there were no words for "computer", "TV" etc back in Gallaudet's day. Languages are organic this way.

What Melissa proposes to do goes against the grain of any natural language. Consider all the attempts to regularize spelling in English -- all failed. Consider the attempts to regulate "good grammar" in English -- okay, the subjunctive is going the way of the dinosour despite the best efforts of English teachers. The list goes on. What is key is how the language is used by its native speakers. Imposing something on a language simply doesn't work, and this is true for spoken and visual languages.

Susan said...

It was depressing to watch. :(

I understand how you feel, Toby. I'm with you.

Anonymous said...

Hello ... today someone just inform me about PSL i was assuming that she was talk about PSE .. but something tell me it isn't right .. so i decide to check this websites and saw welch's websites and listen what he had to say .. then check on PSL and at first i look at her sign languages as PSL it doesn't show any expression like ASL does... even her sign languages doesn't make any sense as I can't understand why is she try to change the Sign Languages ... I admit that i use PSE sometime depend on the socially.. but I most common use ASL .. at first few min and turn it off it make me sick and non senses at all... I would like to see her video to be remove and find her and protest signs post all over her front ground to say ASL is the only one for whole community no matter what !! nobody can change our cherish TRADITIONAL ASL !!!! sorry Melissa .. ur being third strike out !!!! show her out of the door !

Micah said...

Hello! I happen click the website, turn it out it's not working but I figure it out to watch the video. I had to agree with everybody here, it's really destroy our deaf culture. Who would want to learn the ugly language, NONE OF US WILL HAVE THE GUTS TO DO IT! We cherish our deaf ASL language!

oh wait.. i feel something missing.. let's say something

DEAF POWER
DEAF POWER
DEAF POWER

That would enough for everybody to hand it out!

Anonymous said...

Hi there.. Yea I can understand how Deaf feels when try to change... I went thru the stages myself when I lost my hearing... but I tried the link and I cannot access it.. It's say it's error and not there.. So, but I read the comments that others has left... I total support your idea and I understand... Why should we change to stasify others? We shouldn't!

Anonymous said...

You can see the video of PSL at

http://fookembug.wordpress.com/2007/03/05/is-she-trying-to-destroy-asl/

ASLumabas said...

Check out mine. Hope it helps you calm down smile. I know how you feel. My power to you.

http://aslumabas.blogspot.com/2007/03/psl-vs-asl_09.html

DCABlogs said...

I am glad you did this Vlog.. Check this link...

http://deafaware.blogspot.com/2007/03/audism-in-change-our-language.html

Toby Welch said...

DCABlogs, thank you for link to your blog. I pray that PSL will not spread and died itself.

Anonymous said...

Rethinking the Sign for Therapy

http://www.ascdeaf.com/blog/?p=232

Anonymous said...

Hi I am from Green Bay, Wisconsin My name is Monalisa Smith. I would have to agree with the words ( LEAVE OUR ASL LANGNAUE ALONE ) I am deaf myself I learn so much in deaf culture when I move here in this state from my orginal home town South Carolina to learn the differnce between PSE, ASL PSL SEE I would chose ASL they r so fact there that what most deaf people use is ASL period I love it and its gonna stay that way people who try made up thier own langanue shouldnt bother our ASL pls leave our ASL ALONE PERIOD !!!!!!!!!!!!!!!

ronald allen of washington said...

hey!she been more like New Ages so stay on asl period. United State can not change English so same as asl can not change.After i watch this boy! She drive me crazy and scared me like scare movies. EEEEEEEEEEEKKKKKK!

Anonymous said...

eeekkkkkkkkkkkkkkkkk she is totally nutty and obvoius! She is a hearing person. ugly sign I never even see in my life! ha ha ha please leave asl alone !!!!!!!!!
PEROID!!!!!!!!!!

Anonymous said...

Let's correct English and make it into plain Penglish (People's English)!

Anatomy: p and v

Female/male = vale/pale
Gay/lesbian = pemale/vemale
Transexual = vemale/pemale
Boy/girl = pirl/virl
Boy gay/girl lesbian = poy/voy
Mother/Father = vather/pather
Mother lesbian/father gay = vother/pother
Brother/sister = prother/vrother
Brother gay/sister lesbian = pister/vister

North America = Up America
South America = Down America
UK = Over-Up UK
Germany = Over-Up Germany
Mid Eastern = Over-Middle Eastern
Africa = Over-Down Africa
Australia = Over-down-Australia
North Pole = Up Pole
South Pole = Down Pole

On pronunciation:

finish = fish
don't know = ups
for what = forfor

Speaking in tongues:
We have it! = tongue wagging fast
I don't believe it! = tongue slides down

Oh, there is so much to go on to improve English into Penglish! Let's work on this!

And dear, leave our virgin ASL alone!

Vielen Dank!

Anonymous said...

Hey, Hey !!!! No way to change from ASL to PSL !!!! Where did you get the stupid idea about PSL ??? PSL is not a normal sign language, same as SEE 1, See 2, and some others as well. ASL IS THE PRIMARY SIGN LANGUAGE SPECIALLY FOR THE DEAF !!!

You know ASL is so beautiful because of nature sign language and PSL is very very UGLY and disgusted of course !!!!! It is the fact of life !

Please leave ASL ALONE !!!

_Ehttp://welchsasl.blogspot.com/2007/03/leave-deafs-language-alone.htmlJKaLPTY] MNO ORbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpires\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:47:17 GMTVpublic_Sat, 17 Mar 2007 23:20:04 GMTXIdentity_Mon, 16 Apr 2007 23:20:04 GMT12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13glu&49MUbgo /48LlZO/* The bar. --------------------------------------------*/ #b-navbar { width:100%; padding-bottom:4px; border-bottom:1px solid #024; min-height:24px; font:x-small "Trebuchet MS",Verdana,Arial,Sans-serif !important; color:#47a; margin-bottom:10px; position:absolute !important; top:0; left:0; z-index:1; display:block !important; } .bt1 { height: 1px; margin: 0px 1px; font-size: 1px; position: relative; line-height:1px; } .bt2 { font-size: 83%; padding: 2px; position:relative; } #b-next { padding-left: 5px; } #b-search-this { margin: 0px 0px; position: relative; text-decoration: none; text-transform: uppercase; cursor: pointer; white-space: nowrap; } #b-flag-this { margin: 0px 0px; position: relative; text-decoration: none; text-transform: uppercase; cursor: pointer; white-space: nowrap; padding-left:5px; } #b-navbar #b-logo { position:absolute !important; top:.15em; left:5px; border-width:0; } @media all { #b-search { background:#147 url("../../img/navbar/corner.gif") no-repeat left bottom; margin:0 0 0 34px; height:1em; } #b-search table { padding-right:5px; } #b-search td { font-size:80%; line-height:.8em; } #b-more { float:right; } #b-searchbtn { margin-right:5px; } #b-more { float:right; } #b-search table { float:left; padding: 2px 0 2px; _padding: 1px 2px 1px; } #b-search a, #b-search a:hover { line-height:1em; text-decoration:none; } #b-search td { padding-top:2px; line-height:.8; } #b-search td td { padding:0; } #b-searchbtn { display:block; } } @media handheld { #b-search { display:none !important; } #b-more { display:none !important; } } .navbar-right { padding-right:10px; } td.navbutton { _padding-top:.3em; padding-right: 5px; } td.navsearch { padding-left:5px; } #b-query { vertical-align:top; margin-right:.25em; width:12em; } /* hide from IE5-Mac \*/ #b-query { font-size:x-small !important; } /* end hide */ @media all { body div.b-mobile { display:none; } #b-sms { display:none !important; } } @media handheld { body div.b-mobile { display:block; } #b-sms { display:block !important; margin:0 0 0 100px; padding:4px 7px; line-height:1em; font-size:100%; text-align:left; } #b-sms a { margin-right:.5em; white-space:nowrap; text-decoration:none; line-height:1em; } #b-sms a:hover { color:#fff; text-decoration:underline; } } /* drop down for the flag as objectionable button */ @media all { #flagi { top:7px; background-color:#333; display:none; z-index:300; padding: 1px; } #unflagi { background-color:#333; display:none; z-index:300; top: 7px; padding: 1px; } } @media handheld { #flagi { display:none !important; } #unflagi { display:none !important; } } #flagi-body { background-color:#ffff99; font-weight:bold; line-height: 14px; font-size:10px; text-align: center; font-family:"Trebuchet MS", Vedana, Arial, Sans-serif; padding:3px; } #flagi-body a { color:#3366cc; font-size:10px; text-decoration:none; } #flagi-body a:hover { text-decoration:underline; } #unflagi-body { background-color:#ffff99; font-weight:bold; line-height: 14px; font-size:10px; text-align: center; font-family:"Trebuchet MS", Vedana, Arial, Sans-serif; padding:3px; } #unflagi-body a { color:#3366cc; font-size:10px; text-decoration:none; } #unflagi-body a:hover { text-decoration:underline; } _1http://www2.blogger.com/css/navbar/navbar.css?v=1 QRS OMbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpires\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:54:32 GMTVpublic_Sat, 17 Mar 2007 23:20:04 GMTXIdentity_Mon, 16 Apr 2007 23:20:04 GMT12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13bgp{ !/4HP]bj */3GlUO #b-navbar { background:#036; border-bottom:1px solid #024; color:#47a; } #b-search table { background:#147 url("../../img/navbar/1/corner.gif") no-repeat left bottom; } #b-query { border:1px solid #47a; } #b-search a { color:#9cf; } #b-search td { color:#FFF; } #b-search a:hover { color:#fff; } #b-sms a { color:#9cf; } #b-sms a:hover { color:#fff; } #navbar-logo { height:24px; width:24px; background-image:url("../../img/navbar/1/logobar.gif"); } #b-search-this { background: #114477; } .bt1 { background-color: #4477aa; } .bt2 { background-color: #114477; border-left: 1px solid #4477aa; border-right: 1px solid #4477aa; color: #99ccff; } div.bt2:hover { background-color: #4477aa; } #bt-flag { background: url("../../img/navbar/1/flag.gif") no-repeat left; padding-left:8px; } _,http://www2.blogger.com/css/navbar/1.css?v=1 UVWXO_bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpires\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:51:19 GMTVpublic_Sat, 17 Mar 2007 23:20:04 GMTXIdentity_Mon, 16 Apr 2007 23:20:04 GMT12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13bgp{  %3AFZbot|  <AEYlgO:// Copyright 2005, Google Inc. // // Operations on cookies that are common across our pages. // // Original Author: Pal Takacsi-Nagy (pal@google.com) /** * Sets a Cookie with the given name and value. * * name Name of the cookie * value Value of the cookie * [expires] Expiration date of the cookie (default: end of current session) * [path] Path where the cookie is valid (default: path of calling document) * [domain] Domain where the cookie is valid * (default: domain of calling document) * [secure] Boolean value indicating if the cookie transmission requires a * secure transmission */ function setCookie(name, value, domain, expires, path, secure) { document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } /** * Gets the value of the specified cookie. * * name Name of the desired cookie. * * Returns a string containing value of specified cookie, * or null if cookie does not exist. */ function getCookie(name) { var dc = document.cookie; var prefix = name + "="; var begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) return null; } else { begin += 2; } var end = document.cookie.indexOf(";", begin); if (end == -1) { end = dc.length; } return unescape(dc.substring(begin + prefix.length, end)); } _,http://www2.blogger.com/js/cookies.common.js_application/x-javascript Z[\XO`bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpires\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 22:39:54 GMTVpublic_Sat, 17 Mar 2007 23:20:04 GMTXIdentity_Mon, 16 Apr 2007 23:20:04 GMT12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13chq|  &4BG[cpu} !=BFZlhO// Copied from .../google3/javascript/common.js //------------------------------------------------------------------------ // This file contains common utilities and basic javascript infrastructure. // // Notes: // * Press 'D' to toggle debug mode. // // Functions: // // - Assertions // DEPRECATED: Use assert.js // AssertTrue(): assert an expression. Throws an exception if false. // Fail(): Throws an exception. (Mark block of code that should be unreachable) // AssertEquals(): assert that two values are equal. // AssertNumArgs(): assert number of arguments for the function // AssertType(): assert that a value has a particular type // // - Cookies // SetCookie(): Sets a cookie. // ExpireCookie(): Expires a cookie. // GetCookie(): Gets a cookie value. // // - Dynamic HTML/DOM utilities // MaybeGetElement(): get an element by its id // GetElement(): get an element by its id // GetParentNode(): Get the parent of an element // GetAttribute(): Get attribute value of a DOM node // SetInnerHTML(): set the inner HTML of a node // GetInnerHTML(): get the inner HTML of a node // ClearInnerHTML(): clear the inner HTML of a node // SetCssStyle(): Sets a CSS property of a node. // GetStyleProperty(): Get CSS property from a style attribute string // ShowElement(): Show/hide element by setting the "display" css property. // ShowBlockElement(): Show/hide block element // SetButtonText(): Set the text of a button element. // AppendNewElement(): Create and append a html element to a parent node. // CreateDIV(): Create a DIV element and append to the document. // CreateIFRAME(): Create an IFRAME and append to the document. // HasClass(): check if element has a given class // AddClass(): add a class to an element // RemoveClass(): remove a class from an element // // - Window/Screen utiltiies // GetPageOffsetLeft(): get the X page offset of an element // GetPageOffsetTop(): get the Y page offset of an element // GetPageOffset(): get the X and Y page offsets of an element // GetPageOffsetRight() : get X page offset of the right side of an element // GetPageOffsetRight() : get Y page offset of the bottom of an element // GetScrollTop(): get the vertical scrolling pos of a window. // GetScrollLeft(): get the horizontal scrolling pos of a window // IsScrollAtEnd(): check if window scrollbar has reached its maximum offset // ScrollTo(): scroll window to a position // ScrollIntoView(): scroll window so that an element is in view. // GetWindowWidth(): get width of a window. // GetWindowHeight(): get height of a window // GetAvailScreenWidth(): get available screen width // GetAvailScreenHeight(): get available screen height // GetNiceWindowHeight(): get a nice height for a new browser window. // Open{External/Internal}Window(): open a separate window // CloseWindow(): close a window // // - DOM walking utilities // AnnotateTerms(): find terms in a node and decorate them with some tag // AnnotateText(): find terms in a text node and decorate them with some tag // // - String utilties // HtmlEscape(): html escapes a string // HtmlUnescape(): remove html-escaping. // QuoteEscape(): escape " quotes. // CollapseWhitespace(): collapse multiple whitespace into one whitespace. // Trim(): trim whitespace on ends of string // IsEmpty(): check if CollapseWhiteSpace(String) == "" // IsLetterOrDigit(): check if a character is a letter or a digit // ConvertEOLToLF(): normalize the new-lines of a string. // HtmlEscapeInsertWbrs(): HtmlEscapes and inserts s (word break tags) // after every n non-space chars and/or after or before certain special chars // // - TextArea utilities // GetCursorPos(): finds the cursor position of a textfield // SetCursorPos(): sets the cursor position in a textfield // // - Array utilities // FindInArray(): do a linear search to find an element value. // DeleteArrayElement(): return a new array with a specific value removed. // CloneObject(): clone an object, copying its values recursively. // CloneEvent(): clone an event; cannot use CloneObject because it // suffers from infinite recursion // // - Formatting utilities // PrintArray(): used to print/generate HTML by combining static text // and dynamic strings. // ImageHtml(): create html for an img tag // FormatJSLink(): formats a link that invokes js code when clicked. // MakeId3(): formats an id that has two id numbers, eg, foo_3_7 // // - Miscellaneous // IsDefined(): returns true if argument is not undefined //------------------------------------------------------------------------ // browser detection var agent = navigator.userAgent.toLowerCase(); var is_ie = (agent.indexOf('msie') != -1); //var is_ie5 = (agent.indexOf('msie 5') != -1 && document.all); var is_konqueror = (agent.indexOf('konqueror') != -1); var is_safari = (agent.indexOf('safari') != -1) || is_konqueror; var is_nav = !is_ie && !is_safari && (agent.indexOf('mozilla') != -1); var is_win = (agent.indexOf('win') != -1); delete agent; var BACKSPACE_KEYCODE = 8; var COMMA_KEYCODE = 188; // ',' key var DEBUG_KEYCODE = 68; // 'D' key var DELETE_KEYCODE = 46; var DOWN_KEYCODE = 40; // DOWN arrow key var ENTER_KEYCODE = 13; // ENTER key var ESC_KEYCODE = 27; // ESC key var LEFT_KEYCODE = 37; // LEFT arrow key var RIGHT_KEYCODE = 39; // RIGHT arrow key var SPACE_KEYCODE = 32; // space bar var TAB_KEYCODE = 9; // TAB key var UP_KEYCODE = 38; // UP arrow key var SHIFT_KEYCODE = 16; // This is a "constant" but has different values depending on the browser var semicolon_keycode = (is_ie ? 186 : 59); var MAX_EMAIL_ADDRESS_LENGTH = 320; // 64 + '@' + 255 var MAX_SIGNATURE_LENGTH = 1000; // 1000 chars of maximum signature //------------------------------------------------------------------------ // Assertions // DEPRECATED: Use assert.js //------------------------------------------------------------------------ /** * DEPRECATED: Use assert.js */ function raise(msg) { if (typeof Error != 'undefined') { throw new Error(msg || 'Assertion Failed'); } else { throw (msg); } } /** * DEPRECATED: Use assert.js * * Fail() is useful for marking logic paths that should * not be reached. For example, if you have a class that uses * ints for enums: * * MyClass.ENUM_FOO = 1; * MyClass.ENUM_BAR = 2; * MyClass.ENUM_BAZ = 3; * * And a switch statement elsewhere in your code that * has cases for each of these enums, then you can * "protect" your code as follows: * * switch(type) { * case MyClass.ENUM_FOO: doFooThing(); break; * case MyClass.ENUM_BAR: doBarThing(); break; * case MyClass.ENUM_BAZ: doBazThing(); break; * default: * Fail("No enum in MyClass with value: " + type); * } * * This way, if someone introduces a new value for this enum * without noticing this switch statement, then the code will * fail if the logic allows it to reach the switch with the * new value, alerting the developer that he should add a * case to the switch to handle the new value he has introduced. * * @param {string} opt_msg to display for failure * DEFAULT: "Assertion failed" */ function Fail(opt_msg) { if (opt_msg === undefined) opt_msg = 'Assertion failed'; if (IsDefined(DumpError)) DumpError(opt_msg + '\n'); raise(opt_msg); } /** * DEPRECATED: Use assert.js * * Asserts that an expression is true (non-zero and non-null). * * Note that it is critical not to pass logic * with side-effects as the expression for AssertTrue * because if the assertions are removed by the * JSCompiler, then the expression will be removed * as well, in which case the side-effects will * be lost. So instead of this: * * AssertTrue( criticalComputation() ); * * Do this: * * var result = criticalComputation(); * AssertTrue(result); * * @param {anything} expression to evaluate * @param {string} opt_msg to display if the assertion fails * */ function AssertTrue(expression, opt_msg) { if (!expression) { if (opt_msg === undefined) opt_msg = 'Assertion failed'; Fail(opt_msg); } } /** * DEPRECATED: Use assert.js * * Asserts that two values are the same. * * @param {anything} val1 * @param {anything} val2 * @param {string} opt_msg to display if the assertion fails */ function AssertEquals(val1, val2, opt_msg) { if (val1 != val2) { if (opt_msg === undefined) { opt_msg = "AssertEquals failed: <" + val1 + "> != <" + val2 + ">"; } Fail(opt_msg); } } /** * DEPRECATED: Use assert.js * * Asserts that a value is of the provided type. * * AssertType(6, Number); * AssertType("ijk", String); * AssertType([], Array); * AssertType({}, Object); * AssertType(ICAL_Date.now(), ICAL_Date); * * @param {anything} value * @param {constructor function} type * @param {string} opt_msg to display if the assertion fails */ function AssertType(value, type, opt_msg) { // for backwards compatability only if (typeof value == type) return; if (value || value == "") { try { if (type == AssertTypeMap[typeof value] || value instanceof type) return; } catch (e) { /* failure, type was an illegal argument to instanceof */ } } if (opt_msg === undefined) { if (typeof type == 'function') { var match = type.toString().match(/^\s*function\s+([^\s\{]+)/); if (match) type = match[1]; } opt_msg = "AssertType failed: <" + value + "> not typeof "+ type; } Fail(opt_msg); } var AssertTypeMap = { 'string' : String, 'number' : Number, 'boolean' : Boolean }; /** * DEPRECATED: Use assert.js * * Asserts that the number of arguments to a * function is num. For example: * * function myFunc(one, two, three) [ * AssertNumArgs(3); * ... * } * * myFunc(1, 2); // assertion fails! * * Note that AssertNumArgs does not take the function * as an argument; it is simply used in the context * of the function. * * @param {int} number of arguments expected * @param {string} opt_msg to display if the assertion fails */ function AssertNumArgs(num, opt_msg) { var caller = AssertNumArgs.caller; // This is not supported in safari 1.0 if (caller && caller.arguments.length != num) { if (opt_msg === undefined) { opt_msg = caller.name + ' expected ' + num + ' arguments ' + ' but received ' + caller.arguments.length; } Fail(opt_msg); } } //------------------------------------------------------------------------ // Cookies //------------------------------------------------------------------------ var ILLEGAL_COOKIE_CHARS_RE = /[\s;]/ /** * Sets a cookie. * The max_age can be -1 to set a session cookie. To expire cookies, use * ExpireCookie() instead. * * @param name The cookie name. * @param value The cookie value. * @param opt_max_age The max age in seconds (from now). Use -1 to set a * session cookie. If not provided, the default is -1 (i.e. set a session * cookie). * @param opt_path The path of the cookie, or null to not specify a path * attribute (browser will use the full request path). If not provided, the * default is '/' (i.e. path=/). * @param opt_domain The domain of the cookie, or null to not specify a domain * attribute (brower will use the full request host name). If not provided, * the default is null (i.e. let browser use full request host name). * @return Void. */ function SetCookie(name, value, opt_max_age, opt_path, opt_domain) { value = '' + value; AssertTrue((typeof name == 'string' && typeof value == 'string' && !name.match(ILLEGAL_COOKIE_CHARS_RE) && !value.match(ILLEGAL_COOKIE_CHARS_RE)), 'trying to set an invalid cookie'); if (!IsDefined(opt_max_age)) opt_max_age = -1; if (!IsDefined(opt_path)) opt_path = '/'; if (!IsDefined(opt_domain)) opt_domain = null; var domain_str = (opt_domain == null) ? '' : ';domain=' + opt_domain; var path_str = (opt_path == null) ? '' : ';path=' + opt_path; var expires_str; // Case 1: Set a session cookie. if (opt_max_age < 0) { expires_str = ''; // Case 2: Expire the cookie. // Note: We don't tell people about this option in the function doc because // we prefer people to use ExpireCookie() to expire cookies. } else if (opt_max_age == 0) { // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to convert // it to local time, and if the local time is before Jan 1, 1970, then the // browser will ignore the Expires attribute altogether. var pastDate = new Date(1970, 1 /*Feb*/, 1); // Feb 1, 1970 expires_str = ';expires=' + pastDate.toUTCString(); // Case 3: Set a persistent cookie. } else { var futureDate = new Date(Now() + opt_max_age * 1000); expires_str = ';expires=' + futureDate.toUTCString(); } document.cookie = name + '=' + value + domain_str + path_str + expires_str; } var EXPIRED_COOKIE_VALUE = 'EXPIRED'; /** * Expires a cookie. * * @param name The cookie name. * @param opt_path The path of the cookie, or null to expire a cookie set at * the full request path. If not provided, the default is '/' (i.e. path=/). * @param opt_domain The domain of the cookie, or null to expire a cookie set * at the full request host name. If not provided, the default is null (i.e. * cookie at full request host name). * @return Void. */ function ExpireCookie(name, opt_path, opt_domain) { SetCookie(name, EXPIRED_COOKIE_VALUE, 0, opt_path, opt_domain); } /** Returns the value for the first cookie with the given name * @param name : string * @return a string or the empty string if no cookie found. */ function GetCookie(name) { var nameeq = name + "="; var cookie = String(document.cookie); for (var pos = -1; (pos = cookie.indexOf(nameeq, pos + 1)) >= 0;) { var i = pos; // walk back along string skipping whitespace and looking for a ; before // the name to make sure that we don't match cookies whose name contains // the given name as a suffix. while (--i >= 0) { var ch = cookie.charAt(i); if (ch == ';') { i = -1; // indicate success break; } else if (' \t'.indexOf(ch) < 0) { break; } } if (-1 === i) { // first cookie in the string or we found a ; var end = cookie.indexOf(';', pos); if (end < 0) { end = cookie.length; } return cookie.substring(pos + nameeq.length, end); } } return ""; } //------------------------------------------------------------------------ // Time //------------------------------------------------------------------------ function Now() { return (new Date()).getTime(); } //------------------------------------------------------------------------ // Dynamic HTML/DOM utilities //------------------------------------------------------------------------ // Gets a element by its id, may return null function MaybeGetElement(win, id) { return win.document.getElementById(id); } // Same as MaybeGetElement except that it throws an exception if it's null function GetElement(win, id) { var el = win.document.getElementById(id); if (!el) { DumpError("Element " + id + " not found."); } return el; } // Gets elements by its id/name // IE treats getElementsByName as searching over ids, while Moz use names. // so tags must have both id and name as the same string function GetElements(win, id) { return win.document.getElementsByName(id); } // Gets the parent of a html element. function GetParentNode(n) { try { return n.parentNode; } catch (e) { // n.parentNode may throw a permission-denied exception on mozilla // (e.g. on text element), ignore this exception. return n; } } function IsDescendant(parent, child) { do { if (parent === child) return true; child = GetParentNode(child); } while (child && child !== document.body); return false; } // Get attribute value of a DOM node function GetAttribute(node, attribute) { if (!node.getAttribute) { return null; } var attr = node.getAttribute(attribute); if (is_ie && attribute == "style") { return attr.value; } else { return attr; } } // Sets inner html of a html element function SetInnerHTML(win, id, html) { try { GetElement(win, id).innerHTML = html; } catch (ex) { DumpException(ex); } } // Gets inner-html of a html element function GetInnerHTML(win, id) { try { return GetElement(win, id).innerHTML; } catch (ex) { DumpException(ex); return ""; } } // Clears inner html of a html element function ClearInnerHTML(win, id) { try { GetElement(win, id).innerHTML = ""; } catch (ex) { DumpException(ex); } } // Sets a CSS style of an element function SetCssStyle(win, id, name, value) { try { var elem = GetElement(win, id); elem.style[name] = value; } catch (ex) { DumpException(ex); } } // Get CSS property from a style attribute string function GetStyleProperty(style, name) { var i = style.indexOf(name); if (i != -1) { var j = style.indexOf(";", i); if (j == -1) { j = style.length; } // the +1 below is for the colon following the attribute name return CollapseWhitespace(style.substring(i + name.length + 1, j)); } return null; } // Show/hide an element. function ShowElement(el, show) { el.style.display = show ? "" : "none"; } // Show/hide a block element. // ShowElement() doesn't work if object has an initial class with display:none function ShowBlockElement(el, show) { el.style.display = show ? "block" : "none"; } // Show/hide an inline element. // ShowElement() doesn't work when an element starts off display:none. function ShowInlineElement(el, show) { el.style.display = show ? "inline" : "none"; } // Set the text of a button. This is to get around a bug in mozilla, // where we can't set the text of a button by setting innerHTML. function SetButtonText(button, text) { button.childNodes[0].nodeValue = text; } // Append a new HTML element to a HTML node. function AppendNewElement(win, parent, tag) { var e = win.document.createElement(tag); parent.appendChild(e); return e; } // Finds the child with the given ID, or null if there is node. // This does not search the children's children. function FindChildWithID(parent, id) { var el; for (el = parent.firstChild; el && el.id != id; el = el.nextSibling) { // skip } return el; } // Adds a disabled option to the given menu function AddMenuDisabledOption(win, menu, html) { var op = AppendNewElement(win, menu, 'OPTION'); op.disabled = true; op.innerHTML = html; return op; } // Adds a option to the given menu function AddMenuOption(win, menu, value, html) { var op = AppendNewElement(win, menu, 'OPTION'); op.value = value; op.innerHTML = html; return op; } // Create a new DIV (append it to the end of the document) function CreateDIV(win, id) { var div = MaybeGetElement(win, id); if (!div) { div = AppendNewElement(win, win.document.body, "div"); div.id = id; } return div; } // Create a new IFRAME (append it to the end of the document) function CreateIFRAME(win, id, url) { var iframe = MaybeGetElement(win, id); if (!iframe) { // We cannot create an IFRAME directly (IE doesn't allow it), so we // create a DIV and then insert an IFRAME. // We also give the IFRAME a name (same as id) var div = AppendNewElement(win, win.document.body, "div"); div.innerHTML = ""; iframe = GetElement(win, id); } return iframe; } // Create a new TR containing the given td's function Tr(win, tds) { var tr = win.document.createElement("TR"); for (var i = 0; i < tds.length; i++) { tr.appendChild(tds[i]); } return tr; } // Create a new TD, with an optional colspan function Td(win, opt_colspan) { var td = win.document.createElement("TD"); if (opt_colspan) { td.colSpan = opt_colspan; } return td; } // Check if an element has a given class function HasClass(el, cl) { if (el == null || el.className == null) return false; var classes = el.className.split(" "); for (var i = 0; i < classes.length; i++) { if (classes[i] == cl) { return true; } } return false; } // Add a class to element function AddClass(el, cl) { if (HasClass(el, cl)) return; el.className += " " + cl; } // Remove a class from an element function RemoveClass(el, cl) { if (el.className == null) return; var classes = el.className.split(" "); var result = []; var changed = false; for (var i = 0; i < classes.length; i++) { if (classes[i] != cl) { if (classes[i]) { result.push(classes[i]); } } else { changed = true; } } if (changed) { el.className = result.join(" "); } } // Performs an in-order traversal of the tree rooted at the given node // (excluding the root node) and returns an array of nodes that match the // given selector. The selector must implement the method: // // boolean select(node); // // This method is a generalization of the DOM method "getElementsByTagName" // function GetElementsBySelector(root, selector) { var nodes = []; for (var child = root.firstChild; child; child = child.nextSibling) { AddElementBySelector_(child, selector, nodes); } return nodes; } // Recursive helper for GetElemnetsBySelector() function AddElementBySelector_(root, selector, nodes) { // First test the parent if (selector.select(root)) { nodes.push(root); } // Then recurse through the children for (var child = root.firstChild; child; child = child.nextSibling) { AddElementBySelector_(child, selector, nodes); } } //------------------------------------------------------------------------ // Window/screen utilities // TODO: these should be renamed (e.g. GetWindowWidth to GetWindowInnerWidth // and moved to geom.js) //------------------------------------------------------------------------ // Get page offset of an element function GetPageOffsetLeft(el) { var x = el.offsetLeft; if (el.offsetParent != null) x += GetPageOffsetLeft(el.offsetParent); return x; } // Get page offset of an element function GetPageOffsetTop(el) { var y = el.offsetTop; if (el.offsetParent != null) y += GetPageOffsetTop(el.offsetParent); return y; } // Get page offset of an element function GetPageOffset(el) { var x = el.offsetLeft; var y = el.offsetTop; if (el.offsetParent != null) { var pos = GetPageOffset(el.offsetParent); x += pos.x; y += pos.y; } return {x: x, y: y}; } function GetPageOffsetRight(el) { return GetPageOffsetLeft(el) + el.offsetWidth; } function GetPageOffsetBottom(el) { return GetPageOffsetTop(el) + el.offsetHeight; } // Get the y position scroll offset. function GetScrollTop(win) { // all except Explorer if ("pageYOffset" in win) { return win.pageYOffset; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "scrollTop" in win.document.documentElement) { return win.document.documentElement.scrollTop; } // other Explorers else if ("scrollTop" in win.document.body) { return win.document.body.scrollTop; } return 0; } // Get the x position scroll offset. function GetScrollLeft(win) { // all except Explorer if ("pageXOffset" in win) { return win.pageXOffset; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "scrollLeft" in win.document.documentElement) { return win.document.documentElement.scrollLeft; } // other Explorers else if ("scrollLeft" in win.document.body) { return win.document.body.scrollLeft; } return 0; } /** * Checks if window scrollbar has reached its maximum offset * * @param win a window object * @param opt_isHoriz true if horizontal bar, false if vertical */ function IsScrollAtEnd(win, opt_isHoriz) { var total = (opt_isHoriz) ? document.body.offsetWidth : document.body.offsetHeight; var inner = (opt_isHoriz) ? GetWindowWidth(win) : GetWindowHeight(win); var offset = (opt_isHoriz) ? GetScrollLeft(win) : GetScrollTop(win); return (inner + offset >= total || total < inner); } // Scroll window to pos // position: 0 = top, 0.5 = middle, 1 = bottom function ScrollTo(win, el, position) { var y = GetPageOffsetTop(el); y -= GetWindowHeight(win) * position; win.scrollTo(0, y); } // Scroll so that as far as possible the entire element is in view. var ALIGN_BOTTOM = 'b'; var ALIGN_MIDDLE = 'm'; var ALIGN_TOP = 't'; function ScrollIntoView(win, el, alignment) { var el_top = GetPageOffsetTop(el); var el_bottom = el_top + el.offsetHeight; var win_top = GetScrollTop(win); var win_height = GetWindowHeight(win); var win_bottom = win_top + win_height; // Out of view? if (el_top < win_top || el_bottom > win_bottom) { var scrollto_y; if (alignment == ALIGN_BOTTOM) { scrollto_y = el_bottom - win_height + 5; } else if (alignment == ALIGN_MIDDLE) { scrollto_y = (el_top + el_bottom) / 2 - win_height/2; } else { scrollto_y = el_top - 5; // ALIGN_TOP } Debug("Scrolling to " + scrollto_y); win.scrollTo(0, scrollto_y); } } function IsElementVisible(win, id) { var el = MaybeGetElement(win, id); if (el == null) { return false; } var el_top = GetPageOffsetTop(el); var el_bottom = el_top + el.offsetHeight; var win_top = GetScrollTop(win); var win_bottom = win_top + GetWindowHeight(win); if (el_top >= win_top && el_bottom <= win_bottom) { return true; } return false; } function GetWindowWidth(win) { // all except Explorer if ("innerWidth" in win) { return win.innerWidth; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "clientWidth" in win.document.documentElement) { return win.document.documentElement.clientWidth; } // other Explorers else if ("clientWidth" in win.document.body) { return win.document.body.clientWidth; } return 0; } function GetWindowHeight(win) { // all except Explorer if ("innerHeight" in win) { return win.innerHeight; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "clientHeight" in win.document.documentElement) { return win.document.documentElement.clientHeight; } // other Explorers else if ("clientHeight" in win.document.body) { return win.document.body.clientHeight; } return 0; } function GetAvailScreenWidth(win) { return win.screen.availWidth; } function GetAvailScreenHeight(win) { return win.screen.availHeight; } // Returns a "nice" window height. // Use the screen height. (Or should we use the height of the current window?) function GetNiceWindowHeight(win) { return Math.floor(0.8 * GetAvailScreenHeight(win)); } // Used for horizontally centering a new window of the given width in the // available screen. Set the new window's distance from the left of the screen // equal to this function's return value. // Params: width: the width of the new window // Returns: the distance from the left edge of the screen for the new window to // be horizontally centered function GetCenteringLeft(win, width) { return (win.screen.availWidth - width) >> 1; } // Used for vertically centering a new window of the given height in the // available screen. Set the new window's distance from the top of the screen // equal to this function's return value. // Params: height: the height of the new window // Returns: the distance from the top edge of the screen for the new window to // be vertically aligned. function GetCenteringTop(win, height) { return (win.screen.availHeight - height) >> 1; } /* * Opens a child popup window that has no browser toolbar/decorations. * (Copied from caribou's common.js library with small modifications.) * * @param url the URL for the new window (Note: this will be unique-ified) * @param opt_name the name of the new window * @param opt_width the width of the new window * @param opt_height the height of the new window * @param opt_center if true, the new window is centered in the available screen * @param opt_hide_scrollbars if true, the window hides the scrollbars * @param opt_noresize if true, makes window unresizable * @param opt_blocked_msg message warning that the popup has been blocked * @return a reference to the new child window */ function Popup(url, opt_name, opt_width, opt_height, opt_center, opt_hide_scrollbars, opt_noresize, opt_blocked_msg) { if (!opt_height) { opt_height = Math.floor(GetWindowHeight(window.top) * 0.8); } if (!opt_width) { opt_width = Math.min(GetAvailScreenWidth(window), opt_height); } var features = "resizable=" + (opt_noresize ? "no" : "yes") + "," + "scrollbars=" + (opt_hide_scrollbars ? "no" : "yes") + "," + "width=" + opt_width + ",height=" + opt_height; if (opt_center) { features += ",left=" + GetCenteringLeft(window, opt_width) + "," + "top=" + GetCenteringTop(window, opt_height); } return OpenWindow(window, url, opt_name, features, opt_blocked_msg); } /* * Opens a new window. Returns the new window handle. Tries to open the new * window using top.open() first. If that doesn't work, then tries win.open(). * If that still doesn't work, prints an alert. * (Copied from caribou's common.js library with small modifications.) * * @param win the parent window from which to open the new child window * @param url the URL for the new window (Note: this will be unique-ified) * @param opt_name the name of the new window * @param opt_features the properties of the new window * @param opt_blocked_msg message warning that the popup has been blocked * @return a reference to the new child window */ function OpenWindow(win, url, opt_name, opt_features, opt_blocked_msg) { var newwin = OpenWindowHelper(top, url, opt_name, opt_features); if (!newwin || newwin.closed || !newwin.focus) { newwin = OpenWindowHelper(win, url, opt_name, opt_features); } if (!newwin || newwin.closed || !newwin.focus) { if (opt_blocked_msg) alert(opt_blocked_msg); } else { // Make sure that the window has the focus newwin.focus(); } return newwin; } /* * Helper for OpenWindow(). * (Copied from caribou's common.js library with small modifications.) */ function OpenWindowHelper(win, url, name, features) { var newwin; if (features) { newwin = win.open(url, name, features); } else if (name) { newwin = win.open(url, name); } else { newwin = win.open(url); } return newwin; } //------------------------------------------------------------------------ // DOM walking utilities //------------------------------------------------------------------------ function MaybeEscape(str, escape) { return escape ? HtmlEscape(str) : str; } //------------------------------------------------------------------------ // Window data //------------------------------------------------------------------------ // Gets an array, which can store data for the window. This data // is deleted when the window is unloaded. var windata = []; function GetWindowData(win) { var data = windata[win.name]; if (!data) { windata[win.name] = data = []; } return data; } // Clear js data for a window. function ClearWindowData(win_name) { if (windata[win_name]) { windata[win_name] = null; } } //------------------------------------------------------------------------ // String utilities //------------------------------------------------------------------------ // Do html escaping var amp_re_ = /&/g; var lt_re_ = //g; // Convert text to HTML format. For efficiency, we just convert '&', '<', '>' // characters. // Note: Javascript >= 1.3 supports lambda expression in the replacement // argument. But it's slower on IE. // Note: we can also implement HtmlEscape by setting the value // of a textnode and then reading the 'innerHTML' value, but that // that turns out to be slower. // Params: str: String to be escaped. // Returns: The escaped string. function HtmlEscape(str) { if (!str) return ""; return str.replace(amp_re_, "&").replace(lt_re_, "<"). replace(gt_re_, ">").replace(quote_re_, """); } /** converts html entities to plain text. It covers the most common named * entities and numeric entities. * It does not cover all named entities -- it covers &{lt,gt,amp,quot,nbsp}; but * does not handle some of the more obscure ones like &{ndash,eacute};. */ function HtmlUnescape(str) { if (!str) return ""; return str. replace(/&#(\d+);/g, function (_, n) { return String.fromCharCode(parseInt(n, 10)); }). replace(/&#x([a-f0-9]+);/gi, function (_, n) { return String.fromCharCode(parseInt(n, 16)); }). replace(/&(\w+);/g, function (_, entity) { entity = entity.toLowerCase(); return entity in HtmlUnescape.unesc ? HtmlUnescape.unesc[entity] : '?'; }); } HtmlUnescape.unesc = { lt: '<', gt: '>', quot: '"', nbsp: ' ', amp: '&' }; // Replace multiple spaces with   to retain whitespace formatting // in addition to escaping '&', '<', and '>'. var dbsp_re_ = / /g; var ret_re_ = /\r/g; var nl_re_ = /\n/g; function HtmlWhitespaceEscape(str) { str = HtmlEscape(str); str = str.replace(dbsp_re_, "  "); str = str.replace(ret_re_, ""); str = str.replace(nl_re_, "
"); return str; } // Escape double quote '"' characters in addition to '&', '<', '>' so that a // string can be included in an HTML tag attribute value within double quotes. // Params: str: String to be escaped. // Returns: The escaped string. var quote_re_ = /\"/g; function QuoteEscape(str) { return HtmlEscape(str).replace(quote_re_, """); } var JS_SPECIAL_RE_ = /[\'\\\r\n\b\"<>&]/g; function JSEscOne_(s) { if (!JSEscOne_.js_escs_) { var escapes = {}; escapes['\\'] = '\\\\'; escapes['\''] = '\\047'; escapes['\n'] = '\\n'; escapes['\r'] = '\\r'; escapes['\b'] = '\\b'; escapes['\"'] = '\\042'; escapes['<'] = '\\074'; escapes['>'] = '\\076'; escapes['&'] = '\\046'; JSEscOne_.js_escs_ = escapes; } return JSEscOne_.js_escs_[s]; } /** convert a string to a javascript string literal. This function has the * property that the return value is also already html escaped, so the output * can be embedded in an html handler attribute. */ function ToJSString(s) { return "'" + s.toString().replace(JS_SPECIAL_RE_, JSEscOne_) + "'"; } // converts multiple ws chars to a single space, and strips // leading and trailing ws var spc_re_ = /\s+/g; var beg_spc_re_ = /^ /; var end_spc_re_ = / $/; function CollapseWhitespace(str) { if (!str) return ""; return str.replace(spc_re_, " ").replace(beg_spc_re_, ""). replace(end_spc_re_, ""); } var newline_re_ = /\r?\n/g; var spctab_re_ = /[ \t]+/g; var nbsp_re_ = /\xa0/g; function StripNewlines(str) { if (!str) return ""; return str.replace(newline_re_, " "); } function CanonicalizeNewlines(str) { if (!str) return ""; return str.replace(newline_re_, '\n'); } function HtmlifyNewlines(str) { if (!str) return ""; return str.replace(newline_re_, "
"); } function NormalizeSpaces(str) { if (!str) return ""; return str.replace(spctab_re_, " ").replace(nbsp_re_, " "); } // URL encodes the string. function UrlEncode(str) { return encodeURIComponent(str); } function Trim(str) { if (!str) return ""; return str.replace(/^\s+/, "").replace(/\s+$/, ""); } function EndsWith(str, suffix) { if (!str) return !suffix; return (str.lastIndexOf(suffix) == (str.length - suffix.length)); } // Check if a string is empty function IsEmpty(str) { return CollapseWhitespace(str) == ""; } // Check if a character is a letter function IsLetterOrDigit(ch) { return ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z") || (ch >= '0' && ch <= '9')); } // Check if a character is a space character function IsSpace(ch) { return (" \t\r\n".indexOf(ch) >= 0); } // Converts any instances of "\r" or "\r\n" style EOLs into "\n" (Line Feed), // and also trim the extra newlines and whitespaces at the end. var eol_re_ = /\r\n?/g; var trailingspc_re_ = /[\n\t ]+$/; function NormalizeText(str) { return str.replace(eol_re_, "\n").replace(trailingspc_re_, ""); } // Inserts s (word break tag) after every n non-space chars and/or // after or before certain special chars. The input string should be plain // text that has not yet been HTML-escaped. // Params: // str: The string to insert s into. // n: The maximum number of consecutive non-space characters to allow before // adding a . To turn off this rule (i.e. if you only want to add // breaks based on special characters), pass in the value -1. // chars_to_break_after: The list of special characters (concatenated into a // string) after which a should be added, if there is no natural // break at that point. To turn off this rule, pass in the empty string. // chars_to_break_before: The list of special characters (concatenated into a // string) before which a should be added, if there is no natural // break at that point. To turn off this rule, pass in the empty string. // Returns: The string str htmlescaped, and with s inserted according to // the rules specified by the other arguments. function HtmlEscapeInsertWbrs(str, n, chars_to_break_after, chars_to_break_before) { AssertNumArgs(4); var out = ''; var strpos = 0; var spc = 0; for (var i = 1; i < str.length; ++i) { var prev_char = str.charAt(i - 1); var next_char = str.charAt(i); if (IsSpace(next_char)) { spc = i; } else if (i - spc == n || chars_to_break_after.indexOf(prev_char) != -1 || chars_to_break_before.indexOf(next_char) != -1) { out += HtmlEscape(str.substring(strpos, i)) + ''; strpos = i; spc = i; } } out += HtmlEscape(str.substr(strpos)); return out; } // Converts a string to its canonicalized label form. var illegal_chars_re_ = /[ \/(){}&|\\\"\000]/g; function CanonicalizeLabel(str, lowercase) { var uppercase = str.replace(illegal_chars_re_, '-'); return lowercase ? uppercase.toLowerCase() : uppercase; } // Case-insensitive string comparator function CompareStringsIgnoreCase(s1, s2) { s1 = s1.toLowerCase(); s2 = s2.toLowerCase(); if (s1 < s2) { return -1; } else if (s1 == s2) { return 0; } else { return 1; } } //------------------------------------------------------------------------ // TextArea utilities //------------------------------------------------------------------------ // Gets the cursor pos in a text area. Returns -1 if the cursor pos cannot // be determined or if the cursor out of the textfield. function GetCursorPos(win, textfield) { try { if (IsDefined(textfield.selectionEnd)) { // Mozilla directly supports this return textfield.selectionEnd; } else if (win.document.selection && win.document.selection.createRange) { // IE doesn't export an accessor for the endpoints of a selection. // Instead, it uses the TextRange object, which has an extremely obtuse // API. Here's what seems to work: // (1) Obtain a textfield from the current selection (cursor) var tr = win.document.selection.createRange(); // Check if the current selection is in the textfield if (tr.parentElement() != textfield) { return -1; } // (2) Make a text range encompassing the textfield var tr2 = tr.duplicate(); tr2.moveToElementText(textfield); // (3) Move the end of the copy to the beginning of the selection tr2.setEndPoint("EndToStart", tr); // (4) The span of the textrange copy is equivalent to the cursor pos var cursor = tr2.text.length; // Finally, perform a sanity check to make sure the cursor is in the // textfield. IE sometimes screws this up when the window is activated if (cursor > textfield.value.length) { return -1; } return cursor; } else { Debug("Unable to get cursor position for: " + navigator.userAgent); // Just return the size of the textfield // TODO: Investigate how to get cursor pos in Safari! return textfield.value.length; } } catch (e) { DumpException(e, "Cannot get cursor pos"); } return -1; } function SetCursorPos(win, textfield, pos) { if (IsDefined(textfield.selectionEnd) && IsDefined(textfield.selectionStart)) { // Mozilla directly supports this textfield.selectionStart = pos; textfield.selectionEnd = pos; } else if (win.document.selection && textfield.createTextRange) { // IE has textranges. A textfield's textrange encompasses the // entire textfield's text by default var sel = textfield.createTextRange(); sel.collapse(true); sel.move("character", pos); sel.select(); } } //------------------------------------------------------------------------ // Array utilities //------------------------------------------------------------------------ // Find an item in an array, returns the key, or -1 if not found function FindInArray(array, x) { for (var i = 0; i < array.length; i++) { if (array[i] == x) { return i; } } return -1; } // Inserts an item into an array, if it's not already in the array function InsertArray(array, x) { if (FindInArray(array, x) == -1) { array[array.length] = x; } } // Delete an element from an array function DeleteArrayElement(array, x) { var i = 0; while (i < array.length && array[i] != x) i++; array.splice(i, 1); } // Copies a flat array function CopyArray(array) { var copy = []; for (var i = 0; i < array.length; i++) { copy[i] = array[i]; } return copy; } // Clone an object (recursively) function CloneObject(x) { if ((typeof x) == "object") { var y = []; for (var i in x) { y[i] = CloneObject(x[i]); } return y; } return x; } /** * Clone an event; cannot use CloneObject(event) * because it suffers from infinite recursion. * Thus, only a subset of the event properties are * cloned -- if you need others, just add them * to this function (just don't remove any!) */ function CloneEvent(ev) { var clone = {}; clone.clientX = ev.clientX; clone.clientY = ev.clientY; clone.pageX = ev.pageX; clone.pageY = ev.pageY; clone.type = ev.type; clone.srcElement = ev.srcElement; clone.target = ev.target; clone.cancelBubble = ev.cancelBubble; clone.explicitOriginalTarget = ev.explicitOriginalTarget; // add more properties here return clone; } function GetEventTarget(/*Event*/ ev) { // Event is not a type in IE; IE uses Object for events // AssertType(ev, Event, 'arg passed to GetEventTarget not an Event'); return ev.srcElement || ev.target; } /** cancels the event */ // from http://www.quirksmode.org/js/events_order.html function CancelEvent(/*Event*/ ev) { if (is_ie) { ev.cancelBubble = true; } else if (ev.stopPropagation) { ev.stopPropagation(); } } //------------------------------------------------------------------------ // Formatting utilities //------------------------------------------------------------------------ // A simple printf type function that takes in a template array, and a data // array. e.g. PrintArray(["a",,"b",,"c"], ["x", "y"]) => axbyc function PrintArray(array, data) { // Check that the argument count is correct. AssertEquals(array.length, data.length * 2 + 1); for (var i = 0, idx = 1; i < data.length; i++, idx += 2) { array[idx] = data[i]; } return array.join(""); } function ImageHtml(url, attributes) { return ""; } // Formats an object id that has two id numbers, eg, foo_3_7 function MakeId3(idprefix, m, n) { return idprefix + m + "_" + n; } //------------------------------------------------------------------------ // Email address parsing //------------------------------------------------------------------------ // Parse an email address of the form "name"
into [name, address] function ParseAddress(addr) { var name = ""; var address = ""; for (var i = 0; i < addr.length;) { var token = GetEmailToken(addr, i); if (token.charAt(0) == '<') { var end = token.indexOf(">"); address = token.substring(1, (end != -1) ? end : token.length); } else if (address == "") { name += token; } i += token.length; } // Check if it's a simple email address of the form "jlim@google.com" if (address == "" && name.indexOf("@") != -1) { address = name; name = ""; } name = CollapseWhitespace(name); name = StripQuotes(name, "'"); name = StripQuotes(name, "\""); address = CollapseWhitespace(address); return [name, address]; } // Given an email address, get the address part function GetAddress(address) { return ParseAddress(address)[1]; } // Get the username part of an email address function GetAddressUsername(address) { address = GetAddress(address); var at = address.indexOf("@"); return (at == -1) ? address : address.substr(0, at); } // Given an email address, get the personal part function GetPersonal(address) { return ParseAddress(address)[0]; } // Given an address, get a short name function GetPersonalElseUsername(address) { var personal = GetPersonal(address); if (personal != "") { return personal; } else { return GetAddressUsername(address); } } // Strip ' or " chars around a string function StripQuotes(str, quotechar) { var len = str.length; if (str.charAt(0) == quotechar && str.charAt(len - 1) == quotechar) { return str.substring(1, len - 1); } return str; } // Convert a string containing list of email addresses into an array // of strings function EmailsToArray(str) { var result = []; var email = ""; var token; for (var i = 0; i < str.length; ) { token = GetEmailToken(str, i); if (token == ",") { AddEmailAddress(result, email); email = ""; i++; continue; } email += token; i += token.length; } // Add last if (email !="" || token == ",") { AddEmailAddress(result, email); } return result; } // Get the next token from a position in an address string var openers_ = "\"<(["; var closers_ = "\">)]"; function GetEmailToken(str, pos) { var ch = str.charAt(pos); var p = openers_.indexOf(ch); if (p == -1) return ch; var end_pos = str.indexOf(closers_.charAt(p), pos + 1); var token = (end_pos >= 0) ? str.substring(pos, end_pos + 1) : str.substr(pos); return token; } // Add an email address to the result array. function AddEmailAddress(result, email) { email = CleanEmailAddress(email); result[result.length] = email; } // Clean up email address: // - remove extra spaces // - Surround name with quotes if it contains special characters // to check if we need " quotes // Note: do not use /g in the regular expression, otherwise the // regular expression cannot be reusable. var specialchars_re_ = /[()<>@,;:\\\".\[\]]/; function CleanEmailAddress(str) { var name_address = ParseAddress(str); var name = name_address[0]; var address = name_address[1]; if (name.indexOf("\"") == -1) { // If there's no " var quote_needed = specialchars_re_.test(name); if (quote_needed) { name = "\"" + name + "\""; } } if (name == "") return address; else if (address == "") return name; else return name + " <" + address + ">"; } //------------------------------------------------------------------------ // Misc //------------------------------------------------------------------------ // Compare long hex strings function CompareID(a, b) { if (a.length != b.length) { return (a.length - b.length); } else { return (a < b) ? -1 : (a > b) ? 1 : 0; } } // Check if a value is defined function IsDefined(value) { return (typeof value) != 'undefined'; } function GetKeyCode(event) { var code; if (event.keyCode) { code = event.keyCode; } else if (event.which) { code = event.which; } return code; } // define a forid function to fetch a DOM node by id. function forid_1(id) { return document.getElementById(id); } function forid_2(id) { return document.all[id]; } /** * Fetch an HtmlElement by id. * DEPRECATED: use $ in dom.js */ var forid = document.getElementById ? forid_1 : forid_2; function log(msg) { /* a top level window is its own parent. Use != or else fails on IE with * infinite loop. */ try { if (window.parent != window && window.parent.log) { window.parent.log(window.name + '::' + msg); return; } } catch (e) { // Error: uncaught exception: Permission denied to get property Window.log } var logPane = forid('log'); if (logPane) { var logText = '

' + new Date() + '' + msg + '

'; logPane.innerHTML = logText + logPane.innerHTML; } else { window.status = msg; } } _-http://www2.blogger.com/app/scripts/common.js ^_`XOdbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078#AY^J[x#AxI̿+*+!-.WNS.base[NS.relative_1http://www2.blogger.com/app/scripts/dom.common.js1234X$classesZ$classname456UNSURLV%NSURLXNSObject_application/x-javascript9:;=>?HQZNS.objectsWNS.keys@ABCDEFGIJKLMNOP _Content-EncodingVServer]Last-Modified]Cache-ControlTDate_Transfer-EncodingWExpires\Content-TypeTgzipWGFE/1.3_Sat, 17 Mar 2007 04:45:58 GMTVpublic_Sat, 17 Mar 2007 23:20:05 GMTXIdentity_Mon, 16 Apr 2007 23:20:05 GMT12bccd6_NSMutableDictionary\NSDictionary12fgg6_NSHTTPURLResponseInternal12ijjk6_NSHTTPURLResponse]NSURLResponse$)2DILbd!-/13glu  #*8FK_gty"%AFJ^llO> // Commonly-used functions, reduced. function d(s) {return document.getElementById(s);} function dE(o,s) {return o.getElementsByTagName(s);} /** * toggleDisplay() * * Will toggle the display property of the style object for any * DOM element or object that supports style as a property. * * Warning: This'll wreak havoc if applied to elements. Those * babies got different types "table-row" | "block" dependant on * what browser's being used. * * Warning: Written in Texas. Yeehaw. * * Typical usage: * toggleDisplay(document.getElementById("foo")); */ function toggleDisplay(o) { var display = getStyle(o, "display"); if (o.style) o.style.display = (display != "none") ? "none" : getDisplayStyleByTagName(o); } function getDisplayStyleByTagName(o) { n = o.nodeName.toLowerCase(); return ( n == "span" || n == "img" || n == "a" ) ? "inline" : "block"; } /** * hideElement() * * Hides an element from view. * * Typical usage: * hideElement(getElement("the-id-of-the-element")); */ function hideElement(o) { if (o && o.style) o.style.display = "none"; } /** * showElement() * * Shows an element that was hidden from view. * * Typical usage: * showElement(getElement("the-id-of-the-element")); */ function showElement(o) { if (o && o.style) o.style.display = getDisplayStyleByTagName(o); } /** * getElement() * * Returns an element by its ID or shows an alert if it can't be found. * * Typical usage: * getElement("the-id-of-the-element"); */ function getElement(id) { var e = d(id); if (!e) { alert("Cannot get element: " + id); } return e; } /** * setInnerHTML() * * Sets the innerHTML of an element or shows an alert if can't be set. * * Typical usage: * setInnerHTML("the-id-of-the-element"); */ function setInnerHTML(id, html) { try { getElement(id).innerHTML = html; } catch (ex) { alert("Cannot set inner HTML: " + id); } } /** * setCssStyle() * * Sets the style of an element by its id or shows an alert if can't be set. * * Typical usage: * setCssStyle("the-id-of-the-element", "display", "block"); */ function setCssStyle(id, name, value) { try { getElement(id).style[name] = value; } catch (ex) { alert("Cannot set style: " + id); } } /** * getStyle() * * Gets the computed style of any object. * * WARNING: Produces unexpected results in Safari. To achieve best * results, explicitly set the style property for that browser when the * element is rendered. * * Typical usage: * getStyle(object, "display"); */ function getStyle(el, style) { if (!document.getElementById || !el) return; if (document.defaultView && document.defaultView.getComputedStyle) { return document.defaultView. getComputedStyle(el, "").getPropertyValue(style); } else if (el.currentStyle) { return el.currentStyle[style]; } else { return el.style.display; } } /** * getStyleAttribute() * * Returns the style attribute of the specified node. */ function getStyleAttribute(node) { if (Detect.IE()) { return node.getAttribute('style').value; }else { return node.getAttribute('style'); } } /* * showProps() * * Displays all the properties for a given element */ function showProps(o) { s=""; for (p in o) { s+=p+": "+o[p]+"\n
"; } document.write(s); } function setIFrameEvent(iframe, eventName, func) { if (document.all) { eval('getIFrameDocument(iframe).on' + eventName + ' = func;'); } else { iframe.contentWindow.addEventListener(eventName, func, true); } } function setIFrameBody(iframe, strStyle, innerHtml) { if (!innerHtml) innerHtml = ''; if (innerHtml == '' && Detect.IE()) { innerHtml = '
'; } var doc = getIFrameDocument(iframe); doc.open(); doc.write('' + innerHtml + ''); doc.close(); } function getIFrameDocument(iframe) { if (Detect.IE()) { return iframe.document; } else { return iframe.contentDocument; } } function getIFrame(strId) { if (Detect.IE()) { return document.frames[strId]; } else { return document.getElementById(strId); } } function createElementandAppend(nodeName, strId, appendTo) { var el = document.createElement(nodeName); el.setAttribute("id", strId); if (appendTo) { appendTo.appendChild(el); } else { document.body.appendChild(el); } return el; } function createElementandInsertBefore(nodeName, strId, appendTo, sibling) { var el = document.createElement(nodeName); el.setAttribute("id", strId); if (appendTo) { appendTo.insertBefore(el, sibling); } else { document.body.insertBefore(el, sibling); } return el; } /** * getXY() * * Returns the position of any element as an object. * * Typical usage: * var pos = getXY(object); * alert(pos.x + " " +pos.y); */ function getXY(el) { var x = el.offsetLeft; var y = el.offsetTop; if (el.offsetParent != null) { var pos = getXY(el.offsetParent); x += pos.x; y += pos.y; } return {x: x, y: y} } // The following 3 functions are taken from common.js function hasClass(el, cl) { if (el == null || el.className == null) return false; var classes = el.className.split(" "); for (var i = 0; i < classes.length; i++) { if (classes[i] == cl) { return true; } } return false; } // Add a class to element function addClass(el, cl) { if (hasClass(el, cl)) return; el.className += " " + cl; } // Remove a class from an element function removeClass(el, cl) { if (el.className == null) return; var classes = el.className.split(" "); var result = []; var changed = false; for (var i = 0; i < classes.length; i++) { if (classes[i] != cl) { if (classes[i]) { result.push(classes[i]); } } else { changed = true; } } if (changed) { el.className = result.join(" "); } } function toggleClass(el, cl) { if (hasClass(el, cl)) { removeClass(el, cl); } else { addClass(el, cl); } } /* Constants for node types, since IE doesn't support Node.TEXT_NODE */ var TEXT_NODE = 3; var ELEMENT_NODE = 1; _1http://www2.blogger.com/app/scripts/dom.common.js *b+cFde_WebResourceFrameNameO
Notify Blogger about objectionable content on this page.
You flagged this blog as having objectionable content.
]navbar-iframe_http://www2.blogger.com/navbar.g?targetBlogID=37066553&blogName=Welch%27s+ASL+Juice%21&publishMode=PUBLISH_MODE_BLOGSPOT&navbarType=BLUE&layoutType=LAYOUTS&homepageUrl=http%3A%2F%2Fwelchsasl.blogspot.com%2Findex.html&searchRoot=http%3A%2F%2Fwelchsasl.blogspot.com%2Fsearch!3IW`vg / 8 A!W`1:LLLLR5R\ReVy1yyy}(3Q[a.7Z#3<%.u#>-..$2u66=6F:@AA1A:E| #_###??f@