(function($){$.fn.markItUp=function(settings,extraSettings){var options,ctrlKey,shiftKey,altKey;ctrlKey=shiftKey=altKey=false;options={id:'',nameSpace:'',root:'',previewInWindow:'',previewAutoRefresh:true,previewPosition:'after',previewTemplatePath:'~/templates/preview.html',previewParserPath:'',previewParserVar:'data',resizeHandle:true,beforeInsert:'',afterInsert:'',onEnter:{},onShiftEnter:{},onCtrlEnter:{},onTab:{},markupSet:[{}]};$.extend(options,settings,extraSettings);if(!options.root){$('script').each(function(a,tag){miuScript=$(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/);if(miuScript!==null){options.root=miuScript[1];}});}
return this.each(function(){var $$,textarea,levels,scrollPosition,caretPosition,caretOffset,clicked,hash,header,footer,previewWindow,template,iFrame,abort;$$=$(this);textarea=this;levels=[];abort=false;scrollPosition=caretPosition=0;caretOffset=-1;options.previewParserPath=localize(options.previewParserPath);options.previewTemplatePath=localize(options.previewTemplatePath);function localize(data,inText){if(inText){return data.replace(/("|')~\//g,"$1"+options.root);}
return data.replace(/^~\//,options.root);}
function init(){id='';nameSpace='';if(options.id){id='id="'+options.id+'"';}else if($$.attr("id")){id='id="markItUp'+($$.attr("id").substr(0,1).toUpperCase())+($$.attr("id").substr(1))+'"';}
if(options.nameSpace){nameSpace='class="'+options.nameSpace+'"';}
$$.wrap('<div '+nameSpace+'></div>');$$.wrap('<div '+id+' class="markItUp"></div>');$$.wrap('<div class="markItUpContainer"></div>');$$.addClass("markItUpEditor");header=$('<div class="markItUpHeader"></div>').insertBefore($$);$(dropMenus(options.markupSet)).appendTo(header);footer=$('<div class="markItUpFooter"></div>').insertAfter($$);if(options.resizeHandle===true&&$.browser.safari!==true){resizeHandle=$('<div class="markItUpResizeHandle"></div>').insertAfter($$).bind("mousedown",function(e){var h=$$.height(),y=e.clientY,mouseMove,mouseUp;mouseMove=function(e){$$.css("height",Math.max(20,e.clientY+h-y)+"px");return false;};mouseUp=function(e){$("html").unbind("mousemove",mouseMove).unbind("mouseup",mouseUp);return false;};$("html").bind("mousemove",mouseMove).bind("mouseup",mouseUp);});footer.append(resizeHandle);}
$$.keydown(keyPressed).keyup(keyPressed);$$.bind("insertion",function(e,settings){if(settings.target!==false){get();}
if(textarea===$.markItUp.focused){markup(settings);}});$$.focus(function(){$.markItUp.focused=this;});}
function dropMenus(markupSet){var ul=$('<ul></ul>'),i=0;$('li:hover > ul',ul).css('display','block');$.each(markupSet,function(){var button=this,t='',title,li,j;title=(button.key)?(button.name||'')+' [Ctrl+'+button.key+']':(button.name||'');key=(button.key)?'accesskey="'+button.key+'"':'';if(button.separator){li=$('<li class="markItUpSeparator">'+(button.separator||'')+'</li>').appendTo(ul);}else{i++;for(j=levels.length-1;j>=0;j--){t+=levels[j]+"-";}
li=$('<li class="markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'"><a href="" '+key+' title="'+title+'">'+(button.name||'')+'</a></li>').bind("contextmenu",function(){return false;}).click(function(){return false;}).focusin(function(){$$.focus();}).mousedown(function(){if(button.call){eval(button.call)();}
setTimeout(function(){markup(button)},1);return false;}).hover(function(){$('> ul',this).show();$(document).one('click',function(){$('ul ul',header).hide();});},function(){$('> ul',this).hide();}).appendTo(ul);if(button.dropMenu){levels.push(i);$(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));}}});levels.pop();return ul;}
function magicMarkups(string){if(string){string=string.toString();string=string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,function(x,a){var b=a.split('|!|');if(altKey===true){return(b[1]!==undefined)?b[1]:b[0];}else{return(b[1]===undefined)?"":b[0];}});string=string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,function(x,a){var b=a.split(':!:');if(abort===true){return false;}
value=prompt(b[0],(b[1])?b[1]:'');if(value===null){abort=true;}
return value;});return string;}
return"";}
function prepare(action){if($.isFunction(action)){action=action(hash);}
return magicMarkups(action);}
function build(string){openWith=prepare(clicked.openWith);placeHolder=prepare(clicked.placeHolder);replaceWith=prepare(clicked.replaceWith);closeWith=prepare(clicked.closeWith);if(replaceWith!==""){block=openWith+replaceWith+closeWith;}else if(selection===''&&placeHolder!==''){block=openWith+placeHolder+closeWith;}else{block=openWith+(string||selection)+closeWith;}
return{block:block,openWith:openWith,replaceWith:replaceWith,placeHolder:placeHolder,closeWith:closeWith};}
function markup(button){var len,j,n,i;hash=clicked=button;get();$.extend(hash,{line:"",root:options.root,textarea:textarea,selection:(selection||''),caretPosition:caretPosition,ctrlKey:ctrlKey,shiftKey:shiftKey,altKey:altKey});prepare(options.beforeInsert);prepare(clicked.beforeInsert);if(ctrlKey===true&&shiftKey===true){prepare(clicked.beforeMultiInsert);}
$.extend(hash,{line:1});if(ctrlKey===true&&shiftKey===true){lines=selection.split(/\r?\n/);for(j=0,n=lines.length,i=0;i<n;i++){if($.trim(lines[i])!==''){$.extend(hash,{line:++j,selection:lines[i]});lines[i]=build(lines[i]).block;}else{lines[i]="";}}
string={block:lines.join('\n')};start=caretPosition;len=string.block.length+(($.browser.opera)?n-1:0);}else if(ctrlKey===true){string=build(selection);start=caretPosition+string.openWith.length;len=string.block.length-string.openWith.length-string.closeWith.length;len-=fixIeBug(string.block);}else if(shiftKey===true){string=build(selection);start=caretPosition;len=string.block.length;len-=fixIeBug(string.block);}else{string=build(selection);start=caretPosition+string.block.length;len=0;start-=fixIeBug(string.block);}
if((selection===''&&string.replaceWith==='')){caretOffset+=fixOperaBug(string.block);start=caretPosition+string.openWith.length;len=string.block.length-string.openWith.length-string.closeWith.length;caretOffset=$$.val().substring(caretPosition,$$.val().length).length;caretOffset-=fixOperaBug($$.val().substring(0,caretPosition));}
$.extend(hash,{caretPosition:caretPosition,scrollPosition:scrollPosition});if(string.block!==selection&&abort===false){insert(string.block);set(start,len);}else{caretOffset=-1;}
get();$.extend(hash,{line:'',selection:selection});if(ctrlKey===true&&shiftKey===true){prepare(clicked.afterMultiInsert);}
prepare(clicked.afterInsert);prepare(options.afterInsert);if(previewWindow&&options.previewAutoRefresh){refreshPreview();}
shiftKey=altKey=ctrlKey=abort=false;}
function fixOperaBug(string){if($.browser.opera){return string.length-string.replace(/\n*/g,'').length;}
return 0;}
function fixIeBug(string){if($.browser.msie){return string.length-string.replace(/\r*/g,'').length;}
return 0;}
function insert(block){if(document.selection){var newSelection=document.selection.createRange();newSelection.text=block;}else{textarea.value=textarea.value.substring(0,caretPosition)+block+textarea.value.substring(caretPosition+selection.length,textarea.value.length);}}
function set(start,len){if(textarea.createTextRange){if($.browser.opera&&$.browser.version>=9.5&&len==0){return false;}
range=textarea.createTextRange();range.collapse(true);range.moveStart('character',start);range.moveEnd('character',len);range.select();}else if(textarea.setSelectionRange){textarea.setSelectionRange(start,start+len);}
textarea.scrollTop=scrollPosition;textarea.focus();}
function get(){textarea.focus();scrollPosition=textarea.scrollTop;if(document.selection){selection=document.selection.createRange().text;if($.browser.msie){var range=document.selection.createRange(),rangeCopy=range.duplicate();rangeCopy.moveToElementText(textarea);caretPosition=-1;while(rangeCopy.inRange(range)){rangeCopy.moveStart('character');caretPosition++;}}else{caretPosition=textarea.selectionStart;}}else{caretPosition=textarea.selectionStart;selection=textarea.value.substring(caretPosition,textarea.selectionEnd);}
return selection;}
function preview(){if(!previewWindow||previewWindow.closed){if(options.previewInWindow){previewWindow=window.open('','preview',options.previewInWindow);$(window).unload(function(){previewWindow.close();});}else{iFrame=$('<iframe class="markItUpPreviewFrame"></iframe>');if(options.previewPosition=='after'){iFrame.insertAfter(footer);}else{iFrame.insertBefore(header);}
previewWindow=iFrame[iFrame.length-1].contentWindow||frame[iFrame.length-1];}}else if(altKey===true){if(iFrame){iFrame.remove();}else{previewWindow.close();}
previewWindow=iFrame=false;}
if(!options.previewAutoRefresh){refreshPreview();}
if(options.previewInWindow){previewWindow.focus();}}
function refreshPreview(){renderPreview();}
function renderPreview(){var phtml;if(options.previewParserPath!==''){$.ajax({type:'POST',url:options.previewParserPath,data:options.previewParserVar+'='+encodeURIComponent($$.val()),success:function(data){writeInPreview(localize(data,1));}});}else{if(!template){$.ajax({url:options.previewTemplatePath,success:function(data){writeInPreview(localize(data,1).replace(/<!-- content -->/g,$$.val()));}});}}
return false;}
function writeInPreview(data){if(previewWindow.document){try{sp=previewWindow.document.documentElement.scrollTop}catch(e){sp=0;}
previewWindow.document.open();previewWindow.document.write(data);previewWindow.document.close();previewWindow.document.documentElement.scrollTop=sp;}}
function keyPressed(e){shiftKey=e.shiftKey;altKey=e.altKey;ctrlKey=(!(e.altKey&&e.ctrlKey))?e.ctrlKey:false;if(e.type==='keydown'){if(ctrlKey===true){li=$("a[accesskey="+String.fromCharCode(e.keyCode)+"]",header).parent('li');if(li.length!==0){ctrlKey=false;setTimeout(function(){li.triggerHandler('mousedown');},1);return false;}}
if(e.keyCode===13||e.keyCode===10){if(ctrlKey===true){ctrlKey=false;markup(options.onCtrlEnter);return options.onCtrlEnter.keepDefault;}else if(shiftKey===true){shiftKey=false;markup(options.onShiftEnter);return options.onShiftEnter.keepDefault;}else{markup(options.onEnter);return options.onEnter.keepDefault;}}
if(e.keyCode===9){if(shiftKey==true||ctrlKey==true||altKey==true){return false;}
if(caretOffset!==-1){get();caretOffset=$$.val().length-caretOffset;set(caretOffset,0);caretOffset=-1;return false;}else{markup(options.onTab);return options.onTab.keepDefault;}}}}
init();});};$.fn.markItUpRemove=function(){return this.each(function(){var $$=$(this).unbind().removeClass('markItUpEditor');$$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);});};$.markItUp=function(settings){var options={target:false};$.extend(options,settings);if(options.target){return $(options.target).each(function(){$(this).focus();$(this).trigger('insertion',[options]);});}else{$('textarea').trigger('insertion',[options]);}};

$.fn.insertAtCaret = function(myValue){
    return this.each(function(i) {
      if (document.selection) {
        this.focus();
        sel = document.selection.createRange();
        sel.text = myValue;
        this.focus();
      }
      else if (this.selectionStart || this.selectionStart == '0') {
        var startPos = this.selectionStart;
        var endPos = this.selectionEnd;
        var scrollTop = this.scrollTop;
        this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
        this.focus();
        this.selectionStart = startPos + myValue.length;
        this.selectionEnd = startPos + myValue.length;
        this.scrollTop = scrollTop;
      } else {
        this.value += myValue;
        this.focus();
      }
    })
  };
})(jQuery);

