function do_update(first){$.ajax({type:"POST",url:"/updates",data:{guid:guid,client_id:client_id,first:first},success:update_success,error:show_connection_error,dataType:"json"})}
function do_messages(messages){var after=$("#message_div").html();for(var i=0;i<messages.length;i++){var msg=messages[i];after=after+"<div class='chtmsg'>"+"<span class='nickspan'>"+msg.nickname+": </span>"+msg.message_text+"</div>"}$("#message_div").html(after);var height=$("#message_div").attr("scrollHeight");$("#message_div").attr("scrollTop",height)}
function do_user_list(user_list){var list="";var first=true;for(i in user_list){var user=user_list[i];if(!first)list+=", ";list+=user;first=false}$("#collaborators_div").html(list);$("#collaborators_div").attr("title","also viewing this document: "+list)}
function update_success(data){if(data==null){show_connection_error();return}if(data.messages)do_messages(data.messages);if(sidebar_visible){if($("#nick_box").caret().start>-1)nick_cursor=$("#nick_box").caret().start;if($("#chat_value").caret().start>-1)chat_cursor=$("#chat_value").caret().start}if(data.lang){stolen_focus=true;change_lang(data.lang);stolen_focus=false}if(data.user_list)do_user_list(data.user_list);if(data.text&&!dirty&&!posting){var sel=editAreaLoader.getSelectionRange("the_input");
var text_before=editAreaLoader.getValue("the_input");var top_before=input_frame.getElementById("result").scrollTop;stolen_focus=true;editAreaLoader.setValue("the_input",data.text);var new_sel=get_new_highlight(sel,text_before,data.text);editAreaLoader.setSelectionRange("the_input",new_sel.start,new_sel.end);input_frame.getElementById("result").scrollTop=top_before;old_text=data.text;stolen_focus=false;setTimeout('$("#'+focused_id+'").focus()',200)}setTimeout(function(){do_update(false)},10)}var input_frame;
var stolen_focus=false;var focused_id=null;var nick_cursor=0;var chat_cursor=0;var dirty=false;var posting=false;var old_text="";var doc_initialized=false;var connected=true;$(document).ready(function(){setup_langs();setup_invite();setup_joinstar();init_chat();init_edit_area();$(window).bind("resize",do_resize);if(!sidebar_visible)hide_sidebar();$(window).unload(unload_page);$(".favclick").favor()});
function init_edit_area(){editAreaLoader.init({id:"the_input",start_highlight:false,allow_resize:"no",allow_toggle:false,language:"en",syntax:"python",toolbar:"",word_wrap:true,replace_tab_by_spaces:4,min_height:get_edit_height(),min_width:get_edit_width(),EA_load_callback:"init_edit_area2"});do_resize()}
function init_edit_area2(){var mykeypress=function(evt){dirty=true};var mykeydown=function(evt){mykeypress(evt);return $("#frame_the_input").attr("contentWindow").keyDown(evt)};if($.browser.msie||$.browser.opera)input_frame=$("#frame_the_input").attr("contentWindow").document;else input_frame=$("#frame_the_input").attr("contentDocument");if($.browser.safari||$.browser.msie||$.browser.opera)input_frame.getElementById("editor").onkeydown=mykeydown;input_frame.getElementById("editor").onkeypress=mykeypress;
if(!doc_initialized){doc_initialized=true;do_update(true);setInterval(do_loop,300)}refresh_syntax()}function setup_invite(){$("#invite").click(function(){var msg="Share this url by email or chat.<br><br>"+'<input id="invite_url" style="width: 315px" type="text" readonly="readonly"'+" value="+document.location+">";show_dialog(msg);$("#invite_url").select();return false})}
function setup_joinstar(){$("#joinstar").click(function(){var msg="<div>You need to create an account before you can mark this document as a favorite.</div>"+'<div style="margin-top:20px">'+'To login or register, click <a href="/a/login?forward_to=/'+guid+'">here</a>.'+"</div>";show_dialog(msg);return false})}
function init_chat(){$("#chat_form").submit(submit_chat);$("#nick_form").submit(function(){$("#nick_box").blur();return false});$("#nick_box").blur(function(){change_nick();clear_focus()});$("#nick_box").focus(gain_focus);$("#chat_value").focus(gain_focus);$("#chat_value").blur(clear_focus);$("#hide_sb_button").click(toggle_sidebar);$("#show_sb_button").click(toggle_sidebar);$("#reconnect").click(reconnect)}
function do_resize(){$("#frame_the_input").css("width",get_edit_width()+"px");$("#frame_the_input").css("height",get_edit_height()+"px");$("#chat_div").css("height",get_edit_height()-250+"px")}function hide_sidebar(){$("#chat_div").css("display","none");$("#show_sb_button").css("display","block")}function show_sidebar(){$("#chat_div").css("display","block");$("#show_sb_button").css("display","none")}
function get_edit_width(){var w;if(self.innerWidth)w=self.innerWidth;else if(document.documentElement&&document.documentElement.clientWidth)w=document.documentElement.clientWidth;else if(document.body)w=document.body.clientWidth;if(sidebar_visible)return w-240;else return w}
function get_edit_height(){var h;if(self.innerWidth)h=self.innerHeight;else if(document.documentElement&&document.documentElement.clientWidth)h=document.documentElement.clientHeight;else if(document.body)h=document.body.clientHeight;if(!connected)h-=40;return h-60}function toggle_sidebar(){if(sidebar_visible)hide_sidebar();else show_sidebar();sidebar_visible=!sidebar_visible;do_resize();init_edit_area();update_chat_pref();return false}
function gain_focus(){focused_id=$(this).attr("id");if(focused_id=="chat_value"&&chat_cursor>0)$("#"+focused_id).caret({start:chat_cursor,end:chat_cursor});else if(focused_id=="nick_box"&&nick_cursor>0)$("#"+focused_id).caret({start:nick_cursor,end:nick_cursor})}function clear_focus(){if(!stolen_focus)focused_id=null}function show_connection_error(){connected=false;setTimeout('$("#conn_error").css("display", "block");',300);do_resize()}
function hide_connection_error(){connected=true;$("#conn_error").css("display","none");do_resize()}function reconnect(){hide_connection_error();do_update(true)}function submit_chat(){var val=$("#chat_value").val();$("#chat_value").val("");$.post("/chat_post",{message_text:val,guid:guid});return false}function unload_page(){$.ajax({type:"POST",async:false,url:"/exit",data:{client_id:client_id},dataType:"json"})}
function update_chat_pref(){var show_hide="show";if(!sidebar_visible)show_hide="hide";$.ajax({type:"POST",url:"/update_sidebar_pref",data:{show_hide:show_hide},dataType:"json"})}function change_nick(){var val=$("#nick_box").val();if(val.length>25){val=val.substring(0,25);$("#nick_box").val(val);alert("25 characters max")}$.post("/change_nick",{new_name:val,guid:guid})}function do_loop(){if(posting)return;if(dirty)post_text_changes()}
function post_text_changes(){var text=editAreaLoader.getValue("the_input");text=text.replace(/\r/g,"");if(text!=old_text){if(text.length>1E5){alert("text is too long, limit of 20,000 characters\n"+" your text will be truncated");text=text.substring(0,2E4)}$.ajax({url:"/doc_post",type:"POST",data:{text:text,id:guid,client_id:client_id},success:function(){posting=false},error:post_fail});posting=true;old_text=text}dirty=false}
function post_fail(transport){dirty=true;posting=false;show_connection_error()}
function find_new_index(cur_idx,text_before,new_text){var length=new_text.length;var start=cur_idx-1;if(start<0)start=0;var end=cur_idx;if(end>length)end=text_before.length;while(true){var tmp=text_before.substring(start,end+1);var idx=new_text.indexOf(tmp);if(idx==-1)return-1;else if(new_text.indexOf(tmp,idx+1)==-1)return idx+cur_idx-start;else{if(start==0&&end==length)return cur_idx;if(start>0)start--;if(end<length)end++}}}
function get_new_highlight(sel,text_before,new_text){if($.browser.msie||$.browser.opera)new_text=new_text.replace(/\n/g,"\r\n");var sel_text=text_before.substring(sel.start,sel.end);var sel_text_after=new_text.substring(sel.start,sel.end);if(sel_text.length==""){var idx=find_new_index(sel.start,text_before,new_text);if(idx!=-1){sel.start=idx;sel.end=idx}return sel}if(sel_text==sel_text_after)return sel;var idx=new_text.indexOf(sel_text);if(idx!=-1)if(new_text.indexOf(sel_text,idx+1)==-1){sel.start=
idx;sel.end=idx+sel_text.length;return sel}sel_text_after=new_text.substring(sel.start,sel.end);return sel}var langs={c:"c",cpp:"c++",cs:"c#",css:"css",basic:"basic",html:"html",java:"java",js:"javascript",pas:"pascal",perl:"perl",php:"php",python:"python",ruby:"ruby",sql:"sql",vb:"visual basic",xml:"xml",none:"plain text"};function hide_lang_menu(){$("#lang_menu_ul").css("display","none");setTimeout("$('#lang_menu_ul').css('display', '');",500)}
function setup_langs(){var s="";for(key in langs)s+="<li><a href='#' onclick=\"post_lang('"+key+"');return false\">"+langs[key]+"</a></li>\n";$("#lang_menu_ul").html(s)}function post_lang(lang){hide_lang_menu();if($("#current_lang_text").html()==langs[lang])return;$.ajax({url:"/lang_post",type:"POST",data:{lang:lang,guid:guid},error:function(){show_connection_error()},success:function(){change_lang(lang)}})}
function refresh_syntax(){var desc=$("#current_lang_text").html();for(key in langs)if(desc==langs[key]){change_lang(key,true);return}}function change_lang(lang,force){if(!force&&$("#current_lang_text").html()==langs[lang])return;$("#current_lang_text").html(langs[lang]);if(lang=="none")editAreaLoader.execCommand("the_input","change_highlight",false);else{editAreaLoader.execCommand("the_input","change_highlight",true);editAreaLoader.execCommand("the_input","change_syntax",lang)}}
(function($){$.fn.caret=function(options,opt2){var start,end,t=this[0];if(typeof options==="object"&&typeof options.start==="number"&&typeof options.end==="number"){start=options.start;end=options.end}else if(typeof options==="number"&&typeof opt2==="number"){start=options;end=opt2}else if(typeof options==="string")if((start=t.value.indexOf(options))>-1)end=start+options.length;else start=null;else if(Object.prototype.toString.call(options)==="[object RegExp]"){var re=options.exec(t.value);if(re!=
null){start=re.index;end=start+re[0].length}}if(typeof start!="undefined"){if($.browser.msie){var selRange=this[0].createTextRange();selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end-start);selRange.select()}else{this[0].selectionStart=start;this[0].selectionEnd=end}this[0].focus();return this}else{if($.browser.msie){var val=this.val();var range=document.selection.createRange().duplicate();range.moveEnd("character",val.length);var s=range.text==""?val.length:
val.lastIndexOf(range.text);range=document.selection.createRange().duplicate();range.moveStart("character",-val.length);var e=range.text.length}else var s=t.selectionStart,e=t.selectionEnd;var te=t.value.substring(s,e);return{start:s,end:e,text:te,replace:function(st){return t.value.substring(0,s)+st+t.value.substring(e,t.value.length)}}}return this}})(jQuery);
