bladerunner 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +20 -0
  3. data/README.md +56 -0
  4. data/Rakefile +38 -0
  5. data/app/assets/javascripts/bladerunner/application.js +6 -0
  6. data/app/assets/javascripts/bladerunner/bladerunner.coffee +31 -0
  7. data/app/assets/javascripts/bladerunner/vendor/bootstrap.js +1999 -0
  8. data/app/assets/javascripts/bladerunner/vendor/jquery.js +8829 -0
  9. data/app/assets/javascripts/bladerunner/vendor/prettify-lang-sql.js +2 -0
  10. data/app/assets/javascripts/bladerunner/vendor/prettify.js +30 -0
  11. data/app/assets/javascripts/bladerunner/vendor/pubnub.js +1436 -0
  12. data/app/assets/stylesheets/bladerunner/application.css +7 -0
  13. data/app/assets/stylesheets/bladerunner/bladerunner.css.scss +17 -0
  14. data/app/assets/stylesheets/bladerunner/bootstrap-theme.css +384 -0
  15. data/app/assets/stylesheets/bladerunner/bootstrap.css +6805 -0
  16. data/app/assets/stylesheets/bladerunner/prettify-desert.css +34 -0
  17. data/app/assets/stylesheets/bladerunner/prettify.css +1 -0
  18. data/app/controllers/bladerunner/application_controller.rb +50 -0
  19. data/app/helpers/bladerunner/application_helper.rb +4 -0
  20. data/app/views/bladerunner/application/_query_info.html.erb +8 -0
  21. data/app/views/bladerunner/application/index.html.erb +14 -0
  22. data/app/views/bladerunner/application/run.html.erb +41 -0
  23. data/app/views/layouts/bladerunner/application.html.erb +34 -0
  24. data/config/routes.rb +5 -0
  25. data/lib/bladerunner.rb +4 -0
  26. data/lib/bladerunner/engine.rb +5 -0
  27. data/lib/bladerunner/version.rb +3 -0
  28. data/lib/tasks/bladerunner_tasks.rake +4 -0
  29. data/test/bladerunner_test.rb +7 -0
  30. data/test/dummy/README.rdoc +261 -0
  31. data/test/dummy/Rakefile +7 -0
  32. data/test/dummy/app/assets/javascripts/application.js +15 -0
  33. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  34. data/test/dummy/app/controllers/application_controller.rb +3 -0
  35. data/test/dummy/app/helpers/application_helper.rb +2 -0
  36. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/test/dummy/config.ru +4 -0
  38. data/test/dummy/config/application.rb +65 -0
  39. data/test/dummy/config/boot.rb +10 -0
  40. data/test/dummy/config/environment.rb +5 -0
  41. data/test/dummy/config/environments/development.rb +31 -0
  42. data/test/dummy/config/environments/production.rb +64 -0
  43. data/test/dummy/config/environments/test.rb +35 -0
  44. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  45. data/test/dummy/config/initializers/inflections.rb +15 -0
  46. data/test/dummy/config/initializers/mime_types.rb +5 -0
  47. data/test/dummy/config/initializers/secret_token.rb +7 -0
  48. data/test/dummy/config/initializers/session_store.rb +8 -0
  49. data/test/dummy/config/initializers/wrap_parameters.rb +10 -0
  50. data/test/dummy/config/locales/en.yml +5 -0
  51. data/test/dummy/config/routes.rb +4 -0
  52. data/test/dummy/log/development.log +202 -0
  53. data/test/dummy/public/404.html +26 -0
  54. data/test/dummy/public/422.html +26 -0
  55. data/test/dummy/public/500.html +25 -0
  56. data/test/dummy/public/favicon.ico +0 -0
  57. data/test/dummy/script/rails +6 -0
  58. data/test/integration/navigation_test.rb +9 -0
  59. data/test/test_helper.rb +15 -0
  60. metadata +162 -0