function submit_shout() {
  if (!called) {
    called = true;
    $.post('/api/submit/',
      $('#shoutForm').serialize(), 
      function(data){
        var json = jQuery.parseJSON(data);
        result = parseInt(json.result);
        if ( result == 1 ) {
          $('#shoutListHeader').after(json.data);
          $("abbr.timeago").timeago();
          $('#shout_' + json.id).slideDown(450);
          $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
          $('textarea.expand').expandingTextArea();
          $("label").inFieldLabels({ fadeOpacity: 0.4, fadeDuration: 150 });
          $('#shout_content').val('').blur();
          $('#shoutCounter').html(400);
        } else if ( result == 0 ) {
          $('#newShout').append(json.data);
          setTimeout("$('#shoutError').fadeOut('500').remove()", 4000);
        }
        called = false;
      }
    );
  }
}

function submit_reply(id) {
  if (!called) {
    called = true;
    $.post('/api/submit/',
      $('#replyForm_' + id).serialize(),  
      function(data){
        var json = jQuery.parseJSON(data);
        result = parseInt(json.result);
        if ( result == 1 ) {
          $('#shout_' + id + '_replies').append(json.data);
          $("abbr.timeago").timeago();
          $('#shout_reply_' + json.id).slideDown(300);
          $('#replyCounter' + id).html(400);
          $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
          $('#shout' + id + '_reply_content').val('').blur();
        } else if ( result == 0 ) {
          $('#shout_' + json.shout_id).append(json.data);
          setTimeout("$('#shoutError').fadeOut('500').remove()", 4000);
        }
        called = false;
      }
    );
  }
}

