
Object.extend(String.English,{});SN=SC.Object.create({server:null,FIXTURES:[],controllers:[],serverURL:'/cgi-bin/sn-server.cgi'});require('core');require('pjswlf');SN.Note=SC.Record.extend({properties:['title','text','created','modified','uid','docId','isPublic'],commitChanges:function(){var now=new Date();this.set('modified',now.format('yyyy-MM-dd HH:mm:ss'));if(this.get('title')=='')this.set('title','untitled');this.commit();},wikify:function(){return SN.Note.Wikify(this.get("text"));}.property("text"),wikifiedHTML:function(){return SN.Note.WikifiedHTML(this.get("text"));}.property("text"),matchCondition:function(key,value){if(key=='search'){try{var regex=new RegExp(value,"i");}catch(e){return false;}
if(this.get('title'))var title_check=this.get('title').match(regex);if(this.get('text'))var text_check=this.get('text').match(regex);if(!title_check&&!text_check){return false;}else{return true;}}else if(key=='notDocId'){return this.get('docId')!=value;}else{$super();}}});SN.Note.Verify=function(text){if(typeof(text)!='string')return'';};SN.Note.Wikify=function(text){if(text==null)return null;if(typeof(text)!='string')return null;var div=pjswlf.doMarkup(text);return div;};SN.Note.WikifiedHTML=function(text){var div=SN.Note.Wikify(text);if(div==null)return'';return div.innerHTML;};function main(){SN.server=SN.Server.create({prefix:['SN']});SC.page.awake();SC.page.get('loginDialog').get('username').rootElement.select();var collection=SN.Note.collection({recordType:SN.Note});SN.masterController.set('content',collection);collection.set('orderBy',['modified DESC','created DESC','title']);};require('core');require('md5');SN.accountController=SC.Object.create({isLogin:NO,uid:-1,username:'',password:'',confirm_pass:'',token:'',loginIsVisible:YES,loginButtonEnabled:YES,loginButtonTitle:'Login',loginButtonIsVisible:YES,signupIsVisible:NO,signupButtonEnabled:YES,signupButtonTitle:'Signup',changeButtonEnables:YES,changeButtonTitle:'Change',login:function(){if(SN.FIXTURES.length!=0){this.set('username','demo');this.set('loginButtonEnabled',NO);this.set('loginButtonTitle','Loading...');setTimeout(this._loginSuccess.bind(this),1000);return;}
var _this=this;SN.server.request({url:SN.serverURL,params:{username:this.get('username'),password:this.get('password')},method:'sn_login',success:this._loginSuccess.bind(this),error:this._loginFail.bind(this),fail:this._loginFail.bind(this)});this.set('loginButtonEnabled',NO);this.set('loginButtonTitle','Loading...');},_loginSuccess:function(res){this.set("isLogin",YES);this.set('loginButtonEnabled',YES);this.set('loginButtonTitle','Login');this.set('signupButtonEnabled',YES);this.set('signupButtonTitle','Signup');this.set('signupIsVisible',NO);this.set('uid',res.uid);this.set('token',res.token);SN.server.preload(SN.FIXTURES);SN.server.listFor();},_loginFail:function(res){this.set('loginButtonEnabled',YES);this.set('loginButtonTitle','Login');if(res.msg){alert(res.msg);}else if(res.responseText){alert('[ERROR] '+res.responseText);}},logout:function(){this.set("uid",-1);this.set("token",'');this.set("isLogin",NO);var records=SC.Store.records();SC.Store.destroyRecords(records);},confirmPassword:function(){if(this.get('password')!=this.get('confirm_pass')){alert('confirm password is incorrect!');return false;}
if(this.get('username')=='demo'){alert("DEMO user can't change the password");return false;}
return true;},signup:function(){if(!this.confirmPassword())return;SN.server.request({url:SN.serverURL,params:{username:this.get('username'),password:this.get('password'),secretkey:this.get('secretkey')},method:'sn_add_user',success:this._loginSuccess.bind(this),error:this._signupError.bind(this),fail:this._signupFail.bind(this)});this.set('signupButtonEnabled',NO);this.set('signupButtonTitle','Loading...');},_signupError:function(res){this.set('signupButtonEnabled',YES);this.set('signupButtonTitle','Signup');switch(res.msg){case'duplicated user':alert('The requested name is already in used. Please try other name');break;case'name length is zero':alert('There is no name. Please type your name.');break;case'password length is zero':alert('There is no password. Please type your password.');break;default:alert('[ERROR] '+res.msg);}},_signupFail:function(res){this.set('signupButtonEnabled',YES);this.set('signupButtonTitle','Signup');alert('[ERROR] '+res.responseText);},secretkey:function(){var username=this.get("username");var password=this.get("password");return MD5_hexhash(username+'/'+password+'/'+'Spam sucks');}.property('username','password'),authParam:function(){return{username:this.get('username'),uid:this.get('uid'),token:this.get('token')};}.property('username','uid','token'),showAccountDialog:function(){SC.page.get('account').set('isVisible',YES);},hideAccountDialog:function(){SC.page.get('account').set('isVisible',NO);},changeAccount:function(){if(!this.confirmPassword())return;SN.server.request({url:SN.serverURL,params:{username:this.get('username'),password:this.get('password'),token:this.get('token'),uid:this.get('uid')},method:'sn_mod_user',success:this._changeAccountSuccess.bind(this),error:this._changeAccountError.bind(this),fail:this._changeAccountError.bind(this)});this.set('changeAccountButtonEnabled',NO);this.set('changeAccountButtonTitle','Loading...');},_changeAccountSuccess:function(res){this.hideAccountDialog();this.set('changeAccountButtonEnabled',YES);this.set('changeAccountButtonTitle','Change');},_changeAccountError:function(res){this.set('changeAccountButtonEnabled',YES);this.set('changeAccountButtonTitle','Change');switch(res.msg){case'password length is zero':alert('There is no password. Please type your password.');break;case'name length is zero':alert('There is no username.');break;case'user not found':alert('There is no user such as '+username);break;default:alert('[ERROR] '+res.msg);}},cancelChange:function(){this.hideAccountDialog();},loginObserver:function(){var isLogin=this.get("isLogin");this.set('loginIsVisible',!isLogin);if(isLogin){SC.page.get('header').get('searchWord').rootElement.select();}else{this.invokeLater(function(){SC.page.get('loginDialog').get('username').rootElement.select();},1000);}}.observes("isLogin"),siginupObserver:function(){var isSignup=this.get("signupIsVisible");this.set('loginButtonIsVisible',!isSignup);}.observes("signupIsVisible")});require('core');SN.TabView=SC.TabView.extend({nowShowingObserver:function(){arguments.callee.base.apply(this,arguments);var nowShowing=this.get('nowShowing');if(nowShowing=='preview'){var text=SC.page.get('editorTab').get('editBody').get('value');var preview=SC.page.get('previewTab').get('wikiPreview');preview.set('value',text)}}.observes('nowShowing')});require('core');SN.detailController=SC.ObjectController.create({contentBinding:'SN.masterController.selection',commitChangesImmediately:false,showEditor:function(sourceView,evt){var bindings=SC.page.get('workspace').get('detailView').get('wikiView').get('bindings');bindings.invoke('disconnect');SC.page.get('editTabs').popup(sourceView,evt);SN.masterController.set('searchButtonDefault',false);SN.masterController.set('searchFieldEnabled',false);SC.page.get('editorTab').get('title').rootElement.select();},hideEditor:function(sourceView,evt){SC.page.get('editTabs').set('isVisible',NO);SN.masterController.set('searchButtonDefault',true);SN.masterController.set('searchFieldEnabled',true);SC.page.get('header').get('searchWord').rootElement.select();var bindings=SC.page.get('workspace').get('detailView').get('wikiView').get('bindings');bindings.invoke('connect');},saveAndHideEditor:function(){this.hideEditor();this.commitChanges();},cancelAndHideEditor:function(){this.discardChanges();this.hideEditor();}});require('core');SN.appController=SC.Object.create({isAboutVisible:false,showAbout:function(){SC.page.get('about').set('isVisible',YES);},hideAbout:function(){SC.page.get('about').set('isVisible',NO);}});require('core');SN.Server=SC.Server.extend({request:function(req){if(SN.FIXTURES.length!=0){setTimeout(function(){SC.page.get('loading').set('isVisible',NO)},1000);return;}
var now=new Date();var url=req.url;var success=req.success;var error=req.error;var fail=req.fail;var obj=req.obj;var params=req.params;var method=req.method;params.method=method;params.gmtoffset=now.getTimezoneOffset();var query=$H(params).toQueryString();var myAjax=new Ajax.Request(url,{method:'post',parameters:query,onComplete:function(orgReq){var res='get nothing';try{eval('res = '+orgReq.responseText);}catch(e){alert('[ERROR] '+e+"\neval text: "+orgReq.responseText);}
if(res.error){error(res);}else{success(res);}},onFailure:fail});},_requestFail:function(res){if(res.msg){alert(res.msg);}else if(res.responseText){alert('[ERROR] '+res.responseText);}},listFor:function(opts){params=SN.accountController.get('authParam');params.search='';SN.server.request({url:SN.serverURL,params:params,method:'sn_find_docs',success:this._listSuccess.bind(this),error:this._requestFail.bind(this),fail:this._requestFail.bind(this)});SC.page.get('loading').set('isVisible',YES);},_listSuccess:function(res){this.refreshRecordsWithData(res.result_list,SN.Note,null,false);SC.page.get('loading').set('isVisible',NO);},createRecords:function(records){if(SN.accountController.get('username')=='demo')return;for(i=0;i<records.length;i++){var rec=records[i];rec.set('newRecord',false);params=SN.accountController.get('authParam');params.title=rec.get('title');params.text=rec.get('text');SN.server.request({url:SN.serverURL,params:params,method:'sn_add_doc',success:function(res){this._createSuccess(res,rec);}.bind(this),error:this._requestFail.bind(this),fail:this._requestFail.bind(this)});}},_createSuccess:function(res,rec){rec.docId=res.docId;},refreshRecords:function(records){alert('refreshRecords is NOT implemented');},commitRecords:function(records){if(SN.accountController.get('username')=='demo')return;for(i=0;i<records.length;i++){var rec=records[i];rec.set('newRecord',false);params=SN.accountController.get('authParam');params.docId=rec.get('docId');params.title=rec.get('title');params.text=rec.get('text');SN.server.request({url:SN.serverURL,params:params,method:'sn_mod_doc',success:this._createSuccess.bind(this),error:this._requestFail.bind(this),fail:this._requestFail.bind(this)});}},destroyRecords:function(records){if(SN.accountController.get('username')=='demo'){SC.Store.destroyRecords(records);return;}
for(i=0;i<records.length;i++){var rec=records[i];rec.set('newRecord',false);params=SN.accountController.get('authParam');params.docId=rec.get('docId');SN.server.request({url:SN.serverURL,params:params,method:'sn_del_doc',success:function(res){this._destroySuccess(res,rec);}.bind(this),error:this._requestFail.bind(this),fail:this._requestFail.bind(this)});}},_destroySuccess:function(res,rec){SC.Store.destroyRecords([rec]);}});var MD5_T=new Array(0x00000000,0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391);var MD5_round1=new Array(new Array(0,7,1),new Array(1,12,2),new Array(2,17,3),new Array(3,22,4),new Array(4,7,5),new Array(5,12,6),new Array(6,17,7),new Array(7,22,8),new Array(8,7,9),new Array(9,12,10),new Array(10,17,11),new Array(11,22,12),new Array(12,7,13),new Array(13,12,14),new Array(14,17,15),new Array(15,22,16));var MD5_round2=new Array(new Array(1,5,17),new Array(6,9,18),new Array(11,14,19),new Array(0,20,20),new Array(5,5,21),new Array(10,9,22),new Array(15,14,23),new Array(4,20,24),new Array(9,5,25),new Array(14,9,26),new Array(3,14,27),new Array(8,20,28),new Array(13,5,29),new Array(2,9,30),new Array(7,14,31),new Array(12,20,32));var MD5_round3=new Array(new Array(5,4,33),new Array(8,11,34),new Array(11,16,35),new Array(14,23,36),new Array(1,4,37),new Array(4,11,38),new Array(7,16,39),new Array(10,23,40),new Array(13,4,41),new Array(0,11,42),new Array(3,16,43),new Array(6,23,44),new Array(9,4,45),new Array(12,11,46),new Array(15,16,47),new Array(2,23,48));var MD5_round4=new Array(new Array(0,6,49),new Array(7,10,50),new Array(14,15,51),new Array(5,21,52),new Array(12,6,53),new Array(3,10,54),new Array(10,15,55),new Array(1,21,56),new Array(8,6,57),new Array(15,10,58),new Array(6,15,59),new Array(13,21,60),new Array(4,6,61),new Array(11,10,62),new Array(2,15,63),new Array(9,21,64));function MD5_F(x,y,z){return(x&y)|(~x&z);}
function MD5_G(x,y,z){return(x&z)|(y&~z);}
function MD5_H(x,y,z){return x^y^z;}
function MD5_I(x,y,z){return y^(x|~z);}
var MD5_round=new Array(new Array(MD5_F,MD5_round1),new Array(MD5_G,MD5_round2),new Array(MD5_H,MD5_round3),new Array(MD5_I,MD5_round4));function MD5_pack(n32){return String.fromCharCode(n32&0xff)+
String.fromCharCode((n32>>>8)&0xff)+
String.fromCharCode((n32>>>16)&0xff)+
String.fromCharCode((n32>>>24)&0xff);}
function MD5_unpack(s4){return s4.charCodeAt(0)|(s4.charCodeAt(1)<<8)|(s4.charCodeAt(2)<<16)|(s4.charCodeAt(3)<<24);}
function MD5_number(n){while(n<0)
n+=4294967296;while(n>4294967295)
n-=4294967296;return n;}
function MD5_apply_round(x,s,f,abcd,r){var a,b,c,d;var kk,ss,ii;var t,u;a=abcd[0];b=abcd[1];c=abcd[2];d=abcd[3];kk=r[0];ss=r[1];ii=r[2];u=f(s[b],s[c],s[d]);t=s[a]+u+x[kk]+MD5_T[ii];t=MD5_number(t);t=((t<<ss)|(t>>>(32-ss)));t+=s[b];s[a]=MD5_number(t);}
function MD5_hash(data){var abcd,x,state,s;var len,index,padLen,f,r;var i,j,k;var tmp;state=new Array(0x67452301,0xefcdab89,0x98badcfe,0x10325476);len=data.length;index=len&0x3f;padLen=(index<56)?(56-index):(120-index);if(padLen>0){data+="\x80";for(i=0;i<padLen-1;i++)
data+="\x00";}
data+=MD5_pack(len*8);data+=MD5_pack(0);len+=padLen+8;abcd=new Array(0,1,2,3);x=new Array(16);s=new Array(4);for(k=0;k<len;k+=64){for(i=0,j=k;i<16;i++,j+=4){x[i]=data.charCodeAt(j)|(data.charCodeAt(j+1)<<8)|(data.charCodeAt(j+2)<<16)|(data.charCodeAt(j+3)<<24);}
for(i=0;i<4;i++)
s[i]=state[i];for(i=0;i<4;i++){f=MD5_round[i][0];r=MD5_round[i][1];for(j=0;j<16;j++){MD5_apply_round(x,s,f,abcd,r[j]);tmp=abcd[0];abcd[0]=abcd[3];abcd[3]=abcd[2];abcd[2]=abcd[1];abcd[1]=tmp;}}
for(i=0;i<4;i++){state[i]+=s[i];state[i]=MD5_number(state[i]);}}
return MD5_pack(state[0])+
MD5_pack(state[1])+
MD5_pack(state[2])+
MD5_pack(state[3]);}
function MD5_hexhash(data){var i,out,c;var bit128;bit128=MD5_hash(data);out="";for(i=0;i<16;i++){c=bit128.charCodeAt(i);out+="0123456789abcdef".charAt((c>>4)&0xf);out+="0123456789abcdef".charAt(c&0xf);}
return out;}
require('core');SN.masterController=SC.CollectionController.create({allowsEmptySelection:false,allowsMultipleSelection:true,canEditCollection:true,searchWord:'',searchButtonDefault:true,searchFieldEnabled:true,addNote:function(sender){var now=new Date();var content=this.get('content');var note=SN.Note.newRecord({title:'untitled',text:'click the Edit button to edit.',created:now.format('yyyy-MM-dd HH:mm:ss'),modified:now.format('yyyy-MM-dd HH:mm:ss'),uid:SN.accountController.get('uid'),docId:'',isPublic:0},SN.server);note.commitChanges();this.set('selection',[note]);SN.detailController.showEditor();},delNote:function(sender){if(!confirm('Are you sure?'))return;var content=this.get('content');var sel=(this.get('selection')||[]).clone();var idx=sel.get('length');while(--idx>=0){var note=sel.objectAt(idx);note.destroy();}},search:function(){this.content.set('conditions',{'search':this.get('searchWord')});},showDocLink:function(searchWord){this.set('searchWord',searchWord);var sel=this.get('selection');var docId=sel[0].get('docId');this.content.set('conditions',{'notDocId':docId,'search':searchWord});}});var pjswlf={reDocLink:/\[\[(.*?)\]\]/g,reStrong:/\'\'\'(.*?)\'\'\'/g,reEm:/\'\'(.*?)\'\'/g,reDel:/\-\-(.*?)\-\-/g,reIns:/\+\+(.*?)\+\+/g,reUrl:/(https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:@&=+$,%#]+)/g,reSpChars:/\\(['\\\-+:\[\]{}])/g,codeDiv:null,tableDiv:null,markupCode:function(div,line){var node=null;if(line.match(/\[code\]/i)){node=document.createElement('div');node.setAttribute("class","code");this.codeDiv=node;div.appendChild(node);return true;}else if(line.match(/\[\/code\]/i)){this.codeDiv=null;return true;}else if(this.codeDiv){var txt=document.createTextNode(line);var br=document.createElement('br');this.codeDiv.appendChild(txt);this.codeDiv.appendChild(br);return true;}
return false;},markupTable:function(div,line){var node=null;if(line.match(/\[table\]/i)){node=document.createElement('table');node.setAttribute("class","wiki_table");this.tableDiv=node;div.appendChild(node);return true;}else if(line.match(/\[\/table\]/i)){this.tableDiv=null;return true;}else if(this.tableDiv){var cols=line.split('|');var tr=document.createElement('tr');tr.setAttribute("class","wiki_tr");for(var i=0;i<cols.length;i++){var col=cols[i];var td=document.createElement('td');td.setAttribute("class","wiki_td");var txt=document.createTextNode(col);td.appendChild(txt);tr.appendChild(td);}
this.tableDiv.appendChild(tr);return true;}
return false;},doMarkup:function(s){var div=document.createElement("div");var lines=s.replace(/\r\n|\r|\n/g,"\n").split(/\n/);for(var i=0;i<lines.length;i++){var node=null;var line=lines[i];if(!this.markupCode(div,line)&&!this.markupTable(div,line)){node=this.markupInline(this.markupBlock(line))}
if(node)div.appendChild(node);}
return div;},markupBlock:function(s){var elm,txt;if(s.match(/^\n*$/)){elm=document.createElement("br");}else if(s.indexOf("****")==0){elm=document.createElement("h6");txt=document.createTextNode(s.replace(/^\*\*\*\*\s*/,""));elm.appendChild(txt);}else if(s.indexOf("***")==0){elm=document.createElement("h5");txt=document.createTextNode(s.replace(/^\*\*\*\s*/,""));elm.appendChild(txt);}else if(s.indexOf("**")==0){elm=document.createElement("h4");txt=document.createTextNode(s.replace(/^\*\*\s*/,""));elm.appendChild(txt);}else if(s.indexOf("*")==0){elm=document.createElement("h3");txt=document.createTextNode(s.replace(/^\*\s*/,""));elm.appendChild(txt);}else if(s.indexOf("----")==0){elm=document.createElement("hr");}else if(s.indexOf(">")==0){elm=document.createElement("blockquote");var aQuotes=s.split(/\n/);for(var j=0;j<aQuotes.length;j++){elm.appendChild(this.doMarkup(aQuotes[j].replace(/^>\s*/gm,"")));}}else if(s.indexOf("-")==0){elm=document.createElement("ul");var aLi=s.replace(/^\-\s*/gm,"").split(/\n/);for(var j=0;j<aLi.length;j++){var li=document.createElement("li");txt=document.createTextNode(aLi[j]);li.appendChild(txt);elm.appendChild(li);}}else if(s.indexOf("+")==0){elm=document.createElement("ul");var aLi=s.replace(/^\+\s*/gm,"").split(/\n/);for(var j=0;j<aLi.length;j++){var li=document.createElement("li");var del=document.createElement("del");txt=document.createTextNode(aLi[j]);li.appendChild(del);del.appendChild(txt);elm.appendChild(li);}}else if(s.indexOf(":")==0){elm=document.createElement("dl");var aLi=s.replace(/^\:\s*/gm,"").split(/\n/);for(var j=0;j<aLi.length;j++){if(aLi[j].indexOf(":")!=0){var dt=document.createElement("dt");txt=document.createTextNode(aLi[j]);dt.appendChild(txt);elm.appendChild(dt);}else{var dd=document.createElement("dd");txt=document.createTextNode(aLi[j].replace(/^\:\s*/,""));dd.appendChild(txt);elm.appendChild(dd);}}}else{elm=document.createElement("p");txt=document.createTextNode(s);elm.appendChild(txt);}
return elm;},markupInline:function(elm){if(elm==null)return null;if(elm.childNodes.length>1){for(var i=0;i<elm.childNodes.length;i++){this.markupInline(elm.childNodes[i]);}}else{elm=this._txt2html(elm);}
return elm;},_txt2html:function(elm){var s=elm.innerHTML;if(s!=""){s=s.replace(this.reDocLink,'<span class=doclink onclick="SN.masterController.showDocLink(\'$1\');">$1</span>');s=s.replace(this.reStrong,'<strong>$1</strong>');s=s.replace(this.reEm,'<em>$1</em>');s=s.replace(this.reDel,'<del>$1</del>');s=s.replace(this.reIns,'<ins>$1</ins>');s=s.replace(this.reUrl,'<a href="$1" target="_blank" title="open with new window">$1</a>');s=s.replace(this.reSpChars,'$1');elm.innerHTML=s;}
return elm;}};