var timeLeft = 0;

window.addEvent('domready', function() {
   SqueezeBox.initialize({ size: {x: 720, y: 480} });
   SqueezeBox.assign($$('a[rel=boxed]'));
   
   var word = $$('.word')[0];
   if(word) {
      word.href += '?ajax=1';
      
      SqueezeBox.assign(word, {
         handler: 'ajax',
         size: {x: 400, y: 250},
         ajaxOptions: { method: 'get' }
      });
   }

   // Setup login link to load login form in Squeezebox
   var login = $$('.login');
   if(!$('login-form') && login.length) {
      login.addEvent('click', function(e) {
            e.stop();
            Forms.displayLogin(e.target);
      });
   }
   
   // Setup register link to load login form in Squeezebox
   var register = $(document);
   register.addEvent('click', function(e) {
         if(e.target.className.match(/register-link/)) {
            e.stop();
            Forms.displayRegister(e.target);
         }
   });
   
   new DomReadyFunctions();
});

// Functions to run for various pages on DomReady
var DomReadyFunctions = new Class({
   initialize: function() {
      // Preloading images for forms (should be more discriminate?)
      var i = new Image(); i.src = 'images/good.png';
      var j = new Image(); j.src = 'images/bad.png';
      
      this.voting(); // Enable voting
      this.timer(); // Enable countdown timer
      this.report(); // Enable report buttons

      if($('archive-search')) this.list(); // List page
      else if($('picture-large')) this.view(); // View page
      else if($('mms-email')) this.profile(); // Profile page
   },

   view: function() {
      $$('.comment-help').addEvent('click', Comment.help);
   },
   
   profile: function() {
      $$('.profile').addEvent('submit', Forms.profile);
      $('profile-help').addEvent('click', Profile.help);
   },
   
   // Setup voting buttons
   voting: function() {
      document.body.addEvent('click', function(e) {
         var targ = $(e.target);
         if(targ.get('class').test(/arrow|score/)) targ = targ.getParent();

         if(targ.get('class').test(/uv|dv/)) {
            e.stop();
            
            Vote.delegate(targ);
         }
      });
   },
   
   // If there is a timer, start counting backwards & enable sync
   timer: function() {
      if(timeLeft) {
         (function() {
            timeLeft -= 60;
            Countdown.set(timeLeft);
         }).periodical(60000);
      }
   },
   
   report: function() {
      document.body.addEvent('click', function(e) {
         if(e.target.className == 'report') {
            Comment.report(e);
         }
      });
   }
});

