kublog 0.0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/.gitignore +9 -0
  2. data/Gemfile +8 -0
  3. data/Gemfile.lock +177 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.rdoc +102 -0
  6. data/Rakefile +39 -0
  7. data/app/assets/images/kublog/.gitkeep +0 -0
  8. data/app/assets/images/kublog/missing_image.png +0 -0
  9. data/app/assets/javascripts/kublog/application.js +13 -0
  10. data/app/assets/javascripts/kublog/categories.js.coffee +48 -0
  11. data/app/assets/javascripts/kublog/comments.js.coffee +30 -0
  12. data/app/assets/javascripts/kublog/email.js.coffee +32 -0
  13. data/app/assets/javascripts/kublog/images.js.coffee +77 -0
  14. data/app/assets/javascripts/kublog/posts.js.coffee +44 -0
  15. data/app/assets/javascripts/kublog/shared.js.coffee.erb +19 -0
  16. data/app/assets/javascripts/kublog/wysiwyg.controls.js.coffee +68 -0
  17. data/app/assets/plugins/kublog/ajaxyupload/images/ajax-loader.gif +0 -0
  18. data/app/assets/plugins/kublog/ajaxyupload/javascripts/jquery.ajaxyupload.js +126 -0
  19. data/app/assets/plugins/kublog/fancybox/images/blank.gif +0 -0
  20. data/app/assets/plugins/kublog/fancybox/images/fancy_close.png +0 -0
  21. data/app/assets/plugins/kublog/fancybox/images/fancy_loading.png +0 -0
  22. data/app/assets/plugins/kublog/fancybox/images/fancy_nav_left.png +0 -0
  23. data/app/assets/plugins/kublog/fancybox/images/fancy_nav_right.png +0 -0
  24. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_e.png +0 -0
  25. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_n.png +0 -0
  26. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_ne.png +0 -0
  27. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_nw.png +0 -0
  28. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_s.png +0 -0
  29. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_se.png +0 -0
  30. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_sw.png +0 -0
  31. data/app/assets/plugins/kublog/fancybox/images/fancy_shadow_w.png +0 -0
  32. data/app/assets/plugins/kublog/fancybox/images/fancy_title_left.png +0 -0
  33. data/app/assets/plugins/kublog/fancybox/images/fancy_title_main.png +0 -0
  34. data/app/assets/plugins/kublog/fancybox/images/fancy_title_over.png +0 -0
  35. data/app/assets/plugins/kublog/fancybox/images/fancy_title_right.png +0 -0
  36. data/app/assets/plugins/kublog/fancybox/images/fancybox-x.png +0 -0
  37. data/app/assets/plugins/kublog/fancybox/images/fancybox-y.png +0 -0
  38. data/app/assets/plugins/kublog/fancybox/images/fancybox.png +0 -0
  39. data/app/assets/plugins/kublog/fancybox/javascripts/fancybox-1.3.4.js +46 -0
  40. data/app/assets/plugins/kublog/fancybox/stylesheets/fancybox-1.3.4.css +359 -0
  41. data/app/assets/plugins/kublog/livequery/javascripts/jquery.livequery.js +250 -0
  42. data/app/assets/plugins/kublog/wysiwyg/images/ajax-loader.gif +0 -0
  43. data/app/assets/plugins/kublog/wysiwyg/images/jquery.wysiwyg.bg.png +0 -0
  44. data/app/assets/plugins/kublog/wysiwyg/images/jquery.wysiwyg.gif +0 -0
  45. data/app/assets/plugins/kublog/wysiwyg/images/jquery.wysiwyg.jpg +0 -0
  46. data/app/assets/plugins/kublog/wysiwyg/images/jquery.wysiwyg.no-alpha.gif +0 -0
  47. data/app/assets/plugins/kublog/wysiwyg/javascripts/jquery.wysiwyg.js +2377 -0
  48. data/app/assets/plugins/kublog/wysiwyg/javascripts/wysiwyg.image.js +284 -0
  49. data/app/assets/plugins/kublog/wysiwyg/javascripts/wysiwyg.link.js +249 -0
  50. data/app/assets/plugins/kublog/wysiwyg/stylesheets/jquery.wysiwyg.css +94 -0
  51. data/app/assets/stylesheets/kublog/application.css +9 -0
  52. data/app/assets/stylesheets/kublog/categories.css +4 -0
  53. data/app/assets/stylesheets/kublog/comments.css +4 -0
  54. data/app/assets/stylesheets/kublog/email.css +7 -0
  55. data/app/assets/stylesheets/kublog/images.css +41 -0
  56. data/app/assets/stylesheets/kublog/posts.css +39 -0
  57. data/app/controllers/kublog/application_controller.rb +12 -0
  58. data/app/controllers/kublog/categories_controller.rb +47 -0
  59. data/app/controllers/kublog/comments_controller.rb +37 -0
  60. data/app/controllers/kublog/images_controller.rb +44 -0
  61. data/app/controllers/kublog/posts_controller.rb +66 -0
  62. data/app/helpers/kublog/application_helper.rb +4 -0
  63. data/app/helpers/kublog/posts_helper.rb +38 -0
  64. data/app/mailers/kublog/post_mailer.rb +11 -0
  65. data/app/models/kublog/category.rb +26 -0
  66. data/app/models/kublog/comment.rb +46 -0
  67. data/app/models/kublog/image.rb +23 -0
  68. data/app/models/kublog/post.rb +51 -0
  69. data/app/presenters/kublog/post_presenter.rb +23 -0
  70. data/app/presenters/kublog/posts_presenter.rb +29 -0
  71. data/app/uploaders/kublog/file_uploader.rb +56 -0
  72. data/app/views/kublog/post_mailer/new_post.html.erb +1 -0
  73. data/app/views/kublog/post_mailer/new_post.liquid.html.erb +7 -0
  74. data/app/views/kublog/posts/_email_form.html.erb +13 -0
  75. data/app/views/kublog/posts/_form.html.erb +71 -0
  76. data/app/views/kublog/posts/_image_form.html.erb +26 -0
  77. data/app/views/kublog/posts/edit.html.erb +3 -0
  78. data/app/views/kublog/posts/index.atom.builder +15 -0
  79. data/app/views/kublog/posts/index.html.erb +36 -0
  80. data/app/views/kublog/posts/new.html.erb +3 -0
  81. data/app/views/kublog/posts/show.html.erb +46 -0
  82. data/app/views/layouts/kublog/application.html.erb +14 -0
  83. data/config/locales/kublog/en.yml +54 -0
  84. data/config/routes.rb +13 -0
  85. data/db/migrate/20110816211552_create_kublog_posts.rb +27 -0
  86. data/db/migrate/20110817215828_create_kublog_images.rb +11 -0
  87. data/db/migrate/20110818181434_create_kublog_categories.rb +11 -0
  88. data/db/migrate/20110822194341_create_kublog_comments.rb +14 -0
  89. data/kublog.gemspec +39 -0
  90. data/lib/kublog.rb +92 -0
  91. data/lib/kublog/author.rb +13 -0
  92. data/lib/kublog/engine.rb +5 -0
  93. data/lib/kublog/notifiable.rb +26 -0
  94. data/lib/kublog/notification/email.rb +86 -0
  95. data/lib/kublog/notification/email_job.rb +14 -0
  96. data/lib/kublog/notification/fb_post.rb +43 -0
  97. data/lib/kublog/notification/fb_post_job.rb +16 -0
  98. data/lib/kublog/notification/tweet.rb +68 -0
  99. data/lib/kublog/notification/tweet_job.rb +16 -0
  100. data/lib/kublog/user_integration/common.rb +31 -0
  101. data/lib/kublog/user_integration/devise.rb +23 -0
  102. data/lib/kublog/version.rb +3 -0
  103. data/lib/kublog/xhr_upload/file_helper.rb +36 -0
  104. data/lib/tasks/kublog_tasks.rake +4 -0
  105. data/script/rails +6 -0
  106. data/test/dummy/Rakefile +7 -0
  107. data/test/dummy/app/assets/javascripts/application.js +9 -0
  108. data/test/dummy/app/assets/javascripts/sessions.js +2 -0
  109. data/test/dummy/app/assets/javascripts/users.js +2 -0
  110. data/test/dummy/app/assets/stylesheets/application.css +157 -0
  111. data/test/dummy/app/assets/stylesheets/sessions.css +4 -0
  112. data/test/dummy/app/assets/stylesheets/users.css +4 -0
  113. data/test/dummy/app/controllers/application_controller.rb +19 -0
  114. data/test/dummy/app/controllers/sessions_controller.rb +22 -0
  115. data/test/dummy/app/controllers/users_controller.rb +17 -0
  116. data/test/dummy/app/helpers/application_helper.rb +2 -0
  117. data/test/dummy/app/helpers/error_messages_helper.rb +23 -0
  118. data/test/dummy/app/helpers/layout_helper.rb +22 -0
  119. data/test/dummy/app/helpers/sessions_helper.rb +2 -0
  120. data/test/dummy/app/helpers/users_helper.rb +2 -0
  121. data/test/dummy/app/mailers/.gitkeep +0 -0
  122. data/test/dummy/app/models/.gitkeep +0 -0
  123. data/test/dummy/app/models/ability.rb +2 -0
  124. data/test/dummy/app/models/user.rb +25 -0
  125. data/test/dummy/app/views/layouts/_account.html.erb +8 -0
  126. data/test/dummy/app/views/layouts/application.html.erb +29 -0
  127. data/test/dummy/app/views/layouts/kublog/application.html.erb +31 -0
  128. data/test/dummy/app/views/sessions/new.html.erb +15 -0
  129. data/test/dummy/app/views/users/new.html.erb +28 -0
  130. data/test/dummy/config.ru +4 -0
  131. data/test/dummy/config/application.rb +42 -0
  132. data/test/dummy/config/boot.rb +10 -0
  133. data/test/dummy/config/database.yml +25 -0
  134. data/test/dummy/config/environment.rb +5 -0
  135. data/test/dummy/config/environments/development.rb +38 -0
  136. data/test/dummy/config/environments/production.rb +51 -0
  137. data/test/dummy/config/environments/test.rb +39 -0
  138. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  139. data/test/dummy/config/initializers/inflections.rb +10 -0
  140. data/test/dummy/config/initializers/mime_types.rb +5 -0
  141. data/test/dummy/config/initializers/secret_token.rb +7 -0
  142. data/test/dummy/config/initializers/session_store.rb +8 -0
  143. data/test/dummy/config/initializers/wrap_parameters.rb +12 -0
  144. data/test/dummy/config/locales/en.yml +54 -0
  145. data/test/dummy/config/routes.rb +13 -0
  146. data/test/dummy/db/migrate/20110816225222_create_users.rb +11 -0
  147. data/test/dummy/db/migrate/20110819135547_create_delayed_jobs.rb +21 -0
  148. data/test/dummy/db/schema.rb +96 -0
  149. data/test/dummy/lib/assets/.gitkeep +0 -0
  150. data/test/dummy/log/.gitkeep +0 -0
  151. data/test/dummy/public/404.html +26 -0
  152. data/test/dummy/public/422.html +26 -0
  153. data/test/dummy/public/500.html +26 -0
  154. data/test/dummy/public/favicon.ico +0 -0
  155. data/test/dummy/script/delayed_job +5 -0
  156. data/test/dummy/script/rails +6 -0
  157. data/test/dummy/test/fixtures/users.yml +9 -0
  158. data/test/dummy/test/functional/sessions_controller_test.rb +7 -0
  159. data/test/dummy/test/functional/users_controller_test.rb +7 -0
  160. data/test/dummy/test/unit/helpers/sessions_helper_test.rb +4 -0
  161. data/test/dummy/test/unit/helpers/users_helper_test.rb +4 -0
  162. data/test/dummy/test/unit/user_test.rb +7 -0
  163. data/test/factories.rb +9 -0
  164. data/test/fixtures/kublog/categories.yml +7 -0
  165. data/test/fixtures/kublog/comments.yml +7 -0
  166. data/test/fixtures/kublog/images.yml +9 -0
  167. data/test/fixtures/kublog/posts.yml +9 -0
  168. data/test/functional/kublog/categories_controller_test.rb +9 -0
  169. data/test/functional/kublog/comments_controller_test.rb +9 -0
  170. data/test/functional/kublog/images_controller_test.rb +9 -0
  171. data/test/functional/kublog/post_mailer_test.rb +9 -0
  172. data/test/functional/kublog/posts_controller_test.rb +9 -0
  173. data/test/integration/navigation_test.rb +10 -0
  174. data/test/kublog_test.rb +7 -0
  175. data/test/test_helper.rb +12 -0
  176. data/test/unit/helpers/kublog/categories_helper_test.rb +6 -0
  177. data/test/unit/helpers/kublog/comments_helper_test.rb +6 -0
  178. data/test/unit/helpers/kublog/images_helper_test.rb +6 -0
  179. data/test/unit/helpers/kublog/posts_helper_test.rb +6 -0
  180. data/test/unit/kublog/category_test.rb +9 -0
  181. data/test/unit/kublog/comment_test.rb +9 -0
  182. data/test/unit/kublog/image_test.rb +9 -0
  183. data/test/unit/kublog/post_test.rb +19 -0
  184. metadata +439 -0
