var Application = {};

Application.version = 13;
Application.animationSpeed = 300;
Application.borderRaduisSupport = !(($.browser.msie && (parseInt($.browser.version) < 9)) || ($.browser.opera && (parseFloat($.browser.version) < 10.50)));
Application.isIE = ($.browser.msie && (parseInt($.browser.version) < 9));

$(document).ready(function() {

  Application.initialize();
  Application.initializeMenu();
});

Application.initialize = function(options) {

  $("a.portfolio_link").attr('target', '_blank');

  if ($(".simple_carousel").length > 0) {
    $("p img[src^='/system/page_medias']")
      .css('cursor', 'pointer')
      .bind('click', function() {

        var src = $(this).attr('src');
        $(".simple_carousel").find("img[src$='" + src + "']").closest('a').click();
      });    
  }
}

Application.initializeMenu = function(options) {

  var menuHeight = $('#main_menu').height();

  var title = $('#main_menu').find('a').each(function() {

    var title = $(this).find('span.main_menu_title');
    var titleTopOffset = menuHeight / 2 - title.height() / 2;

    title.css({
      position: 'absolute',
      top: titleTopOffset
    });

    var description = $(this).find('span.main_menu_description');
    var descriptionTopOffset = menuHeight / 2 - description.height() / 2;
    description.css({
      position: 'absolute',
      top: descriptionTopOffset + menuHeight
    });

    $(this)
      .bind('mouseenter', function() {

        title.stop().animate({top: titleTopOffset - menuHeight}, Application.animationSpeed);
        description.stop().animate({top: descriptionTopOffset}, Application.animationSpeed);
      })
      .bind('mouseleave', function() {

        title.stop().animate({top: titleTopOffset}, Application.animationSpeed);
        description.stop().animate({top: descriptionTopOffset + menuHeight}, Application.animationSpeed);
      });
    
  });
}

Application.initializeSimpleCarousel = function() {

  $('.simple_carousel').simpleCarousel();
}

Application.initializeSimpleGallery = function() {

  $('.simple_carousel').simpleGallery();
}


Application.initializeEditor = function(options) {

  var default_options = {
    script_url: '/javascripts/tiny_mce/tiny_mce.js',
    theme: 'advanced',
    plugins: 'safari,inlinepopups,paste,media,fullscreen,table,media,typograph,advimage',
    theme_advanced_buttons1: 'undo,redo,|,pastetext,pasteword,|,charmap,|,justifyleft,justifycenter,justifyright,|,bullist,numlist,|,bold,italic,formatselect,removeformat,|,link,unlink',
    theme_advanced_buttons2: 'tablecontrols,|,image,media,styleselect,|,fullscreen,|,typograph',
    theme_advanced_buttons3: '',
    theme_advanced_toolbar_location: 'top',
    theme_advanced_toolbar_align: 'left',
    theme_advanced_statusbar_location: 'bottom',
    theme_advanced_resizing: true,
    theme_advanced_resize_horizontal: false,
    theme_advanced_path: false,
    width: '100%',
    content_css: '/stylesheets/editor.css?' + Application.version,
    theme_advanced_blockformats: 'p,h1,h2,address',
    convert_urls: false,
    valid_elements: ""
      +"@[title],"
      +"a[href|target],"
      +"caption[align<bottom?left?right?top],"
      +"h1[align<center?justify?left?right],"
      +"h2[align<center?justify?left?right],"
      +"h3[align<center?justify?left?right],"
      +"h4[align<center?justify?left?right],"
      +"h5[align<center?justify?left?right],"
      +"h6[align<center?justify?left?right],"
      +"img[align<bottom?left?middle?right?top|height|width|src|alt|class],"
      +"ol[],"
      +"ul[],"
      +"li[],"
      +"address[class],"
      +"p[style|align|class],"
      +"b[],strong[],"
      +"i[],em[],"
      +"span[style|class],"
      +"table[align<center?char?justify?left?right|valign<baseline?bottom?middle?top|width|class],"
      +"thead[align<center?char?justify?left?right|valign<baseline?bottom?middle?top],"
      +"tbody[align<center?char?justify?left?right|valign<baseline?bottom?middle?top],"
      +"tfoot[align<center?char?justify?left?right|valign<baseline?bottom?middle?top],"
      +"tr[align<center?char?justify?left?right|rowspan|valign<baseline?bottom?middle?top],"
      +"td[align<center?char?justify?left?right|rowspan|valign<baseline?bottom?middle?top|class|style],"
      +"th[align<center?char?justify?left?right|rowspan|valign<baseline?bottom?middle?top|style],"
      +"object[classid|width|height|codebase|*],"
      +"param[name|value|_value],"
      +"embed[type|width|height|src|*]"
  };

  $.extend(default_options, options);
  $('textarea').tinymce(default_options);
}

