var submitting = false;
function showError(obj, selector){
  var error = ''
  $(obj).each(function(){ error += this; });
  if(error != '')
    $(selector).html(error).css('color', 'red').show();
}

function ajaxSubmit(opts){
  var default_opts = {
    type: 'POST',
    dataType: 'json',
    timeout: 4000,
    complete : function(){ submitting = false; },
    error: function(){alert(messages.error);}
  }
  var o = $.extend(default_opts, opts);
  $.ajax(o);
  return false;
}

function createResource() {
  var
    $t = $(this),
    $b = $t.find(':submit').hide(),
    $s = $b.after(' &nbsp; <span><img src="/images/loading.gif" class="valign_middle" /> ' + messages.saving + '...</span>').next('span');
  hideResourceError();

  ajaxSubmit({
    url: $t.attr('action'),
    data: $t.serializeArray(),
    timeout: 10000,
    beforeSend : function(){
      if(submitting){ return false; }
      submitting = true;
    },
    success: function(obj){
      if (obj.success){
        if (obj.redirect) {
          $s.css('color', 'green').html(messages.success);
          location.href = obj.redirect;
        } else {
          $('#id_title, #id_description, #id_web, #id_image').val('');
          $(obj.content).prependTo('#resource_list').find('a.res_link, div.text a').decorate();
          $s.css('color', 'green').html(messages.success);
          var $rc = $('#res_count'), cnt = parseInt($rc.html(), 10);
          $rc.html((cnt+1));
          $('#no_resorece').remove();
          setTimeout(function () { $b.show(); $s.remove(); }, 1600);
          if ((cnt+1) > 1)
            $('#modify_resource_order').show();
        }
      } else if(obj.error) {
        if (typeof obj.error == 'object') {
          for (var i in obj.error) {
            showError(obj.error[i], '#' + i + '_error');
          }
          $s.remove();
        } else {
          $s.addClass('error').html(obj.error);
          setTimeout(function () { $s.remove(); }, 5500);
        }
        $b.show();
      }
    }
  });
  return false;
}
function hideResourceError(){
  $('#res_form_status').empty().hide();
  $('#title_error').empty().hide();
  $('#description_error').empty().hide();
  $('#web_error').empty().hide();
  $('#image_error').empty().hide();
}

function createResponse() {
  var
    $t = $(this),
    $a = $t.find('textarea'),
    response = $.trim($a.val());

  if (response == '') return false;

  var
    $b = $t.find(':submit').hide(),
    $s = $b.after('<div><img src="/images/loading.gif" class="valign_middle" /> ' + messages.saving + '...</div>').next();

  $('#response_name_error').hide().empty();
  $('#response_response_error').hide().empty();

  ajaxSubmit({
    url: $t.attr('action'),
    data : $t.serializeArray(),
    beforeSend : function(){
      if(submitting){ return false; }
      submitting = true;
    },
    success: function(obj){
      if (obj.success) {
        $s.css('color', 'green').html(messages.success);
        $('#response_list').append(obj.content);
        var $rc = $('#resp_count'), cnt = parseInt($rc.html(), 10);
        $rc.html((cnt+1));
        $a.val('');
        setTimeout(function () {
          $b.show();
          $s.remove();
        }, 1600);
      } else if(obj.error) {
        if (obj.error.name){ showError(obj.error.name, '#response_name_error'); }
        if (obj.error.response){ showError(obj.error.response, '#response_response_error'); }
        $s.remove();
        $b.show();
      }
    }
  });
  return false;
}

function createUser(f){
  if ($.trim($('#id_first_name').val()) == '') return false;
  $('#user_form_status').empty();

  var
    $t = $(f),
    $b = $s = $t.find(':submit').hide(),
    $s = $b.after('<p><img src="/images/loading.gif" class="valign_middle" /> <span class="green">' + messages.saving + '...</span></p>').next();

  ajaxSubmit({
    url: $t.attr('action'),
    data : $t.serializeArray(),
    beforeSend : function(){
      if(submitting){ return false; }
      submitting = true;
    },
    success: function(obj){
      if (obj.success){
        $s.css('color', 'green').html(messages.success).show();
        setTimeout(function () { location.reload(); }, 1200);
      } else if (obj.error) {
        if (obj.error.first_name) { showError(obj.error.first_name, '#user_form_status'); }
        $b.show();
        $s.remove();
      }
    }
  });
  return false;
}