var Forms = {
   error: {
      'username_invalid': {
         text: 'Please enter a valid username.',
         highlight: ['username']
      },
      
      'username_too_long': {
         text: 'Username must be less than 24 characters.',
         highlight: ['username']
      },
      
      'email_invalid': {
         text: 'Please enter a valid email address.',
         highlight: ['email']
      },
      
      'password_invalid': {
         text: 'Please enter a password!',
         highlight: ['password']
      },
      
      'username_unavailable': {
         text: 'The username you have selected in already in use. Please choose another.',
         highlight: ['username']
      },
      
      'email_used': {
         text: 'The email you entered is already in use. <a href="forgot">Forgot your password?</a>',
         highlight: ['email']
      },
      
      'invalid_pass': {
         text: 'The "current password" that you entered was wrong, please enter the correct one.',
         highlight: ['current-pass']
      },
      
      'too_short': {
         text: 'Please enter a new password!',
         highlight: ['new-pass']
      },
      
      'profile_error': {
         text: 'Gah, something went wrong. Give it another try, and if it happens again <a href="contact">let us know!</a>',
         highlight: []
      },
      
      'account_error': {
         text: 'Gah, something went wrong. Give it another try, and if it happens again <a href="contact">let us know!</a>',
         highlight: []
      },
      
      'forgot_error': {
         text: 'There was an error resetting your password. Please try again later.',
         highlight: []
      },
      
      'bad_email': {
         text: 'No user exists with that email exists.',
         highlight: []
      },
      
      'invalid_username_or_password': {
         text: 'Invalid username or password!<br><a href="forgotpassword" id="forgot-pass">Forgot your password?</a>',
         highlight: []
      },
      
      'banned': {
         text: 'Your account has been banned!',
         highlight: []
      },
      
      'suspended': {
         text: 'Your account is currently suspended. Please try again at a later time.',
         highlight: []
      }
   },

   success: {
      'profile_updated': 'Your profile has been updated!',
      'account_updated': 'Your account has been updated!',
      'key_changed': '',
      'forgot_success': 'An email has been sent to the specified address with further instructions. Please follow those to reset your password.'
   },
   
   login: function(e) {
      e.stop();
      
      var formErr = $('form-error');
      
      $('login-form').set('send', {
         url: 'do.login?ajax=1',
         onComplete: function(result) {
            result = JSON.decode(result);            
            
            if(result.status == 'ok') {
               SqueezeBox.removeEvents();
               SqueezeBox.applyContent('<p class="special" style="margin-top:8px;">Logging in&hellip;</p>', {x: 300, y: 45});
               (function() { window.location.reload(); }).delay(1500);
            } else {
               if(result.status == 'invalid')
                  result.status = 'invalid_username_or_password';
                  
               SqueezeBox.resize({y: 265}, false, true);
               formErr.set('html', Forms.error[result.status].text).morph({height: 32, opacity: 1});
               if(result.status == 'invalid_username_or_password')
                  $('forgot-pass').addEvent('click', function(e) { e.stop(); Forms.displayForgot(e.target); });
               $('password').set('value', '').focus();
            }
         }
      }).send();
   },
   
   displayLogin: function(fromEl, status) {
      SqueezeBox.fromElement(fromEl, {
         handler: 'ajax',
         url: 'login?ajax=1' + (status ? '&status=' + status : ''),
         size: {x: 270, y: (Browser.Engine.trident4 ? 265 : 245) + (status ? 30 : 0)},
         ajaxOptions: { method: 'get' },
         onUpdate: function(e) {
            try {
               $('login-register').getElements('a')[0].addEvent('click', function(e) {
                  e.stop();
                  
                  if(!$('register-form'))
                     Forms.displayRegister(e.target);
                  else
                     SqueezeBox.close(e);
               });
            } catch(e) { }
            
            $('login-submit').addEvent('click', Forms.login);
                        
            var username = $('username');
            username.firmFocus.delay(600, username);
         }
      });
   },
   
   displayRegister: function(fromEl, status) {
      SqueezeBox.fromElement(fromEl, {
            handler: 'ajax',
            overflow: 'hidden',
            url: 'register?ajax=1' + (status ? '&status=' + status : ''),
            size: {x: 270, y: (Browser.Engine.trident4 ? 310 : 300) + (status ? 30 : 0)},
            ajaxOptions: { method: 'get' },
            onUpdate: function() {
               var username = $('username');
               username.firmFocus.delay(600, username);
               
               $('register-submit').removeEvent('click', Forms.register).addEvent('click', Forms.register);
               
               $('login-register').getElements('a')[0].addEvent('click', function(e) {
                  e.stop();
                  Forms.displayLogin(e.target);
               });
               
               username.addEvent('blur', Forms.validate.pass([username, 'alphanumExt']));
               
               var email = $('email');
               email.addEvent('blur', Forms.validate.pass([email, 'email']));
               
               var password = $('password');
               password.addEvent('blur', Forms.validate.pass([password, 'any']));
            }
      });
   },
   
   register: function(e) {
      e.stop();
      
      var formErr = $('form-error');
      
      var valid = true;
      $$('#register-form input[type!=submit]').each(function(el) {
         if(!el.retrieve('valid')) {
            SqueezeBox.resize({y: 310}, false, true);
            formErr.set('html', 'Please correct the issues below.').morph({height: 13, opacity: 1});
            
            if(!el.retrieve('valid')) {
               Forms.validate(el, el.name == 'username' ? 'alphanumExt' : (el.name == 'email' ? 'email' : 'any'));
               if(!el.retrieve('valid'))
                  valid = false;
            } else 
               valid = false;
         }
      });
      if(!valid) return;
      
      SqueezeBox.resize({y: 290}, false, true);
      formErr.set('html', '').morph({height: 0, opacity: 0});
      
      $('register-form').set('send', {
         url: 'do.register?ajax=1',
         onComplete: function(result) {
            result = JSON.decode(result);

            if(status = Forms.error[result.status]) {
               SqueezeBox.resize({y: 325}, false, true);
               formErr.set('html', status.text).morph({height: 30, opacity: 1});
               
               status.highlight.each(function(field) {
                  Forms.fieldToggle($(field), false);
               });
            } else {
               SqueezeBox.fromElement(document, {
                  handler: 'ajax',
                  url: 'registration-complete?ajax=1&email=' + encodeURIComponent(result.status),
                  size: {x: 350, y: 400},
                  ajaxOptions: { method: 'get' },
                  onUpdate: function() {
                     $('ok-btn').addEvent('click', function(e) { e.stop(); window.location.reload() });
                  }
               });
            }
         }
      }).send();
   },
   
   displayForgot: function(fromEl) {
      SqueezeBox.fromElement(fromEl, {
            handler: 'ajax',
            overflow: 'hidden',
            url: 'forgotpassword?ajax=1',
            size: {x: 270, y: (Browser.Engine.trident4 ? 225 : 205)},
            ajaxOptions: { method: 'get' },
            onUpdate: function() {
               var email = $('email');
               email.firmFocus.delay(600, email);
               
               $('reset').removeEvent('click', Forms.forgot).addEvent('click', Forms.forgot);

               email.addEvent('blur', Forms.validate.pass([email, 'email']));
            }
      });
   },
   
   forgot: function(e) {
      e.stop();
      
      var formErr = $('form-error');
      
      $('reset-form').set('send', {
         url: 'do.forgotpassword?ajax=1',
         onComplete: function(result) {
            result = JSON.decode(result);            
            
            if(status = Forms.error[result.status]) {
               formErr.set('html', status.text).morph({height: 32, opacity: 1});
               SqueezeBox.resize({y: 245}, false, true);
            } else if(status = Forms.success[result.status]) {
               formErr.set('html', status).morph({height: 32, opacity: 1});
               SqueezeBox.resize({y: 245}, false, true);
               $('email').set('value', '');
            }
         }
      }).send();
   },
   
   profile: function(e) {
      e.stop();
      
      var form = $(e.target);
      form.set('send', {
         url: 'do.editprofile?ajax=1',
         onComplete: function(result) {
            result = JSON.decode(result);
            
            var formErr = $(result.type + '-form-error');
            
            if(status = Forms.error[result.status]) {
               formErr.set('html', status.text).setStyle('class', 'form-error').morph({height: 23, opacity: 1});
               
               status.highlight.each(function(field) {
                  Forms.fieldToggle($(field), false);
               });
            } else {
               if(result.type != 'newkey') {
                  formErr.set('html', Forms.success[result.status]).setStyle('class', 'form-success').morph({height: 23, opacity: 1});
                  (function() { formErr.morph({height: 0, opacity: 0}) }).delay(5000);
               } else {
                  var key = $('mms-email').getElement('strong');
                  key.innerHTML = key.innerHTML.replace(/^.+?@(.+?)$/, result.key + '@$1');
               }
               
               form.getElements('input[type="text"],input[type="password"],textarea').each(function(i) {
                  if(i.id.test(/-pass$/) && !i.value.length)
                     return;
                  else if(i.id.test(/-pass$/))
                     i.value = '';
                     
                  Forms.fieldToggle(i, true);
               });
               
               form.focus();
            }
         }
      }).send();
   },
   
   validate: function(field, type) {
      var regExps = {
         any: /^.+$/i,
         alphanum: /^[a-z0-9]*$/i,
         alphanumExt: /^[a-z0-9_\-]+$/i,
         email: /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?$/i
      };

      if(regExps[type].test(field.value))
         Forms.fieldToggle(field, true);
      else
         Forms.fieldToggle(field, false);
   },
   
   fieldToggle: function(field, valid) {
      if(!$defined(valid))
         valid = (field.getStyle('background-color') == '#efa092');
         
      var label = $$('label[for=' + field.id + ']')[0];
         
      if(valid) {
         label.set('html', label.innerHTML.replace(/<img.+?>/i, '') + ' <img src="images/good.png" alt="(ok!)" class="field-status">');
         if(field.getStyle('background-color') == '#efa092')
            (new Fx.Tween(field)).start('background-color', '#efa092', '#fff');
      } else {
         label.set('html', label.innerHTML.replace(/<img.+?>/i, '') + ' <img src="images/bad.png" alt="(bad)" class="field-status">');
         if(field.getStyle('background-color') != '#efa092')
            (new Fx.Tween(field)).start('background-color', '#fff', '#efa092');
      }
      
      field.store('valid', valid);
   }
};