function home_tick(first) {
  $.getJSON('/api/tick/home/', function(data) {
    if ( first == false ) {
      $('div').removeClass('new');
    }
    $.each(data.shouts, function(index, shout) {
      if ($('#shout_' + shout.id).length < 1){
        $('#shoutListHeader').after(shout.data);
        $('#shout_' + shout.id).slideDown(450);
      }
    });
    $.each(data.updated_shouts, function(index, shout) {
      if ($('#shout_' + shout.id).length > 0){
        $('#shout_' + shout.id + '_replies').html(shout.data);
      }
    });
    if (data.players.length > 0) {
      $('#players').html(data.players);
    }
    var i = 0;
    $.each(data.notifications, function(index, notification) {
      var timeout = i * 3000 + 3000;
      $.gritter.add({ title: notification.title, text: notification.content, sticky: false, time: timeout } );
      i++;
    });
    if ( data.notification_count > 0 ) {
      $('#notificationLink').html('Notifications (' + data.notification_count + ')');
    } else {
      $('#notificationLink').html('Notifications');
    }
    $("abbr.timeago").timeago();
    $('textarea.expand').expandingTextArea();
    $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
    $("label").inFieldLabels({ fadeOpacity: 0.4, fadeDuration: 150 });
  });
}

function shout_tick(id) {
  $.getJSON('/api/tick/shout/' + id + '/', function(data) {
    if ($('#shout_' + data.replies.id).length > 0){
      $('#shout_' + data.replies.id + '_replies').html(data.replies.data);
    }
    if (data.players.length > 0) {
      $('#players').html(data.players);
    }
    var i = 0;
    $.each(data.notifications, function(index, notification) {
      var timeout = i * 3000 + 3000;
      $.gritter.add({ title: notification.title, text: notification.content, sticky: false, time: timeout } );
      i++;
    });
    if ( data.notification_count > 0 ) {
      $('#notificationLink').html('Notifications (' + data.notification_count + ')');
    } else {
      $('#notificationLink').html('Notifications');
    }
    $("abbr.timeago").timeago();
    $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
  });
}