@@ -0,0 +1,2 @@
1
+ PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,
2
+ null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);
@@ -0,0 +1,30 @@
1
+ !function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
2
+ (function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
3
+ b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
4
+ h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
5
+ (a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
6
+ f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
7
+ a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
8
+ if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
9
+ g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
10
+ q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
11
+ /^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
12
+ s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
13
+ q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
14
+ c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
15
+ r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
16
+ a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
17
+ t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
18
+ "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
19
+ O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
20
+ Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
21
+ V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
22
+ /^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
23
+ ["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
24
+ ["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q,
25
+ hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
26
+ p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
27
+ return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
28
+ o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
29
+ {h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
30
+ h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
@@ -0,0 +1,1436 @@
1
+ // Version: 3.5.3.1
2
+ /* =-====================================================================-= */
3
+ /* =-====================================================================-= */
4
+ /* =-========================= JSON =============================-= */
5
+ /* =-====================================================================-= */
6
+ /* =-====================================================================-= */
7
+
8
+ (window['JSON'] && window['JSON']['stringify']) || (function () {
9
+ window['JSON'] || (window['JSON'] = {});
10
+
11
+ function toJSON(key) {
12
+ try { return this.valueOf() }
13
+ catch(e) { return null }
14
+ }
15
+
16
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
17
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
18
+ gap,
19
+ indent,
20
+ meta = { // table of character substitutions
21
+ '\b': '\\b',
22
+ '\t': '\\t',
23
+ '\n': '\\n',
24
+ '\f': '\\f',
25
+ '\r': '\\r',
26
+ '"' : '\\"',
27
+ '\\': '\\\\'
28
+ },
29
+ rep;
30
+
31
+ function quote(string) {
32
+ escapable.lastIndex = 0;
33
+ return escapable.test(string) ?
34
+ '"' + string.replace(escapable, function (a) {
35
+ var c = meta[a];
36
+ return typeof c === 'string' ? c :
37
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
38
+ }) + '"' :
39
+ '"' + string + '"';
40
+ }
41
+
42
+ function str(key, holder) {
43
+ var i, // The loop counter.
44
+ k, // The member key.
45
+ v, // The member value.
46
+ length,
47
+ partial,
48
+ mind = gap,
49
+ value = holder[key];
50
+
51
+ if (value && typeof value === 'object') {
52
+ value = toJSON.call( value, key );
53
+ }
54
+
55
+ if (typeof rep === 'function') {
56
+ value = rep.call(holder, key, value);
57
+ }
58
+
59
+ switch (typeof value) {
60
+ case 'string':
61
+ return quote(value);
62
+
63
+ case 'number':
64
+ return isFinite(value) ? String(value) : 'null';
65
+
66
+ case 'boolean':
67
+ case 'null':
68
+ return String(value);
69
+
70
+ case 'object':
71
+
72
+ if (!value) {
73
+ return 'null';
74
+ }
75
+
76
+ gap += indent;
77
+ partial = [];
78
+
79
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
80
+
81
+ length = value.length;
82
+ for (i = 0; i < length; i += 1) {
83
+ partial[i] = str(i, value) || 'null';
84
+ }
85
+
86
+ v = partial.length === 0 ? '[]' :
87
+ gap ? '[\n' + gap +
88
+ partial.join(',\n' + gap) + '\n' +
89
+ mind + ']' :
90
+ '[' + partial.join(',') + ']';
91
+ gap = mind;
92
+ return v;
93
+ }
94
+ if (rep && typeof rep === 'object') {
95
+ length = rep.length;
96
+ for (i = 0; i < length; i += 1) {
97
+ k = rep[i];
98
+ if (typeof k === 'string') {
99
+ v = str(k, value);
100
+ if (v) {
101
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
102
+ }
103
+ }
104
+ }
105
+ } else {
106
+ for (k in value) {
107
+ if (Object.hasOwnProperty.call(value, k)) {
108
+ v = str(k, value);
109
+ if (v) {
110
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ v = partial.length === 0 ? '{}' :
117
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
118
+ mind + '}' : '{' + partial.join(',') + '}';
119
+ gap = mind;
120
+ return v;
121
+ }
122
+ }
123
+
124
+ if (typeof JSON['stringify'] !== 'function') {
125
+ JSON['stringify'] = function (value, replacer, space) {
126
+ var i;
127
+ gap = '';
128
+ indent = '';
129
+
130
+ if (typeof space === 'number') {
131
+ for (i = 0; i < space; i += 1) {
132
+ indent += ' ';
133
+ }
134
+ } else if (typeof space === 'string') {
135
+ indent = space;
136
+ }
137
+ rep = replacer;
138
+ if (replacer && typeof replacer !== 'function' &&
139
+ (typeof replacer !== 'object' ||
140
+ typeof replacer.length !== 'number')) {
141
+ throw new Error('JSON.stringify');
142
+ }
143
+ return str('', {'': value});
144
+ };
145
+ }
146
+
147
+ if (typeof JSON['parse'] !== 'function') {
148
+ // JSON is parsed on the server for security.
149
+ JSON['parse'] = function (text) {return eval('('+text+')')};
150
+ }
151
+ }());
152
+ var NOW = 1
153
+ , READY = false
154
+ , READY_BUFFER = []
155
+ , PRESENCE_SUFFIX = '-pnpres'
156
+ , DEF_WINDOWING = 10 // MILLISECONDS.
157
+ , DEF_TIMEOUT = 10000 // MILLISECONDS.
158
+ , DEF_SUB_TIMEOUT = 310 // SECONDS.
159
+ , DEF_KEEPALIVE = 60 // SECONDS.
160
+ , SECOND = 1000 // A THOUSAND MILLISECONDS.
161
+ , URLBIT = '/'
162
+ , PARAMSBIT = '&'
163
+ , REPL = /{([\w\-]+)}/g;
164
+
165
+ /**
166
+ * UTILITIES
167
+ */
168
+ function unique() { return'x'+ ++NOW+''+(+new Date) }
169
+ function rnow() { return+new Date }
170
+
171
+ /**
172
+ * NEXTORIGIN
173
+ * ==========
174
+ * var next_origin = nextorigin();
175
+ */
176
+ var nextorigin = (function() {
177
+ var max = 20
178
+ , ori = Math.floor(Math.random() * max);
179
+ return function( origin, failover ) {
180
+ return origin.indexOf('pubsub.') > 0
181
+ && origin.replace(
182
+ 'pubsub', 'ps' + (
183
+ failover ? uuid().split('-')[0] :
184
+ (++ori < max? ori : ori=1)
185
+ ) ) || origin;
186
+ }
187
+ })();
188
+
189
+
190
+ /**
191
+ * Build Url
192
+ * =======
193
+ *
194
+ */
195
+ function build_url( url_components, url_params ) {
196
+ var url = url_components.join(URLBIT)
197
+ , params = [];
198
+
199
+ if (!url_params) return url;
200
+
201
+ each( url_params, function( key, value ) {
202
+ params.push(key + "=" + encode(value));
203
+ } );
204
+
205
+ url += "?" + params.join(PARAMSBIT);
206
+
207
+ return url;
208
+ }
209
+
210
+ /**
211
+ * UPDATER
212
+ * =======
213
+ * var timestamp = unique();
214
+ */
215
+ function updater( fun, rate ) {
216
+ var timeout
217
+ , last = 0
218
+ , runnit = function() {
219
+ if (last + rate > rnow()) {
220
+ clearTimeout(timeout);
221
+ timeout = setTimeout( runnit, rate );
222
+ }
223
+ else {
224
+ last = rnow();
225
+ fun();
226
+ }
227
+ };
228
+
229
+ return runnit;
230
+ }
231
+
232
+ /**
233
+ * GREP
234
+ * ====
235
+ * var list = grep( [1,2,3], function(item) { return item % 2 } )
236
+ */
237
+ function grep( list, fun ) {
238
+ var fin = [];
239
+ each( list || [], function(l) { fun(l) && fin.push(l) } );
240
+ return fin
241
+ }
242
+
243
+ /**
244
+ * SUPPLANT
245
+ * ========
246
+ * var text = supplant( 'Hello {name}!', { name : 'John' } )
247
+ */
248
+ function supplant( str, values ) {
249
+ return str.replace( REPL, function( _, match ) {
250
+ return values[match] || _
251
+ } );
252
+ }
253
+
254
+ /**
255
+ * timeout
256
+ * =======
257
+ * timeout( function(){}, 100 );
258
+ */
259
+ function timeout( fun, wait ) {
260
+ return setTimeout( fun, wait );
261
+ }
262
+
263
+ /**
264
+ * uuid
265
+ * ====
266
+ * var my_uuid = uuid();
267
+ */
268
+ function uuid(callback) {
269
+ var u = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
270
+ function(c) {
271
+ var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
272
+ return v.toString(16);
273
+ });
274
+ if (callback) callback(u);
275
+ return u;
276
+ }
277
+
278
+ /**
279
+ * EACH
280
+ * ====
281
+ * each( [1,2,3], function(item) { } )
282
+ */
283
+ function each( o, f ) {
284
+ if ( !o || !f ) return;
285
+
286
+ if ( typeof o[0] != 'undefined' )
287
+ for ( var i = 0, l = o.length; i < l; )
288
+ f.call( o[i], o[i], i++ );
289
+ else
290
+ for ( var i in o )
291
+ o.hasOwnProperty &&
292
+ o.hasOwnProperty(i) &&
293
+ f.call( o[i], i, o[i] );
294
+ }
295
+
296
+ /**
297
+ * MAP
298
+ * ===
299
+ * var list = map( [1,2,3], function(item) { return item + 1 } )
300
+ */
301
+ function map( list, fun ) {
302
+ var fin = [];
303
+ each( list || [], function( k, v ) { fin.push(fun( k, v )) } );
304
+ return fin;
305
+ }
306
+
307
+ /**
308
+ * ENCODE
309
+ * ======
310
+ * var encoded_path = encode('path');
311
+ */
312
+ function encode(path) {
313
+ return map( (encodeURIComponent(path)).split(''), function(chr) {
314
+ return "-_.!~*'()".indexOf(chr) < 0 ? chr :
315
+ "%"+chr.charCodeAt(0).toString(16).toUpperCase()
316
+ } ).join('');
317
+ }
318
+
319
+ /**
320
+ * Generate Subscription Channel List
321
+ * ==================================
322
+ * generate_channel_list(channels_object);
323
+ */
324
+ function generate_channel_list(channels) {
325
+ var list = [];
326
+ each( channels, function( channel, status ) {
327
+ if (status.subscribed) list.push(channel);
328
+ } );
329
+ return list.sort();
330
+ }
331
+
332
+ // PUBNUB READY TO CONNECT
333
+ function ready() { timeout( function() {
334
+ if (READY) return;
335
+ READY = 1;
336
+ each( READY_BUFFER, function(connect) { connect() } );
337
+ }, SECOND ); }
338
+
339
+ function PN_API(setup) {
340
+ var SUB_WINDOWING = +setup['windowing'] || DEF_WINDOWING
341
+ , SUB_TIMEOUT = (+setup['timeout'] || DEF_SUB_TIMEOUT) * SECOND
342
+ , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND
343
+ , NOLEAVE = setup['noleave'] || 0
344
+ , PUBLISH_KEY = setup['publish_key'] || ''
345
+ , SUBSCRIBE_KEY = setup['subscribe_key'] || ''
346
+ , AUTH_KEY = setup['auth_key'] || ''
347
+ , SSL = setup['ssl'] ? 's' : ''
348
+ , ORIGIN = 'http'+SSL+'://'+(setup['origin']||'pubsub.pubnub.com')
349
+ , STD_ORIGIN = nextorigin(ORIGIN)
350
+ , SUB_ORIGIN = nextorigin(ORIGIN)
351
+ , CONNECT = function(){}
352
+ , PUB_QUEUE = []
353
+ , SUB_CALLBACK = 0
354
+ , SUB_CHANNEL = 0
355
+ , SUB_RECEIVER = 0
356
+ , SUB_RESTORE = 0
357
+ , SUB_BUFF_WAIT = 0
358
+ , TIMETOKEN = 0
359
+ , CHANNELS = {}
360
+ , xdr = setup['xdr']
361
+ , error = setup['error'] || function() {}
362
+ , _is_online = setup['_is_online'] || function() { return 1 }
363
+ , jsonp_cb = setup['jsonp_cb'] || function() { return 0 }
364
+ , db = setup['db'] || {'get': function(){}, 'set': function(){}}
365
+ , UUID = setup['uuid'] || ( db && db['get'](SUBSCRIBE_KEY+'uuid') || '');
366
+
367
+ function publish(next) {
368
+ if (next) PUB_QUEUE.sending = 0;
369
+ if (PUB_QUEUE.sending || !PUB_QUEUE.length) return;
370
+ PUB_QUEUE.sending = 1;
371
+ xdr(PUB_QUEUE.shift());
372
+ }
373
+
374
+ function each_channel(callback) {
375
+ var count = 0;
376
+
377
+ each( generate_channel_list(CHANNELS), function(channel) {
378
+ var chan = CHANNELS[channel];
379
+
380
+ if (!chan) return;
381
+
382
+ count++;
383
+ (callback||function(){})(chan);
384
+ } );
385
+
386
+ return count;
387
+ }
388
+
389
+ // Announce Leave Event
390
+ var SELF = {
391
+ 'LEAVE' : function( channel, blocking ) {
392
+ var data = { 'uuid' : UUID, 'auth' : AUTH_KEY }
393
+ , origin = nextorigin(ORIGIN)
394
+ , jsonp = jsonp_cb();
395
+
396
+ // Prevent Leaving a Presence Channel
397
+ if (channel.indexOf(PRESENCE_SUFFIX) > 0) return;
398
+
399
+ // No Leave Patch (Prevent Blocking Leave if Desired)
400
+ if (NOLEAVE) return;
401
+
402
+ if (jsonp != '0') data['callback'] = jsonp;
403
+
404
+ xdr({
405
+ blocking : blocking || SSL,
406
+ timeout : 2000,
407
+ callback : jsonp,
408
+ data : data,
409
+ url : [
410
+ origin, 'v2', 'presence', 'sub_key',
411
+ SUBSCRIBE_KEY, 'channel', encode(channel), 'leave'
412
+ ]
413
+ });
414
+ },
415
+ /*
416
+ PUBNUB.history({
417
+ channel : 'my_chat_channel',
418
+ limit : 100,
419
+ callback : function(history) { }
420
+ });
421
+ */
422
+ 'history' : function( args, callback ) {
423
+ var callback = args['callback'] || callback
424
+ , count = args['count'] || args['limit'] || 100
425
+ , reverse = args['reverse'] || "false"
426
+ , err = args['error'] || function(){}
427
+ , channel = args['channel']
428
+ , start = args['start']
429
+ , end = args['end']
430
+ , params = {}
431
+ , jsonp = jsonp_cb();
432
+
433
+ // Make sure we have a Channel
434
+ if (!channel) return error('Missing Channel');
435
+ if (!callback) return error('Missing Callback');
436
+ if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
437
+
438
+ params['stringtoken'] = 'true';
439
+ params['count'] = count;
440
+ params['reverse'] = reverse;
441
+ params['auth'] = AUTH_KEY;
442
+
443
+ if (jsonp) params['callback'] = jsonp;
444
+ if (start) params['start'] = start;
445
+ if (end) params['end'] = end;
446
+
447
+ // Send Message
448
+ xdr({
449
+ callback : jsonp,
450
+ data : params,
451
+ success : function(response) { callback(response) },
452
+ fail : err,
453
+ url : [
454
+ STD_ORIGIN, 'v2', 'history', 'sub-key',
455
+ SUBSCRIBE_KEY, 'channel', encode(channel)
456
+ ]
457
+ });
458
+ },
459
+
460
+ /*
461
+ PUBNUB.replay({
462
+ source : 'my_channel',
463
+ destination : 'new_channel'
464
+ });
465
+ */
466
+ 'replay' : function(args) {
467
+ var callback = callback || args['callback'] || function(){}
468
+ , source = args['source']
469
+ , destination = args['destination']
470
+ , stop = args['stop']
471
+ , start = args['start']
472
+ , end = args['end']
473
+ , reverse = args['reverse']
474
+ , limit = args['limit']
475
+ , jsonp = jsonp_cb()
476
+ , data = {}
477
+ , url;
478
+
479
+ // Check User Input
480
+ if (!source) return error('Missing Source Channel');
481
+ if (!destination) return error('Missing Destination Channel');
482
+ if (!PUBLISH_KEY) return error('Missing Publish Key');
483
+ if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
484
+
485
+ // Setup URL Params
486
+ if (jsonp != '0') data['callback'] = jsonp;
487
+ if (stop) data['stop'] = 'all';
488
+ if (reverse) data['reverse'] = 'true';
489
+ if (start) data['start'] = start;
490
+ if (end) data['end'] = end;
491
+ if (limit) data['count'] = limit;
492
+
493
+ data['auth'] = AUTH_KEY;
494
+
495
+ // Compose URL Parts
496
+ url = [
497
+ STD_ORIGIN, 'v1', 'replay',
498
+ PUBLISH_KEY, SUBSCRIBE_KEY,
499
+ source, destination
500
+ ];
501
+
502
+ // Start (or Stop) Replay!
503
+ xdr({
504
+ callback : jsonp,
505
+ success : function(response) { callback(response) },
506
+ fail : function() { callback([ 0, 'Disconnected' ]) },
507
+ url : url,
508
+ data : data
509
+ });
510
+ },
511
+
512
+ /*
513
+ PUBNUB.auth('AJFLKAJSDKLA');
514
+ */
515
+ 'auth' : function(auth) {
516
+ AUTH_KEY = auth;
517
+ CONNECT();
518
+ },
519
+
520
+ /*
521
+ PUBNUB.time(function(time){ });
522
+ */
523
+ 'time' : function(callback) {
524
+ var jsonp = jsonp_cb();
525
+ xdr({
526
+ callback : jsonp,
527
+ data : { 'uuid' : UUID, 'auth' : AUTH_KEY },
528
+ timeout : SECOND * 5,
529
+ url : [STD_ORIGIN, 'time', jsonp],
530
+ success : function(response) { callback(response[0]) },
531
+ fail : function() { callback(0) }
532
+ });
533
+ },
534
+
535
+ /*
536
+ PUBNUB.publish({
537
+ channel : 'my_chat_channel',
538
+ message : 'hello!'
539
+ });
540
+ */
541
+ 'publish' : function( args, callback ) {
542
+ var callback = callback || args['callback'] || function(){}
543
+ , msg = args['message']
544
+ , channel = args['channel']
545
+ , jsonp = jsonp_cb()
546
+ , url;
547
+
548
+ if (!msg) return error('Missing Message');
549
+ if (!channel) return error('Missing Channel');
550
+ if (!PUBLISH_KEY) return error('Missing Publish Key');
551
+ if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
552
+
553
+ // If trying to send Object
554
+ msg = JSON['stringify'](msg);
555
+
556
+ // Create URL
557
+ url = [
558
+ STD_ORIGIN, 'publish',
559
+ PUBLISH_KEY, SUBSCRIBE_KEY,
560
+ 0, encode(channel),
561
+ jsonp, encode(msg)
562
+ ];
563
+
564
+ // Queue Message Send
565
+ PUB_QUEUE.push({
566
+ callback : jsonp,
567
+ timeout : SECOND * 5,
568
+ url : url,
569
+ data : { 'uuid' : UUID, 'auth' : AUTH_KEY },
570
+ success : function(response){callback(response);publish(1)},
571
+ fail : function(){callback([0,'Failed',msg]);publish(1)}
572
+ });
573
+
574
+ // Send Message
575
+ publish();
576
+ },
577
+
578
+ /*
579
+ PUBNUB.unsubscribe({ channel : 'my_chat' });
580
+ */
581
+ 'unsubscribe' : function(args) {
582
+ var channel = args['channel'];
583
+
584
+ TIMETOKEN = 0;
585
+ SUB_RESTORE = 1;
586
+
587
+ // Prepare Channel(s)
588
+ channel = map( (
589
+ channel.join ? channel.join(',') : ''+channel
590
+ ).split(','), function(channel) {
591
+ return channel + ',' + channel + PRESENCE_SUFFIX;
592
+ } ).join(',');
593
+
594
+ // Iterate over Channels
595
+ each( channel.split(','), function(channel) {
596
+ if (READY) SELF['LEAVE']( channel, 0 );
597
+ CHANNELS[channel] = 0;
598
+ } );
599
+
600
+ // Reset Connection if Count Less
601
+ //if (each_channel() < 2)
602
+ CONNECT();
603
+ },
604
+
605
+ /*
606
+ PUBNUB.subscribe({
607
+ channel : 'my_chat'
608
+ callback : function(message) { }
609
+ });
610
+ */
611
+ 'subscribe' : function( args, callback ) {
612
+ var channel = args['channel']
613
+ , callback = callback || args['callback']
614
+ , callback = callback || args['message']
615
+ , connect = args['connect'] || function(){}
616
+ , reconnect = args['reconnect'] || function(){}
617
+ , disconnect = args['disconnect'] || function(){}
618
+ , errcb = args['error'] || function(){}
619
+ , presence = args['presence'] || 0
620
+ , noheresync = args['noheresync'] || 0
621
+ , backfill = args['backfill'] || 0
622
+ , timetoken = args['timetoken'] || 0
623
+ , sub_timeout = args['timeout'] || SUB_TIMEOUT
624
+ , windowing = args['windowing'] || SUB_WINDOWING
625
+ , restore = args['restore'];
626
+
627
+ // Restore Enabled?
628
+ SUB_RESTORE = restore;
629
+
630
+ // Always Reset the TT
631
+ TIMETOKEN = timetoken;
632
+
633
+ // Make sure we have a Channel
634
+ if (!channel) return error('Missing Channel');
635
+ if (!callback) return error('Missing Callback');
636
+ if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
637
+
638
+ // Setup Channel(s)
639
+ each( (channel.join ? channel.join(',') : ''+channel).split(','),
640
+ function(channel) {
641
+ var settings = CHANNELS[channel] || {};
642
+
643
+ // Store Channel State
644
+ CHANNELS[SUB_CHANNEL = channel] = {
645
+ name : channel,
646
+ connected : settings.connected,
647
+ disconnected : settings.disconnected,
648
+ subscribed : 1,
649
+ callback : SUB_CALLBACK = callback,
650
+ connect : connect,
651
+ disconnect : disconnect,
652
+ reconnect : reconnect
653
+ };
654
+
655
+ // Presence Enabled?
656
+ if (!presence) return;
657
+
658
+ // Subscribe Presence Channel
659
+ SELF['subscribe']({
660
+ 'channel' : channel + PRESENCE_SUFFIX,
661
+ 'callback' : presence
662
+ });
663
+
664
+ // Presence Subscribed?
665
+ if (settings.subscribed) return;
666
+
667
+ // See Who's Here Now?
668
+ if (noheresync) return;
669
+ SELF['here_now']({
670
+ 'channel' : channel,
671
+ 'callback' : function(here) {
672
+ each( 'uuids' in here ? here['uuids'] : [],
673
+ function(uid) { presence( {
674
+ 'action' : 'join',
675
+ 'uuid' : uid,
676
+ 'timestamp' : rnow(),
677
+ 'occupancy' : here['occupancy'] || 1
678
+ }, here, channel ); } );
679
+ }
680
+ });
681
+ } );
682
+
683
+ // Test Network Connection
684
+ function _test_connection(success) {
685
+ if (success) {
686
+ // Begin Next Socket Connection
687
+ timeout( CONNECT, SECOND );
688
+ }
689
+ else {
690
+ // New Origin on Failed Connection
691
+ STD_ORIGIN = nextorigin( ORIGIN, 1 );
692
+ SUB_ORIGIN = nextorigin( ORIGIN, 1 );
693
+
694
+ // Re-test Connection
695
+ timeout( function() {
696
+ SELF['time'](_test_connection);
697
+ }, SECOND );
698
+ }
699
+
700
+ // Disconnect & Reconnect
701
+ each_channel(function(channel){
702
+ // Reconnect
703
+ if (success && channel.disconnected) {
704
+ channel.disconnected = 0;
705
+ return channel.reconnect(channel.name);
706
+ }
707
+
708
+ // Disconnect
709
+ if (!success && !channel.disconnected) {
710
+ channel.disconnected = 1;
711
+ channel.disconnect(channel.name);
712
+ }
713
+ });
714
+ }
715
+
716
+ // Evented Subscribe
717
+ function _connect() {
718
+ var jsonp = jsonp_cb()
719
+ , channels = generate_channel_list(CHANNELS).join(',');
720
+
721
+ // Stop Connection
722
+ if (!channels) return;
723
+
724
+ // Connect to PubNub Subscribe Servers
725
+ _reset_offline();
726
+ SUB_RECEIVER = xdr({
727
+ timeout : sub_timeout,
728
+ callback : jsonp,
729
+ fail : function() {
730
+ SUB_RECEIVER = null;
731
+ SELF['time'](_test_connection);
732
+ },
733
+ data : { 'uuid' : UUID, 'auth' : AUTH_KEY },
734
+ url : [
735
+ SUB_ORIGIN, 'subscribe',
736
+ SUBSCRIBE_KEY, encode(channels),
737
+ jsonp, TIMETOKEN
738
+ ],
739
+ success : function(messages) {
740
+ SUB_RECEIVER = null;
741
+
742
+ // Check for Errors
743
+ if (!messages || (
744
+ typeof messages == 'object' &&
745
+ 'error' in messages &&
746
+ !messages['error'])
747
+ ) {
748
+ errcb(messages);
749
+ return timeout( CONNECT, windowing );
750
+ }
751
+
752
+ // Restore Previous Connection Point if Needed
753
+ TIMETOKEN = !TIMETOKEN &&
754
+ SUB_RESTORE &&
755
+ db['get'](SUBSCRIBE_KEY) || messages[1];
756
+
757
+ // Connect
758
+ each_channel(function(channel){
759
+ if (channel.connected) return;
760
+ channel.connected = 1;
761
+ channel.connect(channel.name);
762
+ });
763
+
764
+ // Invoke Memory Catchup and Receive Up to 100
765
+ // Previous Messages from the Queue.
766
+ if (backfill) {
767
+ TIMETOKEN = 10000;
768
+ backfill = 0;
769
+ }
770
+
771
+ // Update Saved Timetoken
772
+ db['set']( SUBSCRIBE_KEY, messages[1] );
773
+
774
+ // Route Channel <---> Callback for Message
775
+ var next_callback = (function() {
776
+ var channels = (messages.length>2?messages[2]:map(
777
+ CHANNELS, function(chan) { return map(
778
+ Array(messages[0].length)
779
+ .join(',').split(','),
780
+ function() { return chan; }
781
+ ) }).join(','));
782
+ var list = channels.split(',');
783
+
784
+ return function() {
785
+ var channel = list.shift()||SUB_CHANNEL;
786
+ return [
787
+ (CHANNELS[channel]||{})
788
+ .callback||SUB_CALLBACK,
789
+ channel.split(PRESENCE_SUFFIX)[0]
790
+ ];
791
+ };
792
+ })();
793
+
794
+ each( messages[0], function(msg) {
795
+ var next = next_callback();
796
+ next[0]( msg, messages, next[1] );
797
+ } );
798
+
799
+ timeout( _connect, windowing );
800
+ }
801
+ });
802
+ }
803
+
804
+ CONNECT = function() {
805
+ _reset_offline();
806
+ timeout( _connect, windowing );
807
+ };
808
+
809
+ // Reduce Status Flicker
810
+ if (!READY) return READY_BUFFER.push(CONNECT);
811
+
812
+ // Connect Now
813
+ CONNECT();
814
+ },
815
+
816
+ 'here_now' : function( args, callback ) {
817
+ var callback = args['callback'] || callback
818
+ , err = args['error'] || function(){}
819
+ , channel = args['channel']
820
+ , jsonp = jsonp_cb()
821
+ , data = { 'uuid' : UUID, 'auth' : AUTH_KEY };
822
+
823
+ // Make sure we have a Channel
824
+ if (!channel) return error('Missing Channel');
825
+ if (!callback) return error('Missing Callback');
826
+ if (!SUBSCRIBE_KEY) return error('Missing Subscribe Key');
827
+
828
+ if (jsonp != '0') { data['callback'] = jsonp; }
829
+
830
+ xdr({
831
+ callback : jsonp,
832
+ data : data,
833
+ success : function(response) { callback(response,channel) },
834
+ fail : err,
835
+ url : [
836
+ STD_ORIGIN, 'v2', 'presence',
837
+ 'sub_key', SUBSCRIBE_KEY,
838
+ 'channel', encode(channel)
839
+ ]
840
+ });
841
+ },
842
+
843
+ // Expose PUBNUB Functions
844
+ 'xdr' : xdr,
845
+ 'ready' : ready,
846
+ 'db' : db,
847
+ 'uuid' : uuid,
848
+ 'map' : map,
849
+ 'each' : each,
850
+ 'each-channel' : each_channel,
851
+ 'grep' : grep,
852
+ 'offline' : function(){_reset_offline(1)},
853
+ 'supplant' : supplant,
854
+ 'now' : rnow,
855
+ 'unique' : unique,
856
+ 'updater' : updater
857
+ };
858
+
859
+ function _poll_online() {
860
+ _is_online() || _reset_offline(1);
861
+ timeout( _poll_online, SECOND );
862
+ }
863
+
864
+ function _poll_online2() {
865
+ SELF['time'](function(success){
866
+ success || _reset_offline(1);
867
+ timeout( _poll_online2, KEEPALIVE );
868
+ })
869
+ }
870
+
871
+ function _reset_offline(err) {
872
+ SUB_RECEIVER && SUB_RECEIVER(err);
873
+ SUB_RECEIVER = null;
874
+ }
875
+
876
+ if (!UUID) UUID = SELF['uuid']();
877
+ db['set']( SUBSCRIBE_KEY + 'uuid', UUID );
878
+
879
+ timeout( _poll_online, SECOND );
880
+ timeout( _poll_online2, KEEPALIVE );
881
+
882
+ SELF['time'](function() {});
883
+
884
+ return SELF;
885
+ }
886
+ /* =-====================================================================-= */
887
+ /* =-====================================================================-= */
888
+ /* =-========================= UTIL =============================-= */
889
+ /* =-====================================================================-= */
890
+ /* =-====================================================================-= */
891
+
892
+ window['PUBNUB'] || (function() {
893
+
894
+ /**
895
+ * UTIL LOCALS
896
+ */
897
+
898
+ var SWF = 'https://pubnub.a.ssl.fastly.net/pubnub.swf'
899
+ , ASYNC = 'async'
900
+ , UA = navigator.userAgent
901
+ , PNSDK = 'PubNub-JS-' + 'Web' + '/' + '3.5.3.1'
902
+ , XORIGN = UA.indexOf('MSIE 6') == -1;
903
+
904
+ /**
905
+ * CONSOLE COMPATIBILITY
906
+ */
907
+ window.console || (window.console=window.console||{});
908
+ console.log || (
909
+ console.log =
910
+ console.error =
911
+ ((window.opera||{}).postError||function(){})
912
+ );
913
+
914
+ /**
915
+ * LOCAL STORAGE OR COOKIE
916
+ */
917
+ var db = (function(){
918
+ var ls = window['localStorage'];
919
+ return {
920
+ 'get' : function(key) {
921
+ try {
922
+ if (ls) return ls.getItem(key);
923
+ if (document.cookie.indexOf(key) == -1) return null;
924
+ return ((document.cookie||'').match(
925
+ RegExp(key+'=([^;]+)')
926
+ )||[])[1] || null;
927
+ } catch(e) { return }
928
+ },
929
+ 'set' : function( key, value ) {
930
+ try {
931
+ if (ls) return ls.setItem( key, value ) && 0;
932
+ document.cookie = key + '=' + value +
933
+ '; expires=Thu, 1 Aug 2030 20:00:00 UTC; path=/';
934
+ } catch(e) { return }
935
+ }
936
+ };
937
+ })();
938
+
939
+
940
+ /**
941
+ * $
942
+ * =
943
+ * var div = $('divid');
944
+ */
945
+ function $(id) { return document.getElementById(id) }
946
+
947
+ /**
948
+ * ERROR
949
+ * =====
950
+ * error('message');
951
+ */
952
+ function error(message) { console['error'](message) }
953
+
954
+ /**
955
+ * SEARCH
956
+ * ======
957
+ * var elements = search('a div span');
958
+ */
959
+ function search( elements, start ) {
960
+ var list = [];
961
+ each( elements.split(/\s+/), function(el) {
962
+ each( (start || document).getElementsByTagName(el), function(node) {
963
+ list.push(node);
964
+ } );
965
+ } );
966
+ return list;
967
+ }
968
+
969
+ /**
970
+ * BIND
971
+ * ====
972
+ * bind( 'keydown', search('a')[0], function(element) {
973
+ * ...
974
+ * } );
975
+ */
976
+ function bind( type, el, fun ) {
977
+ each( type.split(','), function(etype) {
978
+ var rapfun = function(e) {
979
+ if (!e) e = window.event;
980
+ if (!fun(e)) {
981
+ e.cancelBubble = true;
982
+ e.returnValue = false;
983
+ e.preventDefault && e.preventDefault();
984
+ e.stopPropagation && e.stopPropagation();
985
+ }
986
+ };
987
+
988
+ if ( el.addEventListener ) el.addEventListener( etype, rapfun, false );
989
+ else if ( el.attachEvent ) el.attachEvent( 'on' + etype, rapfun );
990
+ else el[ 'on' + etype ] = rapfun;
991
+ } );
992
+ }
993
+
994
+ /**
995
+ * UNBIND
996
+ * ======
997
+ * unbind( 'keydown', search('a')[0] );
998
+ */
999
+ function unbind( type, el, fun ) {
1000
+ if ( el.removeEventListener ) el.removeEventListener( type, false );
1001
+ else if ( el.detachEvent ) el.detachEvent( 'on' + type, false );
1002
+ else el[ 'on' + type ] = null;
1003
+ }
1004
+
1005
+ /**
1006
+ * HEAD
1007
+ * ====
1008
+ * head().appendChild(elm);
1009
+ */
1010
+ function head() { return search('head')[0] }
1011
+
1012
+ /**
1013
+ * ATTR
1014
+ * ====
1015
+ * var attribute = attr( node, 'attribute' );
1016
+ */
1017
+ function attr( node, attribute, value ) {
1018
+ if (value) node.setAttribute( attribute, value );
1019
+ else return node && node.getAttribute && node.getAttribute(attribute);
1020
+ }
1021
+
1022
+ /**
1023
+ * CSS
1024
+ * ===
1025
+ * var obj = create('div');
1026
+ */
1027
+ function css( element, styles ) {
1028
+ for (var style in styles) if (styles.hasOwnProperty(style))
1029
+ try {element.style[style] = styles[style] + (
1030
+ '|width|height|top|left|'.indexOf(style) > 0 &&
1031
+ typeof styles[style] == 'number'
1032
+ ? 'px' : ''
1033
+ )}catch(e){}
1034
+ }
1035
+
1036
+ /**
1037
+ * CREATE
1038
+ * ======
1039
+ * var obj = create('div');
1040
+ */
1041
+ function create(element) { return document.createElement(element) }
1042
+
1043
+
1044
+ /**
1045
+ * jsonp_cb
1046
+ * ========
1047
+ * var callback = jsonp_cb();
1048
+ */
1049
+ function jsonp_cb() { return XORIGN || FDomainRequest() ? 0 : unique() }
1050
+
1051
+
1052
+
1053
+ /**
1054
+ * EVENTS
1055
+ * ======
1056
+ * PUBNUB.events.bind( 'you-stepped-on-flower', function(message) {
1057
+ * // Do Stuff with message
1058
+ * } );
1059
+ *
1060
+ * PUBNUB.events.fire( 'you-stepped-on-flower', "message-data" );
1061
+ * PUBNUB.events.fire( 'you-stepped-on-flower', {message:"data"} );
1062
+ * PUBNUB.events.fire( 'you-stepped-on-flower', [1,2,3] );
1063
+ *
1064
+ */
1065
+ var events = {
1066
+ 'list' : {},
1067
+ 'unbind' : function( name ) { events.list[name] = [] },
1068
+ 'bind' : function( name, fun ) {
1069
+ (events.list[name] = events.list[name] || []).push(fun);
1070
+ },
1071
+ 'fire' : function( name, data ) {
1072
+ each(
1073
+ events.list[name] || [],
1074
+ function(fun) { fun(data) }
1075
+ );
1076
+ }
1077
+ };
1078
+
1079
+ /**
1080
+ * XDR Cross Domain Request
1081
+ * ========================
1082
+ * xdr({
1083
+ * url : ['http://www.blah.com/url'],
1084
+ * success : function(response) {},
1085
+ * fail : function() {}
1086
+ * });
1087
+ */
1088
+ function xdr( setup ) {
1089
+ if (XORIGN || FDomainRequest()) return ajax(setup);
1090
+
1091
+ var script = create('script')
1092
+ , callback = setup.callback
1093
+ , id = unique()
1094
+ , finished = 0
1095
+ , xhrtme = setup.timeout || DEF_TIMEOUT
1096
+ , timer = timeout( function(){done(1)}, xhrtme )
1097
+ , fail = setup.fail || function(){}
1098
+ , data = setup.data || {}
1099
+ , success = setup.success || function(){}
1100
+ , append = function() { head().appendChild(script) }
1101
+ , done = function( failed, response ) {
1102
+ if (finished) return;
1103
+ finished = 1;
1104
+
1105
+ script.onerror = null;
1106
+ clearTimeout(timer);
1107
+
1108
+ (failed || !response) || success(response);
1109
+
1110
+ timeout( function() {
1111
+ failed && fail();
1112
+ var s = $(id)
1113
+ , p = s && s.parentNode;
1114
+ p && p.removeChild(s);
1115
+ }, SECOND );
1116
+ };
1117
+
1118
+ window[callback] = function(response) {
1119
+ done( 0, response );
1120
+ };
1121
+
1122
+ if (!setup.blocking) script[ASYNC] = ASYNC;
1123
+
1124
+ script.onerror = function() { done(1) };
1125
+ data['pnsdk'] = PNSDK;
1126
+ script.src = build_url( setup.url, data );
1127
+
1128
+ attr( script, 'id', id );
1129
+
1130
+ append();
1131
+ return done;
1132
+ }
1133
+
1134
+ /**
1135
+ * CORS XHR Request
1136
+ * ================
1137
+ * xdr({
1138
+ * url : ['http://www.blah.com/url'],
1139
+ * success : function(response) {},
1140
+ * fail : function() {}
1141
+ * });
1142
+ */
1143
+ function ajax( setup ) {
1144
+ var xhr, response
1145
+ , finished = function() {
1146
+ if (loaded) return;
1147
+ loaded = 1;
1148
+
1149
+ clearTimeout(timer);
1150
+
1151
+ try { response = JSON['parse'](xhr.responseText); }
1152
+ catch (r) { return done(1); }
1153
+
1154
+ complete = 1;
1155
+ success(response);
1156
+ }
1157
+ , complete = 0
1158
+ , loaded = 0
1159
+ , xhrtme = setup.timeout || DEF_TIMEOUT
1160
+ , timer = timeout( function(){done(1)}, xhrtme )
1161
+ , fail = setup.fail || function(){}
1162
+ , data = setup.data || {}
1163
+ , success = setup.success || function(){}
1164
+ , async = ( typeof(setup.blocking) === 'undefined' )
1165
+ , done = function(failed) {
1166
+ if (complete) return;
1167
+ complete = 1;
1168
+
1169
+ clearTimeout(timer);
1170
+
1171
+ if (xhr) {
1172
+ xhr.onerror = xhr.onload = null;
1173
+ xhr.abort && xhr.abort();
1174
+ xhr = null;
1175
+ }
1176
+
1177
+ failed && fail();
1178
+ };
1179
+
1180
+ // Send
1181
+ try {
1182
+ xhr = FDomainRequest() ||
1183
+ window.XDomainRequest &&
1184
+ new XDomainRequest() ||
1185
+ new XMLHttpRequest();
1186
+
1187
+ xhr.onerror = xhr.onabort = function(){ done(1) };
1188
+ xhr.onload = xhr.onloadend = finished;
1189
+ if (async) xhr.timeout = xhrtme;
1190
+
1191
+ data['pnsdk'] = PNSDK;
1192
+ var url = build_url(setup.url,data);
1193
+
1194
+ xhr.open( 'GET', url, async );
1195
+ xhr.send();
1196
+ }
1197
+ catch(eee) {
1198
+ done(0);
1199
+ XORIGN = 0;
1200
+ return xdr(setup);
1201
+ }
1202
+
1203
+ // Return 'done'
1204
+ return done;
1205
+ }
1206
+
1207
+
1208
+
1209
+ // Test Connection State
1210
+ function _is_online() {
1211
+ if (!('onLine' in navigator)) return 1;
1212
+ return navigator['onLine'];
1213
+ }
1214
+
1215
+
1216
+ /* =-====================================================================-= */
1217
+ /* =-====================================================================-= */
1218
+ /* =-========================= PUBNUB ===========================-= */
1219
+ /* =-====================================================================-= */
1220
+ /* =-====================================================================-= */
1221
+
1222
+ var PDIV = $('pubnub') || 0
1223
+ , CREATE_PUBNUB = function(setup) {
1224
+
1225
+ // Force JSONP if requested from user.
1226
+ if (setup['jsonp']) XORIGN = 0;
1227
+
1228
+ var SUBSCRIBE_KEY = setup['subscribe_key'] || ''
1229
+ , KEEPALIVE = (+setup['keepalive'] || DEF_KEEPALIVE) * SECOND
1230
+ , UUID = setup['uuid'] || db['get'](SUBSCRIBE_KEY+'uuid')||'';
1231
+
1232
+ setup['xdr'] = xdr;
1233
+ setup['db'] = db;
1234
+ setup['error'] = error;
1235
+ setup['_is_online'] = _is_online;
1236
+ setup['jsonp_cb'] = jsonp_cb;
1237
+
1238
+ var SELF = PN_API(setup);
1239
+ SELF['css'] = css;
1240
+ SELF['$'] = $;
1241
+ SELF['create'] = create;
1242
+ SELF['bind'] = bind;
1243
+ SELF['head'] = head;
1244
+ SELF['search'] = search;
1245
+ SELF['attr'] = attr;
1246
+ SELF['events'] = events;
1247
+ SELF['init'] = CREATE_PUBNUB;
1248
+
1249
+
1250
+ // Add Leave Functions
1251
+ bind( 'beforeunload', window, function() {
1252
+ SELF['each-channel'](function(ch){ SELF['LEAVE']( ch.name, 0 ) });
1253
+ return true;
1254
+ } );
1255
+
1256
+ // Return without Testing
1257
+ if (setup['notest']) return SELF;
1258
+
1259
+ bind( 'offline', window, SELF['offline'] );
1260
+ bind( 'offline', document, SELF['offline'] );
1261
+
1262
+ // Return PUBNUB Socket Object
1263
+ return SELF;
1264
+ };
1265
+
1266
+ // Bind for PUBNUB Readiness to Subscribe
1267
+ bind( 'load', window, function(){ timeout( ready, 0 ) } );
1268
+
1269
+ var pdiv = PDIV || {};
1270
+
1271
+ // CREATE A PUBNUB GLOBAL OBJECT
1272
+ PUBNUB = CREATE_PUBNUB({
1273
+ 'notest' : 1,
1274
+ 'publish_key' : attr( pdiv, 'pub-key' ),
1275
+ 'subscribe_key' : attr( pdiv, 'sub-key' ),
1276
+ 'ssl' : !document.location.href.indexOf('https') ||
1277
+ attr( pdiv, 'ssl' ) == 'on',
1278
+ 'origin' : attr( pdiv, 'origin' ),
1279
+ 'uuid' : attr( pdiv, 'uuid' )
1280
+ });
1281
+
1282
+ // jQuery Interface
1283
+ window['jQuery'] && (window['jQuery']['PUBNUB'] = PUBNUB);
1284
+
1285
+ // For Modern JS + Testling.js - http://testling.com/
1286
+ typeof(module) !== 'undefined' && (module['exports'] = PUBNUB) && ready();
1287
+
1288
+ var pubnubs = $('pubnubs') || 0;
1289
+
1290
+ // LEAVE NOW IF NO PDIV.
1291
+ if (!PDIV) return;
1292
+
1293
+ // PUBNUB Flash Socket
1294
+ css( PDIV, { 'position' : 'absolute', 'top' : -SECOND } );
1295
+
1296
+ if ('opera' in window || attr( PDIV, 'flash' )) PDIV['innerHTML'] =
1297
+ '<object id=pubnubs data=' + SWF +
1298
+ '><param name=movie value=' + SWF +
1299
+ '><param name=allowscriptaccess value=always></object>';
1300
+
1301
+ // Create Interface for Opera Flash
1302
+ PUBNUB['rdx'] = function( id, data ) {
1303
+ if (!data) return FDomainRequest[id]['onerror']();
1304
+ FDomainRequest[id]['responseText'] = unescape(data);
1305
+ FDomainRequest[id]['onload']();
1306
+ };
1307
+
1308
+ function FDomainRequest() {
1309
+ if (!pubnubs || !pubnubs['get']) return 0;
1310
+
1311
+ var fdomainrequest = {
1312
+ 'id' : FDomainRequest['id']++,
1313
+ 'send' : function() {},
1314
+ 'abort' : function() { fdomainrequest['id'] = {} },
1315
+ 'open' : function( method, url ) {
1316
+ FDomainRequest[fdomainrequest['id']] = fdomainrequest;
1317
+ pubnubs['get']( fdomainrequest['id'], url );
1318
+ }
1319
+ };
1320
+
1321
+ return fdomainrequest;
1322
+ }
1323
+ FDomainRequest['id'] = SECOND;
1324
+
1325
+ })();
1326
+ (function(){
1327
+
1328
+ // ---------------------------------------------------------------------------
1329
+ // WEBSOCKET INTERFACE
1330
+ // ---------------------------------------------------------------------------
1331
+ var WS = PUBNUB['ws'] = function( url, protocols ) {
1332
+ if (!(this instanceof WS)) return new WS( url, protocols );
1333
+
1334
+ var self = this
1335
+ , url = self.url = url || ''
1336
+ , protocol = self.protocol = protocols || 'Sec-WebSocket-Protocol'
1337
+ , bits = url.split('/')
1338
+ , setup = {
1339
+ 'ssl' : bits[0] === 'wss:'
1340
+ ,'origin' : bits[2]
1341
+ ,'publish_key' : bits[3]
1342
+ ,'subscribe_key' : bits[4]
1343
+ ,'channel' : bits[5]
1344
+ };
1345
+
1346
+ // READY STATES
1347
+ self['CONNECTING'] = 0; // The connection is not yet open.
1348
+ self['OPEN'] = 1; // The connection is open and ready to communicate.
1349
+ self['CLOSING'] = 2; // The connection is in the process of closing.
1350
+ self['CLOSED'] = 3; // The connection is closed or couldn't be opened.
1351
+
1352
+ // CLOSE STATES
1353
+ self['CLOSE_NORMAL'] = 1000; // Normal Intended Close; completed.
1354
+ self['CLOSE_GOING_AWAY'] = 1001; // Closed Unexpecttedly.
1355
+ self['CLOSE_PROTOCOL_ERROR'] = 1002; // Server: Not Supported.
1356
+ self['CLOSE_UNSUPPORTED'] = 1003; // Server: Unsupported Protocol.
1357
+ self['CLOSE_TOO_LARGE'] = 1004; // Server: Too Much Data.
1358
+ self['CLOSE_NO_STATUS'] = 1005; // Server: No reason.
1359
+ self['CLOSE_ABNORMAL'] = 1006; // Abnormal Disconnect.
1360
+
1361
+ // Events Default
1362
+ self['onclose'] = self['onerror'] =
1363
+ self['onmessage'] = self['onopen'] =
1364
+ self['onsend'] = function(){};
1365
+
1366
+ // Attributes
1367
+ self['binaryType'] = '';
1368
+ self['extensions'] = '';
1369
+ self['bufferedAmount'] = 0;
1370
+ self['trasnmitting'] = false;
1371
+ self['buffer'] = [];
1372
+ self['readyState'] = self['CONNECTING'];
1373
+
1374
+ // Close if no setup.
1375
+ if (!url) {
1376
+ self['readyState'] = self['CLOSED'];
1377
+ self['onclose']({
1378
+ 'code' : self['CLOSE_ABNORMAL'],
1379
+ 'reason' : 'Missing URL',
1380
+ 'wasClean' : true
1381
+ });
1382
+ return self;
1383
+ }
1384
+
1385
+ // PubNub WebSocket Emulation
1386
+ self.pubnub = PUBNUB['init'](setup);
1387
+ self.pubnub.setup = setup;
1388
+ self.setup = setup;
1389
+
1390
+ self.pubnub['subscribe']({
1391
+ 'restore' : false,
1392
+ 'channel' : setup['channel'],
1393
+ 'disconnect' : self['onerror'],
1394
+ 'reconnect' : self['onopen'],
1395
+ 'error' : function() {
1396
+ self['onclose']({
1397
+ 'code' : self['CLOSE_ABNORMAL'],
1398
+ 'reason' : 'Missing URL',
1399
+ 'wasClean' : false
1400
+ });
1401
+ },
1402
+ 'callback' : function(message) {
1403
+ self['onmessage']({ 'data' : message });
1404
+ },
1405
+ 'connect' : function() {
1406
+ self['readyState'] = self['OPEN'];
1407
+ self['onopen']();
1408
+ }
1409
+ });
1410
+ };
1411
+
1412
+ // ---------------------------------------------------------------------------
1413
+ // WEBSOCKET SEND
1414
+ // ---------------------------------------------------------------------------
1415
+ WS.prototype.send = function(data) {
1416
+ var self = this;
1417
+ self.pubnub['publish']({
1418
+ 'channel' : self.pubnub.setup['channel'],
1419
+ 'message' : data,
1420
+ 'callback' : function(response) {
1421
+ self['onsend']({ 'data' : response });
1422
+ }
1423
+ });
1424
+ };
1425
+
1426
+ // ---------------------------------------------------------------------------
1427
+ // WEBSOCKET CLOSE
1428
+ // ---------------------------------------------------------------------------
1429
+ WS.prototype.close = function() {
1430
+ var self = this;
1431
+ self.pubnub['unsubscribe']({ 'channel' : self.pubnub.setup['channel'] });
1432
+ self['readyState'] = self['CLOSED'];
1433
+ self['onclose']({});
1434
+ };
1435
+
1436
+ })();