muck-profiles 0.1.16 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/README.rdoc +104 -2
  2. data/Rakefile +2 -0
  3. data/VERSION +1 -1
  4. data/app/controllers/muck/profiles_controller.rb +1 -1
  5. data/app/helpers/muck_profiles_helper.rb +14 -0
  6. data/app/views/profiles/_form.html.erb +2 -1
  7. data/app/views/profiles/_location_suggestion.html.erb +12 -0
  8. data/db/migrate/20091124203137_add_location_to_profiles.rb +15 -0
  9. data/db/migrate/20091124205819_add_fields_to_profiles.rb +21 -0
  10. data/lib/active_record/acts/muck_profile.rb +53 -1
  11. data/lib/active_record/has/muck_profile.rb +0 -2
  12. data/locales/en.yml +16 -1
  13. data/muck-profiles.gemspec +144 -3
  14. data/test/rails_root/.gitignore +2 -1
  15. data/test/rails_root/config/database.yml +12 -12
  16. data/test/rails_root/config/environment.rb +1 -0
  17. data/test/rails_root/config/{global_config.yml → global_config.example.yml} +1 -1
  18. data/test/rails_root/config/initializers/geokit_config.rb +61 -0
  19. data/test/rails_root/db/migrate/20090402234137_create_languages.rb +18 -0
  20. data/test/rails_root/db/migrate/20090426041056_create_countries.rb +15 -0
  21. data/test/rails_root/db/migrate/20090426041103_create_states.rb +18 -0
  22. data/test/rails_root/db/migrate/20091124203137_add_location_to_profiles.rb +15 -0
  23. data/test/rails_root/db/migrate/20091124205819_add_fields_to_profiles.rb +21 -0
  24. data/test/rails_root/lib/tasks/muck.rake +7 -0
  25. data/test/rails_root/public/images/arrow_down.gif +0 -0
  26. data/test/rails_root/public/images/arrow_up.gif +0 -0
  27. data/test/rails_root/public/images/fancybox/fancy_closebox.png +0 -0
  28. data/test/rails_root/public/images/fancybox/fancy_left.png +0 -0
  29. data/test/rails_root/public/images/fancybox/fancy_progress.png +0 -0
  30. data/test/rails_root/public/images/fancybox/fancy_right.png +0 -0
  31. data/test/rails_root/public/images/fancybox/fancy_shadow_e.png +0 -0
  32. data/test/rails_root/public/images/fancybox/fancy_shadow_n.png +0 -0
  33. data/test/rails_root/public/images/fancybox/fancy_shadow_ne.png +0 -0
  34. data/test/rails_root/public/images/fancybox/fancy_shadow_nw.png +0 -0
  35. data/test/rails_root/public/images/fancybox/fancy_shadow_s.png +0 -0
  36. data/test/rails_root/public/images/fancybox/fancy_shadow_se.png +0 -0
  37. data/test/rails_root/public/images/fancybox/fancy_shadow_sw.png +0 -0
  38. data/test/rails_root/public/images/fancybox/fancy_shadow_w.png +0 -0
  39. data/test/rails_root/public/images/fancybox/fancy_title_left.png +0 -0
  40. data/test/rails_root/public/images/fancybox/fancy_title_main.png +0 -0
  41. data/test/rails_root/public/images/fancybox/fancy_title_right.png +0 -0
  42. data/test/rails_root/public/images/icons/blue_guy.png +0 -0
  43. data/test/rails_root/public/images/icons/button_background.png +0 -0
  44. data/test/rails_root/public/images/icons/cancel.png +0 -0
  45. data/test/rails_root/public/images/icons/close.png +0 -0
  46. data/test/rails_root/public/images/icons/comment.png +0 -0
  47. data/test/rails_root/public/images/icons/exclaim.png +0 -0
  48. data/test/rails_root/public/images/icons/external.png +0 -0
  49. data/test/rails_root/public/images/icons/feed.png +0 -0
  50. data/test/rails_root/public/images/icons/grey_guy.png +0 -0
  51. data/test/rails_root/public/images/icons/hide.png +0 -0
  52. data/test/rails_root/public/images/icons/information.png +0 -0
  53. data/test/rails_root/public/images/icons/minus.png +0 -0
  54. data/test/rails_root/public/images/icons/pending.png +0 -0
  55. data/test/rails_root/public/images/icons/question.png +0 -0
  56. data/test/rails_root/public/images/icons/search_box.png +0 -0
  57. data/test/rails_root/public/images/icons/star.png +0 -0
  58. data/test/rails_root/public/images/icons/stop.png +0 -0
  59. data/test/rails_root/public/images/icons/thumb_down.png +0 -0
  60. data/test/rails_root/public/images/icons/thumb_up.png +0 -0
  61. data/test/rails_root/public/images/nothing.png +0 -0
  62. data/test/rails_root/public/javascripts/jquery/colorpicker.js +450 -0
  63. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.js.readme +6 -0
  64. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.min.js +15 -0
  65. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.pack.js +767 -0
  66. data/test/rails_root/public/javascripts/jquery/jquery.easing.js +1 -0
  67. data/test/rails_root/public/javascripts/jquery/jquery.fancybox.js +9 -0
  68. data/test/rails_root/public/javascripts/jquery/jquery.metadata.min.js +13 -0
  69. data/test/rails_root/public/javascripts/jquery/jquery.queryString.js +33 -0
  70. data/test/rails_root/public/javascripts/jquery/jquery.swapimage.js +66 -0
  71. data/test/rails_root/public/javascripts/jquery/jquery.swapimage.min.js +11 -0
  72. data/test/rails_root/public/javascripts/jquery/jrails.js +1 -0
  73. data/test/rails_root/public/javascripts/muck.js +11 -6
  74. data/test/rails_root/public/javascripts/muck_time/en.js +53 -0
  75. data/test/rails_root/public/javascripts/tree.js +107 -0
  76. data/test/rails_root/public/stylesheets/jquery/jquery.autocomplete.css +15 -0
  77. data/test/rails_root/public/stylesheets/jquery/jquery.fancybox.css +44 -0
  78. data/test/rails_root/public/stylesheets/styles.css +10 -3
  79. data/test/rails_root/vendor/plugins/geokit-rails/CHANGELOG.rdoc +46 -0
  80. data/test/rails_root/vendor/plugins/geokit-rails/MIT-LICENSE +20 -0
  81. data/test/rails_root/vendor/plugins/geokit-rails/README.markdown +561 -0
  82. data/test/rails_root/vendor/plugins/geokit-rails/Rakefile +18 -0
  83. data/test/rails_root/vendor/plugins/geokit-rails/about.yml +9 -0
  84. data/test/rails_root/vendor/plugins/geokit-rails/assets/api_keys_template +61 -0
  85. data/test/rails_root/vendor/plugins/geokit-rails/init.rb +1 -0
  86. data/test/rails_root/vendor/plugins/geokit-rails/install.rb +14 -0
  87. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails.rb +26 -0
  88. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/acts_as_mappable.rb +456 -0
  89. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/abstract.rb +31 -0
  90. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/mysql.rb +22 -0
  91. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/postgresql.rb +22 -0
  92. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/sqlserver.rb +43 -0
  93. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/defaults.rb +22 -0
  94. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/geocoder_control.rb +16 -0
  95. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/ip_geocode_lookup.rb +46 -0
  96. data/test/rails_root/vendor/plugins/geokit-rails/test/acts_as_mappable_test.rb +474 -0
  97. data/test/rails_root/vendor/plugins/geokit-rails/test/boot.rb +25 -0
  98. data/test/rails_root/vendor/plugins/geokit-rails/test/database.yml +20 -0
  99. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/companies.yml +7 -0
  100. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/custom_locations.yml +54 -0
  101. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/locations.yml +54 -0
  102. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_addresses.yml +17 -0
  103. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_families.yml +2 -0
  104. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_houses.yml +9 -0
  105. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_organizations.yml +5 -0
  106. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_people.yml +5 -0
  107. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/stores.yml +0 -0
  108. data/test/rails_root/vendor/plugins/geokit-rails/test/ip_geocode_lookup_test.rb +77 -0
  109. data/test/rails_root/vendor/plugins/geokit-rails/test/models/company.rb +3 -0
  110. data/test/rails_root/vendor/plugins/geokit-rails/test/models/custom_location.rb +12 -0
  111. data/test/rails_root/vendor/plugins/geokit-rails/test/models/location.rb +4 -0
  112. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_address.rb +4 -0
  113. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_family.rb +3 -0
  114. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_house.rb +3 -0
  115. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_organization.rb +4 -0
  116. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_person.rb +4 -0
  117. data/test/rails_root/vendor/plugins/geokit-rails/test/models/store.rb +3 -0
  118. data/test/rails_root/vendor/plugins/geokit-rails/test/schema.rb +60 -0
  119. data/test/rails_root/vendor/plugins/geokit-rails/test/tasks.rake +31 -0
  120. data/test/rails_root/vendor/plugins/geokit-rails/test/test_helper.rb +23 -0
  121. metadata +158 -3