function vote(){
  if(submitting){ return false; }

  var
    m = this.id.match(/^(up|down)_(.+)$/),
    arrow = m[1],
    key = m[2],
    obj = $(this),
    up_obj = $('#up_' + key),
    down_obj = $('#down_' + key),
    p_obj = $('#p_' + key);

  if(obj.hasClass('up')) {
    obj.removeClass('up').addClass('up_select');
    down_obj.removeClass('down_select').addClass('down');
  }
  else if(obj.hasClass('down')) {
    obj.removeClass('down').addClass('down_select');
    up_obj.removeClass('up_select').addClass('up');
  }
  else if(obj.hasClass('up_select')) {
    obj.removeClass('up_select').addClass('up');
    down_obj.removeClass('down_select').addClass('down');
  }
  else if(obj.hasClass('down_select')) {
    obj.removeClass('down_select').addClass('down');
    up_obj.removeClass('up_select').addClass('up');
  }

  ajaxSubmit({
    url : '/vote/',
    data : {key: key, vote: arrow},
    timeout: 8000,
    beforeSend : function(){
      submitting = true;
      p_obj.hide().html(messages.voting + '...').css({fontSize: '11px', fontWeight: 'normal'}).show();
    },
    success : function(obj){
      if(obj.error){ window.alert(obj.error); }
      else{
        p_obj.hide().css({fontSize: '15px', fontWeight: 'bold'}).html(obj.value).fadeIn(200);
      }
    }
  });
  return false;
}

function showLogin(e) { e.preventDefault();
  $('#login_form_block').dialog({width: 500});
  return false;
}

function setupOpenID() {
  $('#login_form_block a.openid').click(function (e) { e.preventDefault();
    $('#openid_notice').remove();
    var
      $t = $(this),
      link = $t.attr('rel'),
      $oi = $('#openid_identifier').val(link);
    if ($t.hasClass('submit')) {
      $('#open_id_form').submit();
      return false;
    }
    if (!$t.hasClass('notify')) return false;

    $('#open_id_form').show();
    if (!($t.attr('title'))) return false;
    var p = $oi.position();
    $('<div />')
      .attr('id', 'openid_notice')
      .html($t.attr('title'))
      .css({
        position: 'absolute',
        top: p.top + $oi.outerHeight(true),
        left: p.left,
        width: '300px',
        backgroundColor: '#222',
        color: '#fff',
        fontSize: '11px',
        padding: '2px 3px',
        zIndex: 999999
      })
      .appendTo('#login_form_block');
  });
  $('#open_id_form').submit(function () {
     var $oi = $('#openid_identifier'), id = $oi.val();
     if (!id.match(/\/$/))  $oi.val(id + '/');
  });
}

function setupUpload(options) {
  var opts = $.extend({
    show: 'show_upload_dialog',
    block: 'upload_form_block',
    form: 'upload_form',
    id: 'id_img_ref',
    img: 'uploaded_image',
    cancel: 'cancel_image',
    cancelCallback: null
  }, options);

  var remover = function() {
    $('#' + opts.img).empty().hide();
    $('#' + opts.id).val('');
    return false;
  };

  if ($.isFunction(opts.cancelCallback)) {
    var cancelCallback = opts.cancelCallback;
  } else {
    var cancelCallback = remover;
  }

  $('#' + opts.show).click(function (e) { e.preventDefault();
    $('#' + opts.block).dialog({width: 300});
  });

  $('#' + opts.cancel).live('click', cancelCallback);

  $('#' + opts.form).submit(function () {
    var $t = $(this);
    if ($t.find(':file').val() == '') return false;
    var
      $b = $t.find(':submit').hide(),
      $s = $b.after('<span class="green">uploading...</span>').next();
    $t.ajaxSubmit({
      iframe: true,
      resetForm: true,
      dataType: 'json',
      //beforeSubmit: function(a,f,o) { remover(); },
      success: function(obj, s) {
        if (obj.status && obj.status == 'success') {
          $('#' + opts.id).val(obj.key);
          var h =
            '<img src="' + obj.src + '?t=' + new Date().getTime() + '" alt="" class="valign_middle" /> ' +
            '<input type="button" value="cancel" class="standard" id="' + opts.cancel + '" />';
          $('#' + opts.img).html(h).show();
          $('#dialogoverlay').trigger('remove.dialog');
          $b.show();
          $s.remove();
        } else if (obj.message) {
          if(obj.errors && obj.errors.image){ $s.css({color: '#ff0000'}).html(obj.errors.image); }
          else{ $s.css({color: '#ff0000'}).html(obj.message)}
          setTimeout(function () {
            $b.show();
            $s.remove();
          }, 2200);
        }
      }
    });
    return false;
  });
}

var del = new Object();
del = {
  conf: function(e, type, key){
    var msg = '';
    if (lang == 'ja'){
      msg = '本当に削除してもよろしいですか？復元はできません。';
    } else {
      msg = 'Sure you want to delete this ' + type + '? There is NO undo!';
    }

    if (window.confirm(msg)) {
      del.destroy(e, type, key);
    }
    return false;
  },
  destroy: function(e, type, key){
    var obj = $(e.parentNode);
    var container = $('#' + type + '_' + key);
    ajaxSubmit({
      url : '/' + type + '/' + key + '/delete/',
      data : {method: '_delete'},
      beforeSend : function(){
         if(submitting){ return false; }
         submitting = true;
         obj.html('<img src="/images/loading.gif" class="valign_middle" /> deleting...');
       },
      success : function(res){
        message = "";
        if(res.error) {alert('error occured.');}
        else if(res.success){
          var msg = (lang == 'ja') ? '削除しました。': 'deleted';
          obj.hide().css('color', 'green').html(msg).fadeIn(200);
          if(container.length != 0){
            setTimeout(function(){ container.hide(200); }, 1000 * 1);
          }else if(res.redirect){
            window.location = res.redirect;
          }else{window.location = '/';}
        }else{alert('error occured.');}
      }
    });
  }
};