Application.initializeSortable = function(options) {

  default_options = {
    selector: '.sortable',
    axis: 'y',
    elements_selector: 'ol'
  }
  options = $.extend(default_options, options);

  $(options.selector).sortable({
    connectWith: [options.selector],
    axis: options.axis,
    handle: '.handle',
    start: function(event, ui) {
      $(this).addClass('sortable_active');
    },
    stop: function(event, ui) {
      $(this).removeClass('sortable_active');

      var element = $(ui.item);
      var elements = element.closest(options.elements_selector).find('li');
      var ids = $.map(elements, function(elem, i){
        return $(elem).attr('id').replace(options.id_prefix + '_', '');
      });
      var parent_id;
      if (options.parent_id_prefix) parent_id = element.closest('.parent').attr('id').replace(options.parent_id_prefix + '_', '');
      var data = {
        id: element.attr('id').replace(options.id_prefix + '_', ''),
        ids: ids,
        parent_id: parent_id
      }
      $.post(options.sort_url, data); 
    }
  });
}

Application.initializeUploader = function(options) {

  var default_options = {
    file_size_limit: "102400",
    file_upload_limit: "0",
    file_queue_limit: "0",
    flash_url: "/flash/swfupload.swf",
    button_image_url: '/images/swfupload_button.png',
    button_width: 175,
    button_height: 55,
    button_cursor : SWFUpload.CURSOR.HAND,
    post_params: { '_method': 'POST' },
    background_color: '#fff'
  };

  if (options.type == "page_media") {
    default_options["file_types"] = "*.jpg;*.jpeg;*.png";
    default_options["file_types_description"] = "Images (jpg, jpeg, png)";
  }

  /* Authenticity token */
  var authParam = $('meta[name=csrf-param]').attr('content');
  var authToken = $('meta[name=csrf-token]').attr('content');
  default_options['post_params'][authParam] = authToken;

  /* Session key */
  var sessParam = $('meta[name=session-param]').attr('content');
  var sessToken = $('meta[name=session-token]').attr('content');

  default_options['file_post_name'] = options['param'];

  $('.attachments').each(function() {

    if ($('.uploader', this).length == 0) return;

    var button = $('.upload_button', this);
    var list = $('.new_files', this);
    var elements_list = $('.files', this);
    var elements = {};

    var url = button.attr('href');

    button
      .swfupload($.extend({}, default_options, {
        button_placeholder: button[0],
        upload_url: url + '?' + sessParam + '=' + encodeURIComponent(sessToken)
      }))
      //.bind('swfuploadLoaded', function(e) { })
      .bind('fileQueued', function(e, file) {

        var element = $(
          '<div class="file">' +
            '<div class="progress"></div>' +
            '<div class="name"></div>' +
          '</div>'
        );

        elements[file.name] = element;

        element.appendTo(list);

        $('.progress', elements[file.name]).text('0%');
        $('.name', element).text(file.name);

        $(this).swfupload('startUpload');
      })
      //.bind('fileDialogStart', function(e) { })
      //.bind('fileDialogComplete', function(e, numFilesSelected, numFilesQueued) { })
      // .bind('uploadStart', function(e, file) {})

      .bind('uploadProgress', function(e, file, bytesLoaded) {

        $('.progress', elements[file.name]).text(Math.round(100 * bytesLoaded / file.size) + '%');
      })

      .bind('uploadSuccess', function(e, file, serverData) {

        var data = $.parseJSON(serverData);

        $('.progress', elements[file.name]).text('');
        elements[file.name]
          .addClass('success')
          .delay(Application.hideDelay)
          .animate({height: 0, opacity: 0}, Application.animationSpeed);
        var url = data.resource_url;

        var newElement = $('<li class="' + options.type + '" id="' + options.type + '_' + data.id + '"/>').appendTo(elements_list);

        switch (options.type)
        {
        case "page_media":
          var name = file.name.split('.').pop();
          var newImage = $('<img/>')
            .attr({
              alt: data.name,
              title: data.name,
              src: data.url,
              'class': 'handle'
            })
            .appendTo(newElement);
          break;

        default:
          break;
        }

        newElement.append("\n");
        var links = $('<span class="admin_links links"/>').appendTo(newElement);

        if (data.translation.edit) {
          $('<a/>')
            .attr('href', url + '/edit')
            .text(data.translation.edit)
            .appendTo(links);
          links.append("\n");
        }

        if (data.translation.destroy) {
          $('<a/>')
            .text(data.translation.destroy)
            .attr({
              href: url,
              'data-method': 'delete',
              'data-confirm': data.translation.destroy_confirm,
              rel: 'nofollow'
            })
            .appendTo(links);
        }

        newElement.hide().appendTo(elements_list).fadeIn(Application.animationSpeed);

        $(this).swfupload('startUpload');
      })
      //.bind('uploadComplete', function(e, file){ })
      .bind('fileQueueError', function(e, file, errorCode, message) {

        $('.progress', elements[file.name]).text('');
        elements[file.name]
          .addClass('failure')
          .delay(Application.hideDelay)
          .animate({height: 0, opacity: 0}, Application.animationSpeed);
      })

      .bind('uploadError', function(e, file, errorCode, message) {

        $('.progress', elements[file.name]).text('');
        elements[file.name]
          .addClass('failure')
          .delay(Application.hideDelay)
          .animate({height: 0, opacity: 0}, Application.animationSpeed);
        $(this).swfupload('startUpload');
      });
  });
}