function tick() {
  $.getJSON('/api/tick/', function(data) {
    if (data.players.length > 0) {
      $('#players').html(data.players);
    }
    var i = 0;
    $.each(data.notifications, function(index, notification) {
      var timeout = i * 3000 + 3000;
      $.gritter.add({ title: notification.title, text: notification.content, sticky: false, time: timeout } );
      i++;
    });
    if ( data.notification_count > 0 ) {
      $('#notificationLink').html('Notifications (' + data.notification_count + ')');
    } else {
      $('#notificationLink').html('Notifications');
    }
  });
}

function more(last) {
  $('#getMore').html('').addClass('wait');
  $.getJSON('/api/more/' + last + '/', function(data) {
    var new_last = 0;
    $.each(data.shouts, function(index, shout) {
      if ($('#shout_' + shout.id).length < 1){
        $('#getMore').before(shout.data);
        $('#shout_' + shout.id).fadeIn(450);
        new_last = shout.id;
      }
    });
    $('#getMore').removeClass('wait').html('<span onClick="more(' + new_last + ')">Get More Shouts</span>');
    $("abbr.timeago").timeago();
    $('textarea.expand').expandingTextArea();
    $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
    $("label").inFieldLabels({ fadeOpacity: 0.4, fadeDuration: 150 });
  });
}