@@ -5,4 +5,5 @@ db/*.sqlite3
5
5
  public/system
6
6
  *.DS_Store
7
7
  coverage/*
8
- *.swp
8
+ *.swp
9
+ global_config.yml
@@ -1,14 +1,14 @@
1
1
  development:
2
- adapter: sqlite3
3
- database: db/development.sqlite3
4
- timeout: 5000
5
-
2
+ adapter: mysql
3
+ database: muck_profiles_development
4
+ username: root
5
+ password:
6
+ host: localhost
7
+ encoding: utf8
6
8
  test:
7
- adapter: sqlite3
8
- database: db/test.sqlite3
9
- timeout: 5000
10
-
11
- production:
12
- adapter: sqlite3
13
- database: db/production.sqlite3
14
- timeout: 5000
9
+ adapter: mysql
10
+ database: muck_profiles_test
11
+ username: root
12
+ password:
13
+ host: localhost
14
+ encoding: utf8
@@ -17,6 +17,7 @@ Rails::Initializer.run do |config|
17
17
  config.time_zone = 'UTC'
18
18
  config.gem "authlogic"
19
19
  config.gem "searchlogic"
20
+ config.gem 'geokit'
20
21
  config.gem 'will_paginate'
21
22
  config.gem "bcrypt-ruby", :lib => "bcrypt"
22
23
  config.gem 'paperclip'
@@ -5,7 +5,7 @@ default: &DEFAULT
5
5
  application_url: localhost:3000
6
6
 
7
7
  # session key information
8
- session_key: _uploader_session
8
+ session_key: _profile_session
9
9
  session_secret: ea55c4d5e105735fdfb1caec46711b3dd14ec976d0ba95b4c0f575cb046cc358bce7a335ee36eb29253fb680ef8b838d871f6baeff48220fee8e9e42ab84774b
10
10
 
11
11
  production:
@@ -0,0 +1,61 @@
1
+ if defined? Geokit
2
+
3
+ # These defaults are used in Geokit::Mappable.distance_to and in acts_as_mappable
4
+ Geokit::default_units = :miles
5
+ Geokit::default_formula = :sphere
6
+
7
+ # This is the timeout value in seconds to be used for calls to the geocoder web
8
+ # services. For no timeout at all, comment out the setting. The timeout unit
9
+ # is in seconds.
10
+ Geokit::Geocoders::request_timeout = 3
11
+
12
+ # These settings are used if web service calls must be routed through a proxy.
13
+ # These setting can be nil if not needed, otherwise, addr and port must be
14
+ # filled in at a minimum. If the proxy requires authentication, the username
15
+ # and password can be provided as well.
16
+ Geokit::Geocoders::proxy_addr = nil
17
+ Geokit::Geocoders::proxy_port = nil
18
+ Geokit::Geocoders::proxy_user = nil
19
+ Geokit::Geocoders::proxy_pass = nil
20
+
21
+ # This is your yahoo application key for the Yahoo Geocoder.
22
+ # See http://developer.yahoo.com/faq/index.html#appid
23
+ # and http://developer.yahoo.com/maps/rest/V1/geocode.html
24
+ Geokit::Geocoders::yahoo = GlobalConfig.yahoo_geo_key
25
+
26
+ # This is your Google Maps geocoder key.
27
+ # See http://www.google.com/apis/maps/signup.html
28
+ # and http://www.google.com/apis/maps/documentation/#Geocoding_Examples
29
+ Geokit::Geocoders::google = GlobalConfig.google_geo_key
30
+
31
+ # This is your username and password for geocoder.us.
32
+ # To use the free service, the value can be set to nil or false. For
33
+ # usage tied to an account, the value should be set to username:password.
34
+ # See http://geocoder.us
35
+ # and http://geocoder.us/user/signup
36
+ Geokit::Geocoders::geocoder_us = false
37
+
38
+ # This is your authorization key for geocoder.ca.
39
+ # To use the free service, the value can be set to nil or false. For
40
+ # usage tied to an account, set the value to the key obtained from
41
+ # Geocoder.ca.
42
+ # See http://geocoder.ca
43
+ # and http://geocoder.ca/?register=1
44
+ Geokit::Geocoders::geocoder_ca = false
45
+
46
+ # Uncomment to use a username with the Geonames geocoder
47
+ #Geokit::Geocoders::geonames="REPLACE_WITH_YOUR_GEONAMES_USERNAME"
48
+
49
+ # This is the order in which the geocoders are called in a failover scenario
50
+ # If you only want to use a single geocoder, put a single symbol in the array.
51
+ # Valid symbols are :google, :yahoo, :us, and :ca.
52
+ # Be aware that there are Terms of Use restrictions on how you can use the
53
+ # various geocoders. Make sure you read up on relevant Terms of Use for each
54
+ # geocoder you are going to use.
55
+ Geokit::Geocoders::provider_order = [:google,:us]
56
+
57
+ # The IP provider order. Valid symbols are :ip,:geo_plugin.
58
+ # As before, make sure you read up on relevant Terms of Use for each
59
+ # Geokit::Geocoders::ip_provider_order = [:geo_plugin,:ip]
60
+
61
+ end
@@ -0,0 +1,18 @@
1
+ class CreateLanguages < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :languages, :force => true do |t|
4
+ t.string :name
5
+ t.string :english_name
6
+ t.string :locale
7
+ t.boolean :supported, :default => true
8
+ t.boolean :is_default, :default => false
9
+ end
10
+ add_index :languages, :name
11
+ add_index :languages, :locale
12
+ end
13
+
14
+ def self.down
15
+ drop_table :languages
16
+ end
17
+
18
+ end
@@ -0,0 +1,15 @@
1
+ class CreateCountries < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :countries, :force => true do |t|
4
+ t.string "name", :limit => 128, :default => "", :null => false
5
+ t.string "abbreviation", :limit => 3, :default => "", :null => false
6
+ t.integer "sort", :default => 1000, :null => false
7
+ end
8
+ add_index :countries, :name
9
+ add_index :countries, :abbreviation
10
+ end
11
+
12
+ def self.down
13
+ drop_table :countries
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ class CreateStates < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :states, :force => true do |t|
4
+ t.string "name", :limit => 128, :default => "", :null => false
5
+ t.string "abbreviation", :limit => 3, :default => "", :null => false
6
+ t.integer "country_id", :limit => 8, :null => false
7
+ end
8
+
9
+ add_index :states, :country_id
10
+ add_index :states, :name
11
+ add_index :states, :abbreviation
12
+
13
+ end
14
+
15
+ def self.down
16
+ drop_table :states
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ class AddLocationToProfiles < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :profiles, :location, :string
4
+ add_column :profiles, :lat, :decimal, :precision => 15, :scale => 10
5
+ add_column :profiles, :lng, :decimal, :precision => 15, :scale => 10
6
+ add_index :profiles, [:lat, :lng]
7
+ end
8
+
9
+ def self.down
10
+ remove_index :profiles, [:lat, :lng]
11
+ remove_column :profiles, :location
12
+ remove_column :profiles, :lat
13
+ remove_column :profiles, :lng
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class AddFieldsToProfiles < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :profiles, :about, :text
4
+ add_column :profiles, :first_name, :string
5
+ add_column :profiles, :last_name, :string
6
+ add_column :profiles, :city, :string
7
+ add_column :profiles, :state_id, :integer
8
+ add_column :profiles, :country_id, :integer
9
+ add_column :profiles, :language_id, :integer
10
+ end
11
+
12
+ def self.down
13
+ remove_column :profiles, :about
14
+ remove_column :profiles, :first_name
15
+ remove_column :profiles, :last_name
16
+ remove_column :profiles, :city
17
+ remove_column :profiles, :state_id
18
+ remove_column :profiles, :country_id
19
+ remove_column :profiles, :language_id
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ namespace :muck do
2
+
3
+ def muck_gems
4
+ ['babelphish', 'uploader', 'muck-engine', 'muck-users']
5
+ end
6
+
7
+ end
@@ -0,0 +1,450 @@
1
+ /**
2
+ *
3
+ * Color picker
4
+ * Author: Stefan Petre www.eyecon.ro
5
+ *
6
+ */
7
+ (function ($) {
8
+ var ColorPicker = function () {
9
+ var
10
+ ids = {},
11
+ inAction,
12
+ charMin = 65,
13
+ visible,
14
+ tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
15
+ defaults = {
16
+ eventName: 'click',
17
+ onShow: function () {},
18
+ onBeforeShow: function(){},
19
+ onHide: function () {},
20
+ onChange: function () {},
21
+ onSubmit: function () {},
22
+ color: 'ff0000',
23
+ livePreview: true,
24
+ flat: false
25
+ },
26
+ fillRGBFields = function (hsb, cal) {
27
+ var rgb = HSBToRGB(hsb);
28
+ $(cal).data('colorpicker').fields
29
+ .eq(1).val(rgb.r).end()
30
+ .eq(2).val(rgb.g).end()
31
+ .eq(3).val(rgb.b).end();
32
+ },
33
+ fillHSBFields = function (hsb, cal) {
34
+ $(cal).data('colorpicker').fields
35
+ .eq(4).val(hsb.h).end()
36
+ .eq(5).val(hsb.s).end()
37
+ .eq(6).val(hsb.b).end();
38
+ },
39
+ fillHexFields = function (hsb, cal) {
40
+ $(cal).data('colorpicker').fields
41
+ .eq(0).val(HSBToHex(hsb)).end();
42
+ },
43
+ setSelector = function (hsb, cal) {
44
+ $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
45
+ $(cal).data('colorpicker').selectorIndic.css({
46
+ left: parseInt(150 * hsb.s/100, 10),
47
+ top: parseInt(150 * (100-hsb.b)/100, 10)
48
+ });
49
+ },
50
+ setHue = function (hsb, cal) {
51
+ $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
52
+ },
53
+ setCurrentColor = function (hsb, cal) {
54
+ $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
55
+ },
56
+ setNewColor = function (hsb, cal) {
57
+ $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
58
+ },
59
+ keyDown = function (ev) {
60
+ var pressedKey = ev.charCode || ev.keyCode || -1;
61
+ if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
62
+ return false;
63
+ }
64
+ var cal = $(this).parent().parent();
65
+ if (cal.data('colorpicker').livePreview === true) {
66
+ change.apply(this);
67
+ }
68
+ },
69
+ change = function (ev) {
70
+ var cal = $(this).parent().parent(), col;
71
+ if (this.parentNode.className.indexOf('_hex') > 0) {
72
+ cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
73
+ } else if (this.parentNode.className.indexOf('_hsb') > 0) {
74
+ cal.data('colorpicker').color = col = fixHSB({
75
+ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
76
+ s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
77
+ b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
78
+ });
79
+ } else {
80
+ cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
81
+ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
82
+ g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
83
+ b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
84
+ }));
85
+ }
86
+ if (ev) {
87
+ fillRGBFields(col, cal.get(0));
88
+ fillHexFields(col, cal.get(0));
89
+ fillHSBFields(col, cal.get(0));
90
+ }
91
+ setSelector(col, cal.get(0));
92
+ setHue(col, cal.get(0));
93
+ setNewColor(col, cal.get(0));
94
+ cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
95
+ },
96
+ blur = function (ev) {
97
+ var cal = $(this).parent().parent();
98
+ cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus')
99
+ },
100
+ focus = function () {
101
+ charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
102
+ $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
103
+ $(this).parent().addClass('colorpicker_focus');
104
+ },
105
+ downIncrement = function (ev) {
106
+ var field = $(this).parent().find('input').focus();
107
+ var current = {
108
+ el: $(this).parent().addClass('colorpicker_slider'),
109
+ max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
110
+ y: ev.pageY,
111
+ field: field,
112
+ val: parseInt(field.val(), 10),
113
+ preview: $(this).parent().parent().data('colorpicker').livePreview
114
+ };
115
+ $(document).bind('mouseup', current, upIncrement);
116
+ $(document).bind('mousemove', current, moveIncrement);
117
+ },
118
+ moveIncrement = function (ev) {
119
+ ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
120
+ if (ev.data.preview) {
121
+ change.apply(ev.data.field.get(0), [true]);
122
+ }
123
+ return false;
124
+ },
125
+ upIncrement = function (ev) {
126
+ change.apply(ev.data.field.get(0), [true]);
127
+ ev.data.el.removeClass('colorpicker_slider').find('input').focus();
128
+ $(document).unbind('mouseup', upIncrement);
129
+ $(document).unbind('mousemove', moveIncrement);
130
+ return false;
131
+ },
132
+ downHue = function (ev) {
133
+ var current = {
134
+ cal: $(this).parent(),
135
+ y: $(this).offset().top
136
+ };
137
+ current.preview = current.cal.data('colorpicker').livePreview;
138
+ $(document).bind('mouseup', current, upHue);
139
+ $(document).bind('mousemove', current, moveHue);
140
+ },
141
+ moveHue = function (ev) {
142
+ change.apply(
143
+ ev.data.cal.data('colorpicker')
144
+ .fields
145
+ .eq(4)
146
+ .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
147
+ .get(0),
148
+ [ev.data.preview]
149
+ );
150
+ return false;
151
+ },
152
+ upHue = function (ev) {
153
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
154
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
155
+ $(document).unbind('mouseup', upHue);
156
+ $(document).unbind('mousemove', moveHue);
157
+ return false;
158
+ },
159
+ downSelector = function (ev) {
160
+ var current = {
161
+ cal: $(this).parent(),
162
+ pos: $(this).offset()
163
+ };
164
+ current.preview = current.cal.data('colorpicker').livePreview;
165
+ $(document).bind('mouseup', current, upSelector);
166
+ $(document).bind('mousemove', current, moveSelector);
167
+ },
168
+ moveSelector = function (ev) {
169
+ change.apply(
170
+ ev.data.cal.data('colorpicker')
171
+ .fields
172
+ .eq(6)
173
+ .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
174
+ .end()
175
+ .eq(5)
176
+ .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
177
+ .get(0),
178
+ [ev.data.preview]
179
+ );
180
+ return false;
181
+ },
182
+ upSelector = function (ev) {
183
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
184
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
185
+ $(document).unbind('mouseup', upSelector);
186
+ $(document).unbind('mousemove', moveSelector);
187
+ return false;
188
+ },
189
+ enterSubmit = function (ev) {
190
+ $(this).addClass('colorpicker_focus');
191
+ },
192
+ leaveSubmit = function (ev) {
193
+ $(this).removeClass('colorpicker_focus');
194
+ },
195
+ clickSubmit = function (ev) {
196
+ var cal = $(this).parent();
197
+ var col = cal.data('colorpicker').color;
198
+ cal.data('colorpicker').origColor = col;
199
+ setCurrentColor(col, cal.get(0));
200
+ cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col));
201
+ },
202
+ show = function (ev) {
203
+ var cal = $('#' + $(this).data('colorpickerId'));
204
+ cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
205
+ var pos = $(this).offset();
206
+ var viewPort = getViewport();
207
+ var top = pos.top + this.offsetHeight;
208
+ var left = pos.left;
209
+ if (top + 176 > viewPort.t + viewPort.h) {
210
+ top -= this.offsetHeight + 176;
211
+ }
212
+ if (left + 356 > viewPort.l + viewPort.w) {
213
+ left -= 356;
214
+ }
215
+ cal.css({left: left + 'px', top: top + 'px'});
216
+ if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
217
+ cal.show();
218
+ }
219
+ $(document).bind('mousedown', {cal: cal}, hide);
220
+ return false;
221
+ },
222
+ hide = function (ev) {
223
+ if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
224
+ if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
225
+ ev.data.cal.hide();
226
+ }
227
+ $(document).unbind('mousedown', hide);
228
+ }
229
+ },
230
+ isChildOf = function(parentEl, el, container) {
231
+ if (parentEl == el) {
232
+ return true;
233
+ }
234
+ if (parentEl.contains) {
235
+ return parentEl.contains(el);
236
+ }
237
+ if ( parentEl.compareDocumentPosition ) {
238
+ return !!(parentEl.compareDocumentPosition(el) & 16);
239
+ }
240
+ var prEl = el.parentNode;
241
+ while(prEl && prEl != container) {
242
+ if (prEl == parentEl)
243
+ return true;
244
+ prEl = prEl.parentNode;
245
+ }
246
+ return false;
247
+ },
248
+ getViewport = function () {
249
+ var m = document.compatMode == 'CSS1Compat';
250
+ return {
251
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
252
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
253
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
254
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
255
+ };
256
+ },
257
+ fixHSB = function (hsb) {
258
+ return {
259
+ h: Math.min(360, Math.max(0, hsb.h)),
260
+ s: Math.min(100, Math.max(0, hsb.s)),
261
+ b: Math.min(100, Math.max(0, hsb.b))
262
+ };
263
+ },
264
+ fixRGB = function (rgb) {
265
+ return {
266
+ r: Math.min(255, Math.max(0, rgb.r)),
267
+ g: Math.min(255, Math.max(0, rgb.g)),
268
+ b: Math.min(255, Math.max(0, rgb.b))
269
+ };
270
+ },
271
+ fixHex = function (hex) {
272
+ var len = 6 - hex.length;
273
+ if (len > 0) {
274
+ var o = [];
275
+ for (var i=0; i<len; i++) {
276
+ o.push('0');
277
+ }
278
+ o.push(hex);
279
+ hex = o.join('');
280
+ }
281
+ return hex;
282
+ },
283
+ HexToRGB = function (hex) {
284
+ var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
285
+ return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
286
+ },
287
+ HexToHSB = function (hex) {
288
+ return RGBToHSB(HexToRGB(hex));
289
+ },
290
+ RGBToHSB = function (rgb) {
291
+ var hsb = {};
292
+ hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b);
293
+ hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b);
294
+ hsb.b = Math.round((hsb.b /255)*100);
295
+ if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0;
296
+ else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b);
297
+ else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60 + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b);
298
+ else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r);
299
+ else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r);
300
+ else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g);
301
+ else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g);
302
+ else hsb.h = 0;
303
+ hsb.h = Math.round(hsb.h);
304
+ return hsb;
305
+ },
306
+ HSBToRGB = function (hsb) {
307
+ var rgb = {};
308
+ var h = Math.round(hsb.h);
309
+ var s = Math.round(hsb.s*255/100);
310
+ var v = Math.round(hsb.b*255/100);
311
+ if(s == 0) {
312
+ rgb.r = rgb.g = rgb.b = v;
313
+ } else {
314
+ var t1 = v;
315
+ var t2 = (255-s)*v/255;
316
+ var t3 = (t1-t2)*(h%60)/60;
317
+ if(h==360) h = 0;
318
+ if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
319
+ else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
320
+ else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
321
+ else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
322
+ else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
323
+ else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
324
+ else {rgb.r=0; rgb.g=0; rgb.b=0}
325
+ }
326
+ return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
327
+ },
328
+ RGBToHex = function (rgb) {
329
+ var hex = [
330
+ rgb.r.toString(16),
331
+ rgb.g.toString(16),
332
+ rgb.b.toString(16)
333
+ ];
334
+ $.each(hex, function (nr, val) {
335
+ if (val.length == 1) {
336
+ hex[nr] = '0' + val;
337
+ }
338
+ });
339
+ return hex.join('');
340
+ },
341
+ HSBToHex = function (hsb) {
342
+ return RGBToHex(HSBToRGB(hsb));
343
+ };
344
+ return {
345
+ init: function (options) {
346
+ options = $.extend({}, defaults, options||{});
347
+ if (typeof options.color == 'string') {
348
+ options.color = HexToHSB(options.color);
349
+ } else if (options.color.r != undefined && options.color.g != undefined && options.color.b != undefined) {
350
+ options.color = RGBToHSB(options.color);
351
+ } else if (options.color.h != undefined && options.color.s != undefined && options.color.b != undefined) {
352
+ options.color = fixHSB(options.color);
353
+ } else {
354
+ return this;
355
+ }
356
+ options.origColor = options.color;
357
+ return this.each(function () {
358
+ if (!$(this).data('colorpickerId')) {
359
+ var id = 'collorpicker_' + parseInt(Math.random() * 1000);
360
+ $(this).data('colorpickerId', id);
361
+ var cal = $(tpl).attr('id', id);
362
+ if (options.flat) {
363
+ cal.appendTo(this).show();
364
+ } else {
365
+ cal.appendTo(document.body);
366
+ }
367
+ options.fields = cal
368
+ .find('input')
369
+ .bind('keydown', keyDown)
370
+ .bind('change', change)
371
+ .bind('blur', blur)
372
+ .bind('focus', focus);
373
+ cal.find('span').bind('mousedown', downIncrement);
374
+ options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
375
+ options.selectorIndic = options.selector.find('div div');
376
+ options.hue = cal.find('div.colorpicker_hue div');
377
+ cal.find('div.colorpicker_hue').bind('mousedown', downHue);
378
+ options.newColor = cal.find('div.colorpicker_new_color');
379
+ options.currentColor = cal.find('div.colorpicker_current_color');
380
+ cal.data('colorpicker', options);
381
+ cal.find('div.colorpicker_submit')
382
+ .bind('mouseenter', enterSubmit)
383
+ .bind('mouseleave', leaveSubmit)
384
+ .bind('click', clickSubmit);
385
+ fillRGBFields(options.color, cal.get(0));
386
+ fillHSBFields(options.color, cal.get(0));
387
+ fillHexFields(options.color, cal.get(0));
388
+ setHue(options.color, cal.get(0));
389
+ setSelector(options.color, cal.get(0));
390
+ setCurrentColor(options.color, cal.get(0));
391
+ setNewColor(options.color, cal.get(0));
392
+ if (options.flat) {
393
+ cal.css({
394
+ position: 'relative',
395
+ display: 'block'
396
+ });
397
+ } else {
398
+ $(this).bind(options.eventName, show);
399
+ }
400
+ }
401
+ });
402
+ },
403
+ showPicker: function() {
404
+ return this.each( function () {
405
+ if ($(this).data('colorpickerId')) {
406
+ show.apply(this);
407
+ }
408
+ });
409
+ },
410
+ hidePicker: function() {
411
+ return this.each( function () {
412
+ if ($(this).data('colorpickerId')) {
413
+ $('#' + $(this).data('colorpickerId')).hide();
414
+ }
415
+ });
416
+ },
417
+ setColor: function(col) {
418
+ if (typeof col == 'string') {
419
+ col = HexToHSB(col);
420
+ } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
421
+ col = RGBToHSB(col);
422
+ } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
423
+ col = fixHSB(col);
424
+ } else {
425
+ return this;
426
+ }
427
+ return this.each(function(){
428
+ if ($(this).data('colorpickerId')) {
429
+ var cal = $('#' + $(this).data('colorpickerId'));
430
+ cal.data('colorpicker').color = col;
431
+ cal.data('colorpicker').origColor = col;
432
+ fillRGBFields(col, cal.get(0));
433
+ fillHSBFields(col, cal.get(0));
434
+ fillHexFields(col, cal.get(0));
435
+ setHue(col, cal.get(0));
436
+ setSelector(col, cal.get(0));
437
+ setCurrentColor(col, cal.get(0));
438
+ setNewColor(col, cal.get(0));
439
+ }
440
+ });
441
+ }
442
+ };
443
+ }();
444
+ $.fn.extend({
445
+ ColorPicker: ColorPicker.init,
446
+ ColorPickerHide: ColorPicker.hide,
447
+ ColorPickerShow: ColorPicker.show,
448
+ ColorPickerSetColor: ColorPicker.setColor
449
+ });
450
+ })(jQuery)