jQuery.expr[':'].Contains = function(a,i,m) {
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

(function($){
  $.fn.dialog = function (opts) {
    var opts = $.extend({
      width: null,
      removable: true
    }, opts);

    var
      $w = $(window),
      $d = $(document),
      docHeight = $d.height(),
      winHeight = $w.height(),
      winWidth = $w.width();

    return this.each(function(i, e) {
      var
        $e = $(e),
        h = $e.height(),
        w = (opts.width) ? opts.width: $e.width();

      $('body')
        .append('<div id="dialogoverlay"></div>')
        .find('#dialogoverlay')
          .css({
            opacity: 0.86,
            width: (winWidth-1) + 'px',
            height: docHeight + 'px'
           })
          .bind('remove.dialog', function () {
            if (opts.removable) {
              $(this).remove();
              $e.hide();
            }
          })
          .bind('click', function () {
            $(this).trigger('remove.dialog');
          });
      $e
        .css({
          left: ((docHeight > winHeight) ? winWidth/2 - w/2 - 18: winWidth/2 - w/2) + 'px',
          top: $d.scrollTop() + winHeight/2 - h/2 + 'px',
          width: w + 'px'
        })
        .addClass('dialog')
        .fadeIn(500);
    });
  }
})(jQuery);

(function($){
  $.fn.decorate = function (opts) {
    var opts = $.extend({}, opts);

    return this.each(function(i, e) {
      var
        $t = $(e),
        link = $t.attr('href'),
        m = link.match(/^https?:\/\/([^\/]+)/);
      if (m)
        $('<img />')
          .addClass('favicon')
          .attr('src', 'http://www.google.com/s2/favicons?domain=' + m[1])
          .error(function () {})
          .load(function () { $(this).insertBefore(e); });
      _append($t, link);
    });
  };

  function _append($t, link) {
    // YouTube
    var m = link.match(/^http:\/\/.{2,3}\.youtube\.com\/watch\?v=([^&]+)/);
    if (m) {
      $t.after('<div class="video"><div id="' + m[1] + '"></div></div>');
      swfobject.embedSWF('http://www.youtube.com/v/' + m[1] + '&amp;egm=1&amp;', 
                         m[1],
                         '425', '344', '8', null, null,
                         {allowScriptAccess: 'always',allowFullScreen: 'true', wmode: 'opaque'},
                         {id: 'v_' + m[1]});
      return true;
    }
/*
    // Twitter
    var m = link.match(/^http:\/\/twitter\.com/);
    if (m) {
      $t.nextAll('div.description').each(function (i, e) {
        var txt = e.innerHTML;
        txt = txt
          .replace(/@([a-zA-Z0-9_]+)/g, '@<a href="http://twitter.com/$1">$1</a>')
          .replace(/(?:^|\s)#([^\s\.\+:!]+)/g, function (a, u) {
            return ' <a href="http://twitter.com/search?q=' + encodeURIComponent(u) + '">#' + u + '</a>';
          });
        $(e).html(txt);
      });
      return true;
    }
    // amazon
    var m = link.match(/^http:\/\/www\.amazon\.[\.a-z]{2,5}\/(.+)/);
    if (m) {
      $t.parent().after('<div id="' + m[1] + '" class="amazon"></div>');
      var token = m[1].match(/(?:dp|product)\/(\w+)/);
      if (token) {
        console.log(token);
      }
      return true;
    }
*/
    // Vimeo
    var m = link.match(/^http:\/\/(?:.{2,3}\.)?vimeo\.com\/([^&]+)/);
    if (m) {
      $t.after('<div class="video"><div id="' + m[1] + '"></div></div>');
      swfobject.embedSWF('http://vimeo.com/moogaloop.swf?clip_id=' + m[1] + '&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1', 
                         m[1], '400', '300', '8', null, null,
                         {allowScriptAccess: 'always', allowFullScreen: 'true', wmode: 'opaque'},
                         {id: 'v_' + m[1]});
      return true;
    }
    // NicoVideo
    var m = link.match(/^http:\/\/www\.nicovideo\.jp\/watch\/(\w+)/);
    if (m) {
      $t.after('<div class="video"><div id="' + m[1] + '"></div></div>');
      $('#' + m[1]).html('<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/' + m[1] + '" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/' + m[1] + '">【ニコニコ動画】</a></iframe>');
      return true;
    }
    return false;
  }

})(jQuery);