// A very firm setFocus function
Element.implement({
   firmFocus: function() {
      var f = setInterval(function() {
         if((function() { this.focus(); return true; }.bind(this)).attempt())
            clearInterval(f);
      }.bind(this), 10);
      
      return this;
   }
});

// Format the time left meter
var Countdown = {
   format: function(time) {
      var a = $H({'h': 3600, 'm': 60, 's': 1});
      
      var out = {}, left = time;
      a.each(function(v, k) {
         out[k] = Math.floor(left / v);
         left = left % v;
      });
      
      return out;
   },
   
   sync: function() {
      new Request.JSON({url: 'countdown-sync', onComplete: function(time) {
            timeLeft = time;
            Countdown.set(timeLeft);
         }
      }).send();
   },
   
   set: function(time) {
      var formatted = Countdown.format(time);
      
      if(formatted.h <= 0 && formatted.m <= 0 && formatted.s <= 0) {
         window.location.reload();
         return;
      }
      
      $('time-left').set('html', formatted.h + ' hours, ' + formatted.m + ' minutes');
      
      delete formatted;
   }
};

// Voting handler
var Vote = {
   delegate: function(target) {
      try {
         Vote.on(target);
      } catch(e) { }

      Vote.dovote(target);
   },
   
   dovote: function(vote_obj, nodeep) {
      if(!isLoggedIn)
         return Forms.displayLogin(vote_obj, 'login');
      
      if($(vote_obj).getParent().get('class') == 'vote') {
         if(vote_obj.href.test(/\/up\//)) {
            var not_vote_obj = $(vote_obj).getParent().getElements('.dv')[0];;
         } else {
            var not_vote_obj = $(vote_obj).getParent().getElements('.uv')[0];
         }
   
         if(!vote_obj.get('class').test(/.vg/) && !not_vote_obj.get('class').test(/.vg/)) {
            // if neither is gray
            
            var c = not_vote_obj.get('class');
            not_vote_obj.set('class', c + ' ' + c + 'g');
            
            var score = vote_obj.getElement('.score');
            score.set('html', score.get('html').toInt() + 1);
         } else if(vote_obj.get('class').test(/.vg/) && !not_vote_obj.get('class').test(/.vg/)) {
            // if the clicked one is gray and the other one isn't
            
            vote_obj.set('class', vote_obj.get('class').replace(/ .vg$/, ''));
            
            var c = not_vote_obj.get('class');
            not_vote_obj.set('class', c + ' ' + c + 'g');
   
            var score = not_vote_obj.getElement('.score');
            score.set('html', score.get('html').toInt() - 1);
            
            score = vote_obj.getElement('.score');
            score.set('html', score.get('html').toInt() + 1);
         } else {
            // if the not clicked one is gray and the clicked one isn't
            
            not_vote_obj.set('class', not_vote_obj.get('class').replace(/ .vg$/, ''));
            
            var score = vote_obj.getElement('.score');
            score.set('html', score.get('html').toInt() - 1);
         }         
      } else if($(vote_obj).getParent().get('class') == 'comment-vote') {
        if(vote_obj.href.test(/\/up\//)) {
            var upvote = vote_obj;
            var downvote = $(vote_obj).getParent().getElements('.dv')[0];
         } else {
            var downvote = vote_obj;
            var upvote = $(vote_obj).getParent().getElements('.uv')[0];
         }
         
         if(vote_obj.get('class').test(/voted/)) {
            upvote.set('class', 'uv upvote');
            downvote.set('class', 'dv downvote');
            
            newScore = (vote_obj == upvote ? -1 : 1)
         } else {
            var revote = vote_obj.get('class').test(/vote-gray/);
            
            if(vote_obj == upvote) {
               upvote.set('class', 'uv upvoted');
               downvote.set('class', 'dv downvote-gray');
               newScore = (revote ? 2 : 1);
            } else {
               upvote.set('class', 'uv upvote-gray');
               downvote.set('class', 'dv downvoted');
               newScore = (revote ? -2 : -1);
            }
         }
         
         // Score vs. points for picture vs. comment voting
         var score = $(vote_obj).getParent().getElements('.score')[0];
         if(score) {
            score.set({
               html: score.get('html').toInt() + newScore,
               tween: {duration: 750}
            }).highlight((vote_obj == upvote ? '#ff9b89' : '#9dd4ff'), score.getParent().getStyle('background-color'));
         } else {
            var points = $(vote_obj).getParent().getParent().getElements('.points')[0];
            var newPoints = (points.get('html').replace(/points?/, '').toInt() + newScore);
            points.set({
               html: newPoints + ' point' + (newPoints != 1 ? 's' : ''),
               tween: {duration: 750}
            }).highlight((vote_obj == upvote ? '#ff9b89' : '#9dd4ff'), points.getStyle('background-color'));
            
            // Gray out comment if negative vote
            var c_body = $(vote_obj).getParent().getParent().getElements('.comment')[0];
            if(vote_obj == downvote && newScore < 0) {
               c_body.addClass('gray');
            } else {
               c_body.removeClass('gray');
            }
         }
      }

      // For index
      if(!nodeep && not_vote_obj) {
         $$('a[href=' + vote_obj.href.replace(/.+?(up|down)\/(\d+?)$/, 'vote/$1/$2') + ']').each(function(e) {
            if(e == vote_obj) return;
            
            Vote.dovote(e, true);
         });
      }
   },
   
   on: function(vote_obj) {
      new Request({
         method: 'get',
         url: vote_obj.href + '?ajax=1&t=' + (new Date().getTime())
      }).send();
   }
};

// Archive search class
var Search = {
   delay: false,
   
   select: function(e) {
      e.target.select();
   },
   
   go: function(e) {
      if(e && $defined(e.stop)) e.stop();
      
      $('archive-search').send('list/json-search');
   },
   
   typing: function(e) {
      if(Search.delay)
         clearTimeout(Search.delay);
      
      if(e.key.test(/^[a-z0-9, -.\/]$/i) || e.key.test(/backspace|delete/))
         Search.delay = setTimeout(Search.go, 250);
      else if(e.key == 'down' && $('results').getElements('li')[0]) {
         $('results').getElements('li')[0].getElements('a')[0].focus();
         e.stop();
      }
   },
   
   results: function(r) {
      try {
         r = JSON.decode(r);
      } catch(e) {
         r = [];
      }
      
      var resList = $('results').empty();
      if(r.length) {
         Search.resArr = r;
         Search.result();
      } else {
         new Element('li', {html: 'No results found!'}).inject(resList);
      }
   },
   
   result: function() {
      if(!Search.resArr.length)
         return;
      
      var urlCopy = $('list-sort').getElements('a')[0].href.replace(/(,\d\d)\/.+?$/, '$1/');
         
      var item = Search.resArr.shift();
         
      var i = new Element('li');
      
      var a = new Element('a', {
         href: urlCopy + item.word,
         html: item.word,
         'class': (Search.resArr.length % 2 == 0 ? 'zeb' : ''),
         events: {
            keydown: Search.resultKey,
            focus: Search.focusItem,
            blur: Search.unfocusItem
         }
      }).inject(i);
      
      var date = new Element('small', {html: '&nbsp;(' + item.date + ')'}).inject(a);
      
      i.inject($('results'));
      
      Search.result.delay(1);
   },
   
   resultKey: function(e) {
      if(e.key.test(/up|down/)) {
         e.stop();

         if(e.key == 'up') {
            if(!$(e.target).getParent().getPrevious())
               $('query').focus()
            else
               $(e.target).getParent().getPrevious().getElement('a').focus();
         } else if(e.key == 'down') {
            if($(e.target).getParent().getNext())
               $(e.target).getParent().getNext().getElement('a').focus();
         }
      } else if(e.key.test(/^[a-z0-9, -.\/]$/i)) {
            $('query').fireEvent('keydown', e).focus();
      }
   },
   
   focusItem: function(e) {
      $(e.target).addClass('focus');
   },
   
   unfocusItem: function(e) {
      $(e.target).removeClass('focus');
   }
};

// Comment functions
var Comment = {
   reply: function(id) {
      if(replyform = $('reply-form-' + id)) {
         replyform.setStyle('display', 'block');
         replyform.getElements('[name=reply_field]')[0].focus();
      } else {
         var location = $('comment-' + id).getElements('.comment-options')[0];
         var new_form = $('comment-new').clone(true, false).set({'id': 'reply-form-' + id, 'class': 'reply-form font-smaller'}).inject(location, 'after');
         
         var label = new_form.getElement('label');
         label.innerHTML = label.innerHTML.replace(/post/, 'reply to');
         
         new_form.getElements('[name=reply_to]')[0].set('value', id);
         
         var cancel = new_form.getElements('.comment-cancel')[0];
         cancel.setStyle('display', 'block').addEvent('click', function(e) {
            e.stop();
            $('reply-form-' + id).setStyle('display', 'none');
         });
         
         new_form.getElements('.comment-help')[0].addEvent('click', function(e) { Comment.help(e, id); });
         
         new_form.getElements('[name=reply_field]')[0].focus();
      }
   },
   
   edit: function(id) {
      var comment = $('comment-' + id).getElements('.comment')[0];
      
      if(replyform = $('edit-form-' + id)) {
         comment.setStyle('display', 'none');
         
         replyform.setStyle('display', 'block');
         replyform.getElements('[name=edit_field]')[0].focus();
      } else {
         var location = $('comment-' + id).getElements('.comment')[0];
         var new_form = $('comment-new').clone(true, false).set({'id': 'edit-form-' + id, 'class': 'reply-form font-smaller'}).inject(location, 'after');
         comment.setStyle('display', 'none');
         
         var label = new_form.getElement('label');
         label.innerHTML = label.innerHTML.replace(/post/, 'edit');
         
         new_form.getElements('[name=reply_to]')[0].set({'id': 'edit_id', 'name': 'edit_id', 'value': id});
         
         var cancel = new_form.getElements('.comment-cancel')[0];
         cancel.setStyle('display', 'block').addEvent('click', function(e) {
            e.stop();
            $('edit-form-' + id).setStyle('display', 'none');
            $('comment-' + id).getElements('.comment')[0].setStyle('display', 'block');
         });
         
         new_form.getElements('.comment-help')[0].addEvent('click', function(e) { Comment.help(e, id); });
         
         var edit_field = new_form.getElements('[name=reply_field]')[0].set({'name': 'edit_field'}).setStyle('display', 'none');
         
         var spinId = (new Date()).getTime();
         (new Element('img', {id: 'tmpspinner' + spinId, src: 'images/spinner.gif'})).inject(edit_field, 'after');
         new Request({
            url: 'markdownify',
            data: 'comment=' + encodeURIComponent(comment.get('html')),
            onSuccess: function(md) {
               $('tmpspinner' + spinId).destroy();
               edit_field.set('value', md).setStyle('display', 'block').focus();
            }
         }).send();
      }      
   },
   
   help: function(e, id) {
      e.stop();
      
      if(!$defined(id))
         id = 'new';
      
      if(e.target.innerHTML == 'help') {
         $('comment-' + id).getElements('.markdown-help')[0].setStyle('display', Browser.Engine.trident ? 'block' : 'table');
         e.target.innerHTML = 'hide help';
      } else {
         $('comment-' + id).getElements('.markdown-help')[0].setStyle('display', 'none');
         e.target.innerHTML = 'help';
         
         $('comment-' + id).getElements('[name=reply_field]')[0].focus();
      }      
   },
   
   report: function(e, confirm, picture) {
      if(e.stop) {
         e.stop();
         
         var picture = $(e.target).id.test('picture');
         var id = e.target.id.replace(/report-(picture-)?/, '');
         $(e.target).getParent().set('html', '<a id="report-' + (picture ? 'picture-' : '') + id + '"></a>are you sure? <a href="javascript:Comment.report(' + id + ', true, ' + (picture ? 'true' : 'false') + ')">yes</a> / <a href="javascript:Comment.report(' + id + ', false, ' + (picture ? 'true' : 'false') + ')">no</a>');
      } else if($defined(confirm)) {
         if(!isLoggedIn)
            return Forms.displayRegister(document.body, 'register');
         
         if(confirm) {
            new Request({
               url: 'report/' + (picture ? 'picture' : 'comment') + '/' + e + '?ajax=1',
               method: 'get',
               onSuccess: function(result) {
                  var el = $('report-' + (picture ? 'picture-' : '') + e).getParent();
                  
                  if(result == 'already')
                     el.set('html', '<em>already reported</em>');
                  else if(result == 'reported')
                     el.set('html', '<em>reported</em>');
                  else
                     el.set('html', '<em>error</em>');
                  
                  if(!picture) {
                     var cmt = $('comment-' + e).getElements('.dv')[0];
                     Vote.dovote(cmt);
                     Vote.on(cmt);
                  }
               }
            }).send();
         } else {
            $('report-' + (picture ? 'picture-' : '') + e).getParent().set('html', '<a href="report/' + (picture ? 'picture' : 'comment') + '/' + e + '" id="report-' + (picture ? 'picture-' : '') + e + '" class="report">report</a>');
         }
      }
   }
};

var Profile = {
   help: function(e) {
      e.stop();
      
      if(e.target.innerHTML == 'help') {
         $('profile').getElements('.markdown-help')[0].setStyle('display', Browser.Engine.trident ? 'block' : 'table');
         e.target.innerHTML = 'hide help';
      } else {
         $('profile').getElements('.markdown-help')[0].setStyle('display', 'none');
         e.target.innerHTML = 'help';
         
         $('about').focus();
      } 
   }
}

function closeNews() {
   $('notice').setStyle('display', 'none');
   Cookie.write('shownews', 'no', {duration: 604800}); // 7 days
   
   return false;
}