function server_widget_update(first) {
  if ( first == true ) {
    $('#serverList').addClass('wait');
  }
  $.getJSON('/servers/widget/', function(data) {
    $('#serverList').html(data).removeClass('wait');
  });
}

/*
 * In-Field Label jQuery Plugin
 * http://fuelyourcoding.com/scripts/infield.html
 *
 * Copyright (c) 2009 Doug Neiner
 * Dual licensed under the MIT and GPL licenses.
 * Uses the same license as jQuery, see:
 * http://docs.jquery.com/License
 *
 * @version 0.1
 */
(function($){
  
    $.InFieldLabels = function(label,field, options){
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;
        
        // Access to jQuery and DOM versions of each element
        base.$label = $(label);
        base.label = label;

    base.$field = $(field);
    base.field = field;
        
    base.$label.data("InFieldLabels", base);
    base.showing = true;
        
        base.init = function(){
      // Merge supplied options with default options
            base.options = $.extend({},$.InFieldLabels.defaultOptions, options);

      // Check if the field is already filled in
      if(base.$field.val() != ""){
        base.$label.hide();
        base.showing = false;
      };
      
      base.$field.focus(function(){
        base.fadeOnFocus();
      }).blur(function(){
        base.checkForEmpty(true);
      }).bind('keydown.infieldlabel',function(e){
        // Use of a namespace (.infieldlabel) allows us to
        // unbind just this method later
        base.hideOnChange(e);
      }).change(function(e){
        base.checkForEmpty();
      }).bind('onPropertyChange', function(){
        base.checkForEmpty();
      });
        };

    // If the label is currently showing
    // then fade it down to the amount
    // specified in the settings
    base.fadeOnFocus = function(){
      if(base.showing){
        base.setOpacity(base.options.fadeOpacity);
      };
    };
    
    base.setOpacity = function(opacity){
      base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
      base.showing = (opacity > 0.0);
    };
    
    // Checks for empty as a fail safe
    // set blur to true when passing from
    // the blur event
    base.checkForEmpty = function(blur){
      if(base.$field.val() == ""){
        base.prepForShow();
        base.setOpacity( blur ? 1.0 : base.options.fadeOpacity );
      } else {
        base.setOpacity(0.0);
      };
    };
    
    base.prepForShow = function(e){
      if(!base.showing) {
        // Prepare for a animate in...
        base.$label.css({opacity: 0.0}).show();
        
        // Reattach the keydown event
        base.$field.bind('keydown.infieldlabel',function(e){
          base.hideOnChange(e);
        });
      };
    };

    base.hideOnChange = function(e){
      if(
        (e.keyCode == 16) || // Skip Shift
        (e.keyCode == 9) // Skip Tab
        ) return; 
      
      if(base.showing){
        base.$label.hide();
        base.showing = false;
      };
      
      // Remove keydown event to save on CPU processing
      base.$field.unbind('keydown.infieldlabel');
    };
      
    // Run the initialization method
        base.init();
    };
  
    $.InFieldLabels.defaultOptions = {
        fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be
    fadeDuration: 300 // How long should it take to animate from 1.0 opacity to the fadeOpacity
    };
  

    $.fn.inFieldLabels = function(options){
        return this.each(function(){
      // Find input or textarea based on for= attribute
      // The for attribute on the label must contain the ID
      // of the input or textarea element
      var for_attr = $(this).attr('for');
      if( !for_attr ) return; // Nothing to attach, since the for field wasn't used
      
      
      // Find the referenced input or textarea element
      var $field = $(
        "input#" + for_attr + "[type='text']," + 
        "input#" + for_attr + "[type='password']," + 
        "textarea#" + for_attr
        );
        
      if( $field.length == 0) return; // Again, nothing to attach
      
      // Only create object for input[text], input[password], or textarea
            (new $.InFieldLabels(this, $field[0], options));
        });
    };
  
})(jQuery);

$(document).ready(function(){
  $("abbr.timeago").timeago();
  $('textarea.expand').expandingTextArea();
  $('a[rel*=facebox]').facebox({loadingImage : '/theme/default/images/loading.gif', closeImage : '/theme/default/images/closelabel.png'});
  $("label").inFieldLabels({ fadeOpacity: 0.4, fadeDuration: 150 });
  setInterval('tick()', 30000);
  tick();
});