@@ -0,0 +1,32 @@
1
+ $(document).ready ->
2
+
3
+ ## Notification Preview
4
+ $('#kublog .submit_fancybox').fancybox
5
+ showCloseButton: false
6
+ hideOnOverlayClick: false
7
+ onComplete: ->
8
+ textarea_html = $('#post_email_body').parent().html()
9
+ $('#post_email_body').data('prewysiwyg', textarea_html)
10
+ $('#post_email_body').wysiwyg(wysiwyg.email_controls)
11
+ onClosed: ->
12
+ $('form.post_form').submit() if $('#post_email_body').data('ready')?
13
+ textarea_html = $('#post_email_body').data('prewysiwyg')
14
+ $('#post_email_body').parent().html(textarea_html)
15
+
16
+ ## Calls Lightbox if User still decides to notify via E-mail
17
+ $('#kublog .post_form').submit ->
18
+ if $('#post_email_notify').attr('checked')? && not $('#post_email_body').data('ready')
19
+ $('#post_email_body').val($(this).data('post').email_body)
20
+ $('#link-to-email-template').click()
21
+ return false
22
+ else
23
+ return true
24
+
25
+ ## Confirms Notification text and readies for submission
26
+ $('#kublog #email_submit').click ->
27
+ $('#post_email_body').data('ready', true)
28
+ $.fancybox.close()
29
+
30
+ ## Aborts notification Submission
31
+ $('#kublog #email_cancel').click ->
32
+ $.fancybox.close()
@@ -0,0 +1,77 @@
1
+ $(document).ready ->
2
+
3
+ ### Triggers when clicking image on editor ###
4
+ $('#kublog .fancybox').fancybox
5
+ showCloseButton: false
6
+ hideOnOverlayClick: false
7
+
8
+ ## XHR Async Upload
9
+ $('#kublog input.upload').livequery ->
10
+ $(this).ajaxyUpload
11
+ url : "#{kublogPath}images.json"
12
+ success : (data) ->
13
+ $('#image_id').val(data.id)
14
+ $('#image_alt').val(data.alt)
15
+ $('#image-upload input').attr('disabled',false)
16
+ showUploadedImage(data.file)
17
+ enableSelect($('#image-upload select'), data)
18
+ setImageUrls(data.file)
19
+ console.log(data)
20
+ start : ->
21
+ $('#image-upload input.upload').attr('disabled',true)
22
+ console.log('Starts Uploading')
23
+ complete : ->
24
+ console.log('Finished Uploading')
25
+ error : ->
26
+ alert('Error uploading')
27
+
28
+ ## Inserts configured image into post body
29
+ $('#kublog #image-upload input[type=submit]').click ->
30
+ url = "#{kublogPath}images/#{$('#image_id').val()}.json"
31
+ attributes = {_method: 'put', image: { alt: $('#image_alt').val() } }
32
+ $.post url, attributes , (data) ->
33
+ image = { url: $('#image-upload option:selected').attr('data-url'), alt: data.alt }
34
+ $.wysiwyg.insertHtml $('#kublog #post_body'), imageTemplate(image)
35
+ resetUploadForm()
36
+ $.fancybox.close()
37
+
38
+ ## Resets Image Upload Form on cancel
39
+ $('#kublog #cancel-upload').click ->
40
+ return $.fancybox.close() if $('#image_id').val() is undefined or $('#image_id').val() is ''
41
+ $.post "#{kublogPath}images/#{$('#image_id').val()}.json", {_method: 'delete'}
42
+ resetUploadForm()
43
+ $.fancybox.close()
44
+
45
+ ### Helper Functions and Templates ###
46
+
47
+ showUploadedImage = (image)->
48
+ $('#image-upload img').attr('src', image.small.url)
49
+ $('#image-upload .container').append(linkTemplate(image))
50
+
51
+ setImageUrls = (image)->
52
+ $('#image-upload option[value=original]').attr('data-url', image.url)
53
+ $('#image-upload option[value=small]').attr('data-url', image.small.url)
54
+ $('#image-upload option[value=thumb]').attr('data-url', image.thumb.url)
55
+
56
+ enableSelect = ($select, data)->
57
+ $select.find('option:first').remove()
58
+ text = 'Insert Original'
59
+ dimensions = "(#{data.file_width}x#{data.file_height})"
60
+ $select.find('option:first').text("#{text} #{dimensions}")
61
+ $select.attr('disabled',false)
62
+
63
+ resetUploadForm = ->
64
+ $('#image-upload option').attr 'data-url', ''
65
+ $('#image-upload option:first').text 'Insert Original'
66
+ $('#image-upload select').prepend('<option></option>').attr('disabled',true).val('')
67
+ $('#image-upload small').remove()
68
+ $('#image-upload input[type=text]').val('').attr('disabled', true)
69
+ $('#image-upload input[type=file]').attr 'disabled', false
70
+ $('#image-upload img').attr 'src', "/assets#{kublogPath}missing_image.png"
71
+
72
+ # Templates
73
+ imageTemplate = (image) ->
74
+ "<p><img src='#{image.url}' alt='#{image.alt}' /></p>"
75
+
76
+ linkTemplate = (image) ->
77
+ "<small><a href='#{image.url}' target='_blank' style='display:block'>View Original</a></small>"
@@ -0,0 +1,44 @@
1
+ $(document).ready ->
2
+
3
+ ## Editor for Post Body
4
+ $('#kublog .editor').wysiwyg(wysiwyg.default_controls)
5
+
6
+ ### Twitter Char Counter Event ###
7
+ $('#kublog textarea[maxlength]').keyup(charCounter).keyup()
8
+
9
+ ### Twitter and Facebook Post Cloning Event ###
10
+ $('#kublog .original').keyup(mimicTitle).keyup()
11
+
12
+ ### Optional Hidden Fields (Currently E-mail notifications, Twitter and Facebook) ###
13
+ $('#kublog .trigger-optional').change ->
14
+ $optional = $(this).siblings('.optional')
15
+ if $(this).attr('checked')?
16
+ $optional.show().find('[disabled]').attr('disabled', false)
17
+ else
18
+ $optional.hide().find('textarea, input').attr('disabled', true)
19
+
20
+ ### Validates the form through AJAX on server Side ###
21
+ # check doesn't care if editing or creating new post
22
+ $('#kublog #create_post_button').click ->
23
+ resetErrors()
24
+ post_data = $(this).closest('form').first().serialize()
25
+ $.post "#{kublogPath}posts/check.json", post_data, (data) ->
26
+ $form = $('#kublog .post_form')
27
+ $form.data('post', data)
28
+ $form.submit()
29
+ return true
30
+ .error (response)->
31
+ errors = JSON.parse(response.responseText)
32
+ setErrors('post', errors)
33
+ return false
34
+
35
+ # Handle on Event
36
+
37
+ charCounter = ->
38
+ $chars_left_display = $(this).siblings('.chars_left')
39
+ actual_chars_left = parseInt($(this).attr('maxlength')) - $(this).val().length
40
+ $chars_left_display.html(actual_chars_left)
41
+
42
+ mimicTitle = -> $('#kublog .mimic').val($(this).val()).keyup()
43
+
44
+
@@ -0,0 +1,19 @@
1
+ # Global helpers should be used in comments as well
2
+ window.setErrors = (model, errors) ->
3
+ for attribute, error of errors
4
+ $label = $("label[for=#{model}_#{attribute}]")
5
+ $field = $("##{model}_#{attribute}}")
6
+ unless $label.size() is 0
7
+ $label.addClass('error')
8
+ $(errorTemplate(error[0])).insertAfter($label)
9
+ else
10
+ $field.addClass('error')
11
+ $(errorTemplate(error[0])).insertAfter($field)
12
+
13
+ window.resetErrors = ->
14
+ $('.error').removeClass('error')
15
+ $('small.error_description').remove()
16
+
17
+ window.errorTemplate = (error) -> "<small class='error_description'>#{error}</small>"
18
+
19
+ window.kublogPath = '<%= Kublog.root_path %>'
@@ -0,0 +1,68 @@
1
+ window.wysiwyg = { }
2
+
3
+ window.wysiwyg.default_controls =
4
+ controls:
5
+ bold : { visible : true }
6
+ italic : { visible : true }
7
+ insertOrderedList : { visible : true }
8
+ insertUnorderedList : { visible : true }
9
+ html : { visible: true }
10
+ createLink:
11
+ tooltip: "Create Link"
12
+ insertImage:
13
+ exec: -> $('#link-to-upload').click()
14
+ tooltip: "Insert image"
15
+ underline : { visible : false }
16
+ strikeThrough : { visible : false }
17
+ justifyLeft : { visible : false }
18
+ justifyCenter : { visible : false }
19
+ justifyRight : { visible : false }
20
+ justifyFull : { visible : false }
21
+ indent : { visible : false }
22
+ outdent : { visible : false }
23
+ subscript : { visible : false }
24
+ superscript : { visible : false }
25
+ undo : { visible : false }
26
+ redo : { visible : false }
27
+ insertHorizontalRule : { visible : false }
28
+ h1: {visible: false}
29
+ h4: {visible: false}
30
+ h5: {visible: false}
31
+ h6: {visible: false}
32
+ cut : { visible : false }
33
+ copy : { visible : false }
34
+ paste : { visible : false }
35
+ increaseFontSize : { visible : false }
36
+ decreaseFontSize : { visible : false }
37
+
38
+ window.wysiwyg.email_controls =
39
+ controls:
40
+ bold : { visible : true }
41
+ italic : { visible : true }
42
+ insertOrderedList : { visible : true }
43
+ insertUnorderedList : { visible : true }
44
+ html : { visible: true }
45
+ createLink: { tooltip: "Create Link" }
46
+ insertImage : { visible : false}
47
+ underline : { visible : false }
48
+ strikeThrough : { visible : false }
49
+ justifyLeft : { visible : false }
50
+ justifyCenter : { visible : false }
51
+ justifyRight : { visible : false }
52
+ justifyFull : { visible : false }
53
+ indent : { visible : false }
54
+ outdent : { visible : false }
55
+ subscript : { visible : false }
56
+ superscript : { visible : false }
57
+ undo : { visible : false }
58
+ redo : { visible : false }
59
+ insertHorizontalRule : { visible : false }
60
+ h1: {visible: false}
61
+ h4: {visible: false}
62
+ h5: {visible: false}
63
+ h6: {visible: false}
64
+ cut : { visible : false }
65
+ copy : { visible : false }
66
+ paste : { visible : false }
67
+ increaseFontSize : { visible : false }
68
+ decreaseFontSize : { visible : false }
@@ -0,0 +1,126 @@
1
+ /*
2
+ * jQuery XHR upload plugin
3
+ * http://github.com/maca
4
+ *
5
+ * Copyright 2011, Macario Ortega
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ *
8
+ */
9
+
10
+ (function($){
11
+ $.fn.ajaxyUpload = function(opts) {
12
+ var settings = {
13
+ error : $.noop,
14
+ success : $.noop,
15
+ start : $.noop
16
+ };
17
+
18
+ return $(this).each(function(){
19
+ var fileInput = $(this);
20
+ if (opts) { $.extend(settings, opts); }
21
+
22
+ // xhrUpload callback, this is triggered below only if the browser has hxr upload
23
+ // capabilities
24
+ fileInput.bind('xhrUpload', function(){
25
+ var self = this;
26
+ $.each(this.files, function(index, file){
27
+ var advance = $('<div>').addClass('inline-upload-advance');
28
+ var pBar = $('<div>').addClass('inline-upload-progress-bar').append(advance);
29
+
30
+ if ((advance.css('height').match(/\d/)[0]|0) == 0) { advance.css('height', '10px'); };
31
+ advance.css('background-color', advance.css('background-color') || '#33a');
32
+ advance.css('width', '0px');
33
+
34
+ if ((pBar.css('width').match(/\d/)[0]|0) == 0) { pBar.css('width', '200px'); };
35
+ pBar.css('background-color', pBar.css('background-color') || '#fff');
36
+ pBar.css('border', pBar.css('border') || '1px solid #BBB');
37
+
38
+ fileInput.after(pBar);
39
+
40
+ $.ajax({
41
+ type : "POST",
42
+ url : settings.url,
43
+ xhr : function(){
44
+ var xhr = $.ajaxSettings.xhr();
45
+ xhr.upload.onprogress = function(rpe) {
46
+ var progress = (rpe.loaded / rpe.total * 100 >> 0) + '%';
47
+ advance.css('width', progress);
48
+ };
49
+ xhr.onloadstart = function(){
50
+ settings.start.apply(self);
51
+ };
52
+ return xhr;
53
+ },
54
+ beforeSend : function(xhr){
55
+ // here we set custom headers for the rack middleware, first one tells the Rack app we are doing
56
+ // an xhr upload, the two others are self explanatory
57
+ xhr.setRequestHeader("X-XHR-Upload", "1");
58
+ xhr.setRequestHeader("X-File-Name", file.name || file.fileName);
59
+ xhr.setRequestHeader("X-File-Size", file.fileSize);
60
+ },
61
+ success : function(data, status, xhr) {
62
+ settings.success.apply(self, [data, status, xhr]);
63
+ },
64
+ error : function(xhr, text, error) {
65
+ if (xhr.status == 422) {
66
+ settings.error.apply(self, [$.parseJSON(xhr.responseText)]);
67
+ } else {
68
+ settings.error.apply(self);
69
+ };
70
+ },
71
+ complete : function(xhr, status) {
72
+ fileInput.after(fileInput.clone()).remove();
73
+ settings.complete.apply(self);
74
+ pBar.remove();
75
+ },
76
+ contentType : "application/octet-stream",
77
+ dataType : "json",
78
+ processData : false,
79
+ data : file,
80
+ });
81
+ });
82
+ });
83
+
84
+ // set an iframeUpload callback as fallback for older browsers
85
+ fileInput.bind('iframeUpload', function(){
86
+ var input = $("<input type='file' class='inline-upload-input'>").attr('name', $(this).attr('name'));
87
+ var iframe = $("<iframe class='inline-upload-catcher'>").hide().attr('name', 'inline-upload-catcher-' + new Date().getTime());
88
+ var spinner = $('<img>').attr('src', '/assets/kublog/ajaxyupload/images/ajax-loader.gif').addClass('spinner'); // TODO: don't use image.
89
+ var auth = $("<input type='hidden' name='authenticity_token'>").val($('[name=csrf-token]').attr('content')); // Rails authenticity token
90
+ var form = $("<form enctype='multipart/form-data' method='post'>").addClass('inline-upload-form').append(input).append(auth);
91
+ form.attr('target', iframe.attr('name'));
92
+
93
+ $(this).after(form).after(iframe).hide();
94
+
95
+ input.bind('complete', function(event, data){
96
+ if (data.errors) {
97
+ settings.error.apply(this, [data]);
98
+ } else {
99
+ settings.success.apply(this, [data]);
100
+ };
101
+ $(this).nextAll('.spinner').remove();
102
+ settings.complete.apply(this);
103
+ });
104
+
105
+ input.change(function(){
106
+ settings.start.apply(this);
107
+ $(this).after(spinner);
108
+ form.attr('action', settings.url).submit();
109
+ });
110
+
111
+ iframe.load(function(){
112
+ input.trigger('complete', [$.parseJSON($(this).contents().text())]);
113
+ });
114
+ });
115
+
116
+ // Not used just to check browser capabilities
117
+ var xhr = $.ajaxSettings.xhr();
118
+ // If the browser has xhr upload capabilities trigger xhrUpload otherwise fallback to iframe upload
119
+ if (this.files && xhr && xhr.upload && (xhr.upload.onprogress !== undefined)) {
120
+ fileInput.change(function(){ $(this).trigger('xhrUpload') });
121
+ } else {
122
+ fileInput.trigger('iframeUpload');
123
+ };
124
+ })
125
+ };
126
+ })(jQuery);
@@ -0,0 +1,46 @@
1
+ /*
2
+ * FancyBox - jQuery Plugin
3
+ * Simple and fancy lightbox alternative
4
+ *
5
+ * Examples and documentation at: http://fancybox.net
6
+ *
7
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
8
+ * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
9
+ *
10
+ * Version: 1.3.4 (11/11/2010)
11
+ * Requires: jQuery v1.3+
12
+ *
13
+ * Dual licensed under the MIT and GPL licenses:
14
+ * http://www.opensource.org/licenses/mit-license.php
15
+ * http://www.gnu.org/licenses/gpl.html
16
+ */
17
+
18
+ ;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("<div/>")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');
19
+ F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)||
20
+ c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick=
21
+ false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel",
22
+ function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("<img />").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+e.width+'" height="'+e.height+'"><param name="movie" value="'+c+
23
+ '"></param>';P="";b.each(e.swf,function(x,H){C+='<param name="'+x+'" value="'+H+'"></param>';P+=" "+x+'="'+H+'"'});C+='<embed src="'+c+'" type="application/x-shockwave-flash" width="'+e.width+'" height="'+e.height+'"'+P+"></embed></object>";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win==
24
+ "function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('<div style="width:'+a+";height:"+c+
25
+ ";overflow: "+(e.scrolling=="auto"?"auto":e.scrolling=="yes"?"scroll":"hidden")+';position:relative;"></div>');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor,
26
+ opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length?
27
+ d.titlePosition=="float"?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+s+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+d.titlePosition+'">'+s+"</div>":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding});
28
+ y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height==
29
+ i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents());
30
+ f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode==
31
+ 37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto");
32
+ s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(b.browser.msie?'allowtransparency="true""':"")+' scrolling="'+e.scrolling+'" src="'+d.href+'"></iframe>').appendTo(j);
33
+ f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c);
34
+ j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type==
35
+ "image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"),
36
+ 10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)};
37
+ b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k=
38
+ 0,C=a.length;k<C;k++)if(typeof a[k]=="object")b(a[k]).data("fancybox",b.extend({},g,a[k]));else a[k]=b({}).data("fancybox",b.extend({content:a[k]},g));o=jQuery.merge(o,a)}else{if(typeof a=="object")b(a).data("fancybox",b.extend({},g,a));else a=b({}).data("fancybox",b.extend({content:a},g));o.push(a)}if(q>o.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+
39
+ 1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a<l.length){q=a;I()}else if(d.cyclic&&l.length>1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h=
40
+ true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1;
41
+ b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5-
42
+ d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('<div id="fancybox-tmp"></div>'),t=b('<div id="fancybox-loading"><div></div></div>'),u=b('<div id="fancybox-overlay"></div>'),f=b('<div id="fancybox-wrap"></div>'));D=b('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(f);
43
+ D.append(j=b('<div id="fancybox-content"></div>'),E=b('<a id="fancybox-close"></a>'),n=b('<div id="fancybox-title"></div>'),z=b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),A=b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()});
44
+ b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(D)}}};
45
+ b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
46
+ easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery);