friends_ajax_core 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/icons-16/icon-arrow-down-hover.png +0 -0
  3. data/app/assets/images/icons-16/icon-arrow-down.png +0 -0
  4. data/app/assets/images/icons-16/icon-arrow-right-hover.png +0 -0
  5. data/app/assets/images/icons-16/icon-arrow-right.png +0 -0
  6. data/app/assets/images/icons/icon-close.png +0 -0
  7. data/app/assets/images/icons/loader-16.png +0 -0
  8. data/app/assets/images/icons/loader-24.png +0 -0
  9. data/app/assets/images/menu/alpha-bg-60.png +0 -0
  10. data/app/assets/images/menu/alpha-bg-75.png +0 -0
  11. data/app/assets/images/menu/alpha-bg-95.png +0 -0
  12. data/app/assets/images/menu/alpha-bg-99.png +0 -0
  13. data/app/assets/javascripts/ajax_callbacks_core/common.js.erb +83 -0
  14. data/app/assets/javascripts/ajax_callbacks_core/forms.js.erb +27 -0
  15. data/app/assets/javascripts/ajax_callbacks_core/helpers.js.erb +216 -0
  16. data/app/assets/javascripts/ajax_ext_core/colorpicker.js +484 -0
  17. data/app/assets/javascripts/ajax_ext_core/date.js.erb +335 -0
  18. data/app/assets/javascripts/ajax_ext_core/faye.js +2 -0
  19. data/app/assets/javascripts/ajax_ext_core/jquery-json.js +178 -0
  20. data/app/assets/javascripts/ajax_ext_core/jquery-ui-timepicker-addon.js +1923 -0
  21. data/app/assets/javascripts/ajax_ext_core/jquery.hash.js +203 -0
  22. data/app/assets/javascripts/ajax_ext_core/jquery.jsonSuggest.js +25 -0
  23. data/app/assets/javascripts/ajax_ext_core/jquery.mtz.monthpicker.js +271 -0
  24. data/app/assets/javascripts/ajax_ext_core/preload_images.js +56 -0
  25. data/app/assets/javascripts/ajax_ui_core/autocomplete.js.erb +26 -0
  26. data/app/assets/javascripts/ajax_ui_core/datepicker.js.erb +144 -0
  27. data/app/assets/javascripts/ajax_ui_core/friends_ui.js.erb +23 -0
  28. data/app/assets/javascripts/ajax_ui_core/overlay.js.erb +85 -0
  29. data/app/assets/javascripts/ajax_ui_core/slide-down.js +163 -0
  30. data/app/assets/javascripts/friends_ajax_core.js.erb +11 -0
  31. data/app/assets/javascripts/init_ajax_core.js.erb +22 -0
  32. data/app/controllers/friends_ajax_controller.rb +6 -0
  33. data/app/helpers/friends_ajax_helper.rb +176 -0
  34. data/app/views/layouts/_ajax_overlay.html.erb +5 -0
  35. data/app/views/layouts/_info_overlay.html.erb +9 -0
  36. data/app/views/layouts/_invisible_overlay.html.erb +10 -0
  37. data/app/views/layouts/_layout_defaults.html.erb +39 -0
  38. data/app/views/layouts/_overlay_js.html.erb +30 -0
  39. data/app/views/layouts/ajax_overlay.html.erb +5 -0
  40. data/app/views/layouts/info_overlay.html.erb +9 -0
  41. data/config/routes.rb +10 -0
  42. data/lib/friends_ajax_core.rb +117 -0
  43. data/lib/friends_ajax_core/version.rb +4 -0
  44. metadata +143 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4060628448ee244d07a29e9d225ea4482fac9c3d
4
+ data.tar.gz: 40ff20c948b9ed90a1b48118d42671c0ea1a3d18
5
+ SHA512:
6
+ metadata.gz: c735adbcb52092be1389465b63e53bffd1af20533d6a607265db56487c44b32af981b675040adb5123aec36f1bc8fa601f24a9b999ec9eb46b2635d768d7c2f4
7
+ data.tar.gz: b2206d8aef38a27ee021ca0c48f0733486b0e6bca3f587b3065f51a03512405d5a26d64affeea99fd3ed0a7c413893e67ae4ae2aa82970d22bb037e81ce2f99b
@@ -0,0 +1,83 @@
1
+ // Alles laden
2
+ initAllAjaxTools = function(){
3
+
4
+ initSelectOnchange();
5
+ initDefaultLink();
6
+ loadAjaxFlashNotice();
7
+ initDatePickers();
8
+ initAutoComplete();
9
+
10
+ }
11
+
12
+ // initialisierung des Default Links
13
+ initDefaultLink = function(){
14
+ // Default Ajax Link, formerly known as 'ajax_default_link'-Helper
15
+ // Data will be automatically rendered into ajax overlay container, after showing loading message
16
+ // add 'update-div-...' to set custom div to render data in!
17
+
18
+ unloaded_links = $("a.<%= AJAX_DEFAULT_LINK %>.<%= AJAX_NOT_LOADED %>, form.<%= AJAX_DEFAULT_LINK %>.<%= AJAX_NOT_LOADED %>")
19
+
20
+ unloaded_links.bind('ajax:beforeSend', function(xhr,settings) {
21
+
22
+ link_options = linkOptionsFromClassName(this);
23
+
24
+ if(link_options['hide_load_message'] != true){
25
+
26
+ if(link_options['load_message'] == true && link_options['target_div'] != ""){
27
+ ajaxLoadMessage(link_options['target_div'], link_options['load_message_text']);
28
+ }
29
+ else if(link_options['tiny_loader'] == true && link_options['target_div'] != ""){
30
+ tinyAjaxLoadMessage(link_options['target_div']);
31
+ }
32
+ else{
33
+ showLoading();
34
+ }
35
+ }else if(link_options['push_progress_trigger'] != true){
36
+ handlePushProgress({'title': "Bitte warten...", "message": "Vorgang wird gestartet"})
37
+ }
38
+
39
+ // Checking if data should be submitted
40
+ if(link_options['submit_data'] != ''){
41
+ console.log("submitting: " + link_options['submit_data'])
42
+ form_data = jQuery("#" + link_options['submit_data'] + " :input").serialize()
43
+ console.log(form_data)
44
+ console.log(settings.url)
45
+ settings.data = form_data
46
+ }
47
+
48
+
49
+ })
50
+
51
+ // Default Ajax Link - Success
52
+ unloaded_links.bind('ajax:success', function(xhr, data, status) {
53
+ link_options = linkOptionsFromClassName(this);
54
+
55
+ if(link_options['append'] == true){
56
+ $("#"+link_options['target_div']).append(data)
57
+ }
58
+ else{
59
+ $("#"+link_options['target_div']).html(data)
60
+ }
61
+
62
+ hideLoading();
63
+ initAllAjaxTools();
64
+
65
+ if(link_options['callback'] != ''){
66
+ eval(link_options['callback']);
67
+ }
68
+ })
69
+
70
+ // Default ajax link - Error
71
+ unloaded_links.bind('ajax:error', function(xhr, status, error) {
72
+
73
+ <% if Rails.env == 'development' %>
74
+ flashNoticeDisplay("Error - see log for Details", 'error');
75
+ <% end %>
76
+
77
+ hideLoading();
78
+ });
79
+
80
+ unloaded_links.removeClass("<%= AJAX_NOT_LOADED %>");
81
+ }
82
+
83
+
@@ -0,0 +1,27 @@
1
+ // initialisierung des Default Links
2
+ initSelectOnchange = function(){
3
+ // Default Ajax Link, formerly known as 'ajax_default_link'-Helper
4
+ // Data will be automatically rendered into ajax overlay container, after showing loading message
5
+ // add 'update-div-...' to set custom div to render data in!
6
+ select_actions = $("select.<%= FORM_SELECT_CHANGE_SELECTOR %>.<%= AJAX_NOT_LOADED %>");
7
+ select_actions.change(function(){
8
+
9
+ // Daten zusammenladen
10
+ link_options = linkOptionsFromClassName(this);
11
+
12
+ console.log(link_options)
13
+
14
+ // Url erstellen
15
+ url = $(this).attr('<%= HTML_DATA_TARGET_URL %>').replace('<%= HTML_URL_VALUE_PLACEHOLDER %>', this.value);
16
+
17
+ // Feuer frei
18
+ remote_function(url, link_options['target_div'], link_options['load_message'] == true, link_options['submit_data']);
19
+
20
+ })
21
+ select_actions.removeClass("<%= AJAX_NOT_LOADED %>")
22
+ }
23
+
24
+
25
+ hideParentOverlay = function(e){
26
+ $(e).parents(".info-overlay").slideUp(200)
27
+ }
@@ -0,0 +1,216 @@
1
+ //= FRIENDS AJAX CORE HELPER FUNCTIONS
2
+ //= Loader Anzeigen
3
+ //
4
+ //== Ajax Load Message:
5
+ // Anzeige einer Box mit Loader und Message
6
+ ajaxLoadMessage = function(target, message){
7
+ message = message || '<%= HTML_LOAD_DEFAULT.to_s %>'
8
+ message_target = $("#"+target);
9
+
10
+ loader_id = "loader-"+randomString()
11
+ html_string = "<div id='" + loader_id +"' class='rounded ajax-load-box'><img src='/assets/icons/loader-16.png'/>" + message +"</div>";
12
+
13
+
14
+ message_target.children().fadeTo(500, 0.3)
15
+
16
+ message_target.append(html_string);
17
+
18
+ loader = $("#"+loader_id)
19
+
20
+ // Abemessung berechnen
21
+ loader_width = loader.width()
22
+ loader_height = loader.height()
23
+
24
+ message_target.css({position: "relative", "min-height": loader_height+"px"})
25
+
26
+ target_width = message_target.width()
27
+ target_height = message_target.height()
28
+
29
+ if(message_target.height() > window.innerHeight){
30
+ loader.css({left: ((target_width/2)-(loader_width/2))+"px", top: (loader_height)+"px", position: "absolute"})
31
+ }else{
32
+ loader.css({left: ((target_width/2)-(loader_width/2))+"px", top: ((target_height/2)-(loader_height/2))+"px", position: "absolute"})
33
+ }
34
+
35
+
36
+ loader.show();
37
+
38
+
39
+
40
+ }
41
+
42
+ //== TinyLoadMessage
43
+ // Anzeige Loader mit Message ohne Box
44
+ tinyAjaxLoadMessage = function(target, message){
45
+ message = message || '<%= HTML_TINY_LOAD_DEFAULT.to_s %>'
46
+ message_target = $("#"+target);
47
+ message_target.children().hide();
48
+ message_target.append("<img src='/assets/content-elements/ajax-loader.gif' width='16px' height='16px'/> " + message);
49
+ }
50
+
51
+ progressAjaxLoadMessage = function(target, message){
52
+ message = message || '<%= HTML_TINY_LOAD_DEFAULT.to_s %>'
53
+ message_target = $("#"+target);
54
+ message_target.children().hide();
55
+ message_target.append("<div class='text-center'><div class='spacer-small'>" + message +"</div><img src='/assets/content-elements/ajax-bar.gif'/></div>");
56
+ }
57
+
58
+ //== Cursor Loader
59
+ // Blendet den Mauszeiger aus und
60
+ // ... coming soon
61
+
62
+
63
+ // Auslesen der Optionen für den Link (Ziel, Loadmessage etc.) aus der CSS-Klasse
64
+ linkOptionsFromClassName = function(item){
65
+
66
+ link_options = new Hash();
67
+
68
+ link_options.set('target_div', '<%= AJAX_OVERLAY_CONTAINER_NAME %>');
69
+ link_options.set('load_message', false);
70
+ link_options.set('hide_load_message', false);
71
+ link_options.set('tiny_loader', false);
72
+ link_options.set('submit_data', ($(item).attr('<%= AJAX_SUBMIT_DATA_TRIGGER %>') || ''))
73
+ link_options.set('callback', '')
74
+ link_options.set('append', false)
75
+ link_options.set('push_progress_trigger', false)
76
+
77
+ a = $(item.className.split(" "));
78
+ a.each(function(i){
79
+ if(a[i].match("<%= AJAX_HIDE_LOAD_MESSAGE_SELECTOR %>")){
80
+ link_options.set('hide_load_message', true);
81
+ }else{
82
+ if(a[i].match("<%= AJAX_UPDATE_DIV_SELECTOR %>")){
83
+ link_options.set('target_div', a[i].split("<%= AJAX_UPDATE_DIV_SELECTOR %>")[1]);
84
+ }
85
+ else if(a[i].match("<%= AJAX_LOAD_MESSAGE_TRIGGER %>")){
86
+ link_options.set('load_message', true);
87
+ }
88
+ else if(a[i].match("<%= AJAX_TINY_LOAD_TRIGGER %>")){
89
+ link_options.set('tiny_loader', true);
90
+ link_options.set('load_message', false);
91
+ }
92
+ }
93
+ if(a[i].match("<%= AJAX_PUSH_PROGRESS_TRIGGER %>")){
94
+ link_options.set('push_progress_trigger', true)
95
+ }
96
+ })
97
+
98
+ if(link_options['load_message'] == true){
99
+ link_options.set('load_message_text', $(item).attr('<%= HTML_DATA_LOADING %>'));
100
+ }
101
+
102
+ if($(item).attr('<%= HTML_DATA_CALLBACK %>')){
103
+ link_options.set('callback', $(item).attr('<%= HTML_DATA_CALLBACK %>'))
104
+ }
105
+
106
+ if($(item).attr('<%= HTML_DATA_APPEND %>')){
107
+ link_options.set('append', true)
108
+ }
109
+
110
+ return link_options
111
+
112
+ }
113
+
114
+
115
+ // Element ausblenden - verwendung als Callback nach löschen etc...
116
+ hideItem = function(id){
117
+ $("#"+id).fadeOut(300);
118
+ }
119
+
120
+
121
+ // Element löschen - verwendung als Callback nach löschen etc...
122
+ removeItem = function(id){
123
+ $("#"+id).remove();
124
+ }
125
+
126
+ // Flash Notify Tools
127
+ flashNoticeDisplay = function(text,mode){
128
+ mode = mode || 'ok' ;
129
+ text = text.replace(/\'/g, "\"")
130
+ html_notice = "<div class='notify " + mode + "' style='display:none'>" + text + "</div>";
131
+ $('#<%= FLASH_AREA_DIV %>').html(html_notice);
132
+ $('#<%= FLASH_AREA_DIV %>').children().slideDown(500);
133
+ window.setTimeout('flashFadeOut()', 5000);
134
+ }
135
+
136
+ flashFadeOut = function(){
137
+ $('#<%= FLASH_AREA_DIV %>').children().fadeOut(500);
138
+ }
139
+
140
+ loadAjaxFlashNotice = function(){
141
+ $.getJSON(jsFullUrl('/ajax/json_flash_data'), function(data){
142
+ $(data).each(function(i) {
143
+ flashNoticeDisplay($(this)[1], $(this)[0]);
144
+ });
145
+ });
146
+ }
147
+
148
+ // Adds full host name etc. to URL
149
+ jsFullUrl = function(url){
150
+ proto = '<%= CURRENT_APP.url_options[:protocol] %>'
151
+ host = '<%= CURRENT_APP.url_options[:host] %>'
152
+ port = '<%= CURRENT_APP.url_options[:port] %>'
153
+
154
+ target_url = proto + '://' + host
155
+ if(port != ''){
156
+ target_url = target_url + ":"+port
157
+ }
158
+ return target_url + url
159
+ }
160
+
161
+ // JavaScript Makeover of Rails 2.3 'remote_function' helper
162
+ remote_function = function(path_url, div, load_message, submit, load_text){
163
+ if(typeof submit != 'undefined' && submit != '') {
164
+
165
+ submit = ("#"+submit + " *").replace("##", "#")
166
+ request_data = $(submit).serialize();
167
+ console.log(request_data);
168
+ request_type = "post"
169
+
170
+ }else{
171
+ request_data = 'authenticity_token=' + AUTH_TOKEN
172
+ request_type = "get"
173
+ }
174
+
175
+ div = div || '<%= AJAX_OVERLAY_CONTAINER_NAME %>'
176
+ $.ajax({
177
+ success:function(request){
178
+
179
+ $('#'+div).html(request);
180
+
181
+ hideLoading();
182
+ initAllAjaxTools();
183
+ loadAjaxFlashNotice();
184
+ },
185
+
186
+ beforeSend: function(data){
187
+ if(load_message != false){
188
+ if(load_message == true){
189
+ ajaxLoadMessage(div);
190
+ }else if(load_message == 'tiny'){
191
+ tinyAjaxLoadMessage(div, load_text);
192
+ }else if(load_message == 'progress'){
193
+ progressAjaxLoadMessage(div, load_text);
194
+ }
195
+ else{
196
+ showLoading();
197
+ }
198
+ }else{
199
+ }
200
+ },
201
+
202
+ url: path_url,
203
+ data: request_data,
204
+ type: request_type
205
+ });
206
+ }
207
+
208
+
209
+
210
+ parseJsonDate = function(jsonDate) {
211
+ date_parts = /(\d{4})-(\d{2})-(\d{2}).(\d{2}):(\d{2})/.exec(jsonDate)
212
+ realDate = new Date(parseInt(date_parts[1]), parseInt(date_parts[2], 10)-1, parseInt(date_parts[3], 10), parseInt(date_parts[4], 10), parseInt(date_parts[5], 10));
213
+ return realDate;
214
+ };
215
+
216
+
@@ -0,0 +1,484 @@
1
+ /**
2
+ *
3
+ * Color picker
4
+ * Author: Stefan Petre www.eyecon.ro
5
+ *
6
+ * Dual licensed under the MIT and GPL licenses
7
+ *
8
+ */
9
+ (function ($) {
10
+ var ColorPicker = function () {
11
+ var
12
+ ids = {},
13
+ inAction,
14
+ charMin = 65,
15
+ visible,
16
+ 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>',
17
+ defaults = {
18
+ eventName: 'click',
19
+ onShow: function () {},
20
+ onBeforeShow: function(){},
21
+ onHide: function () {},
22
+ onChange: function () {},
23
+ onSubmit: function () {},
24
+ color: 'ff0000',
25
+ livePreview: true,
26
+ flat: false
27
+ },
28
+ fillRGBFields = function (hsb, cal) {
29
+ var rgb = HSBToRGB(hsb);
30
+ $(cal).data('colorpicker').fields
31
+ .eq(1).val(rgb.r).end()
32
+ .eq(2).val(rgb.g).end()
33
+ .eq(3).val(rgb.b).end();
34
+ },
35
+ fillHSBFields = function (hsb, cal) {
36
+ $(cal).data('colorpicker').fields
37
+ .eq(4).val(hsb.h).end()
38
+ .eq(5).val(hsb.s).end()
39
+ .eq(6).val(hsb.b).end();
40
+ },
41
+ fillHexFields = function (hsb, cal) {
42
+ $(cal).data('colorpicker').fields
43
+ .eq(0).val(HSBToHex(hsb)).end();
44
+ },
45
+ setSelector = function (hsb, cal) {
46
+ $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
47
+ $(cal).data('colorpicker').selectorIndic.css({
48
+ left: parseInt(150 * hsb.s/100, 10),
49
+ top: parseInt(150 * (100-hsb.b)/100, 10)
50
+ });
51
+ },
52
+ setHue = function (hsb, cal) {
53
+ $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
54
+ },
55
+ setCurrentColor = function (hsb, cal) {
56
+ $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
57
+ },
58
+ setNewColor = function (hsb, cal) {
59
+ $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
60
+ },
61
+ keyDown = function (ev) {
62
+ var pressedKey = ev.charCode || ev.keyCode || -1;
63
+ if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
64
+ return false;
65
+ }
66
+ var cal = $(this).parent().parent();
67
+ if (cal.data('colorpicker').livePreview === true) {
68
+ change.apply(this);
69
+ }
70
+ },
71
+ change = function (ev) {
72
+ var cal = $(this).parent().parent(), col;
73
+ if (this.parentNode.className.indexOf('_hex') > 0) {
74
+ cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
75
+ } else if (this.parentNode.className.indexOf('_hsb') > 0) {
76
+ cal.data('colorpicker').color = col = fixHSB({
77
+ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
78
+ s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
79
+ b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
80
+ });
81
+ } else {
82
+ cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
83
+ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
84
+ g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
85
+ b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
86
+ }));
87
+ }
88
+ if (ev) {
89
+ fillRGBFields(col, cal.get(0));
90
+ fillHexFields(col, cal.get(0));
91
+ fillHSBFields(col, cal.get(0));
92
+ }
93
+ setSelector(col, cal.get(0));
94
+ setHue(col, cal.get(0));
95
+ setNewColor(col, cal.get(0));
96
+ cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
97
+ },
98
+ blur = function (ev) {
99
+ var cal = $(this).parent().parent();
100
+ cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
101
+ },
102
+ focus = function () {
103
+ charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
104
+ $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
105
+ $(this).parent().addClass('colorpicker_focus');
106
+ },
107
+ downIncrement = function (ev) {
108
+ var field = $(this).parent().find('input').focus();
109
+ var current = {
110
+ el: $(this).parent().addClass('colorpicker_slider'),
111
+ max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
112
+ y: ev.pageY,
113
+ field: field,
114
+ val: parseInt(field.val(), 10),
115
+ preview: $(this).parent().parent().data('colorpicker').livePreview
116
+ };
117
+ $(document).bind('mouseup', current, upIncrement);
118
+ $(document).bind('mousemove', current, moveIncrement);
119
+ },
120
+ moveIncrement = function (ev) {
121
+ ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
122
+ if (ev.data.preview) {
123
+ change.apply(ev.data.field.get(0), [true]);
124
+ }
125
+ return false;
126
+ },
127
+ upIncrement = function (ev) {
128
+ change.apply(ev.data.field.get(0), [true]);
129
+ ev.data.el.removeClass('colorpicker_slider').find('input').focus();
130
+ $(document).unbind('mouseup', upIncrement);
131
+ $(document).unbind('mousemove', moveIncrement);
132
+ return false;
133
+ },
134
+ downHue = function (ev) {
135
+ var current = {
136
+ cal: $(this).parent(),
137
+ y: $(this).offset().top
138
+ };
139
+ current.preview = current.cal.data('colorpicker').livePreview;
140
+ $(document).bind('mouseup', current, upHue);
141
+ $(document).bind('mousemove', current, moveHue);
142
+ },
143
+ moveHue = function (ev) {
144
+ change.apply(
145
+ ev.data.cal.data('colorpicker')
146
+ .fields
147
+ .eq(4)
148
+ .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
149
+ .get(0),
150
+ [ev.data.preview]
151
+ );
152
+ return false;
153
+ },
154
+ upHue = function (ev) {
155
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
156
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
157
+ $(document).unbind('mouseup', upHue);
158
+ $(document).unbind('mousemove', moveHue);
159
+ return false;
160
+ },
161
+ downSelector = function (ev) {
162
+ var current = {
163
+ cal: $(this).parent(),
164
+ pos: $(this).offset()
165
+ };
166
+ current.preview = current.cal.data('colorpicker').livePreview;
167
+ $(document).bind('mouseup', current, upSelector);
168
+ $(document).bind('mousemove', current, moveSelector);
169
+ },
170
+ moveSelector = function (ev) {
171
+ change.apply(
172
+ ev.data.cal.data('colorpicker')
173
+ .fields
174
+ .eq(6)
175
+ .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
176
+ .end()
177
+ .eq(5)
178
+ .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
179
+ .get(0),
180
+ [ev.data.preview]
181
+ );
182
+ return false;
183
+ },
184
+ upSelector = function (ev) {
185
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
186
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
187
+ $(document).unbind('mouseup', upSelector);
188
+ $(document).unbind('mousemove', moveSelector);
189
+ return false;
190
+ },
191
+ enterSubmit = function (ev) {
192
+ $(this).addClass('colorpicker_focus');
193
+ },
194
+ leaveSubmit = function (ev) {
195
+ $(this).removeClass('colorpicker_focus');
196
+ },
197
+ clickSubmit = function (ev) {
198
+ var cal = $(this).parent();
199
+ var col = cal.data('colorpicker').color;
200
+ cal.data('colorpicker').origColor = col;
201
+ setCurrentColor(col, cal.get(0));
202
+ cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
203
+ },
204
+ show = function (ev) {
205
+ var cal = $('#' + $(this).data('colorpickerId'));
206
+ cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
207
+ var pos = $(this).offset();
208
+ var viewPort = getViewport();
209
+ var top = pos.top + this.offsetHeight;
210
+ var left = pos.left;
211
+ if (top + 176 > viewPort.t + viewPort.h) {
212
+ top -= this.offsetHeight + 176;
213
+ }
214
+ if (left + 356 > viewPort.l + viewPort.w) {
215
+ left -= 356;
216
+ }
217
+ cal.css({left: left + 'px', top: top + 'px'});
218
+ if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
219
+ cal.show();
220
+ }
221
+ $(document).bind('mousedown', {cal: cal}, hide);
222
+ return false;
223
+ },
224
+ hide = function (ev) {
225
+ if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
226
+ if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
227
+ ev.data.cal.hide();
228
+ }
229
+ $(document).unbind('mousedown', hide);
230
+ }
231
+ },
232
+ isChildOf = function(parentEl, el, container) {
233
+ if (parentEl == el) {
234
+ return true;
235
+ }
236
+ if (parentEl.contains) {
237
+ return parentEl.contains(el);
238
+ }
239
+ if ( parentEl.compareDocumentPosition ) {
240
+ return !!(parentEl.compareDocumentPosition(el) & 16);
241
+ }
242
+ var prEl = el.parentNode;
243
+ while(prEl && prEl != container) {
244
+ if (prEl == parentEl)
245
+ return true;
246
+ prEl = prEl.parentNode;
247
+ }
248
+ return false;
249
+ },
250
+ getViewport = function () {
251
+ var m = document.compatMode == 'CSS1Compat';
252
+ return {
253
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
254
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
255
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
256
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
257
+ };
258
+ },
259
+ fixHSB = function (hsb) {
260
+ return {
261
+ h: Math.min(360, Math.max(0, hsb.h)),
262
+ s: Math.min(100, Math.max(0, hsb.s)),
263
+ b: Math.min(100, Math.max(0, hsb.b))
264
+ };
265
+ },
266
+ fixRGB = function (rgb) {
267
+ return {
268
+ r: Math.min(255, Math.max(0, rgb.r)),
269
+ g: Math.min(255, Math.max(0, rgb.g)),
270
+ b: Math.min(255, Math.max(0, rgb.b))
271
+ };
272
+ },
273
+ fixHex = function (hex) {
274
+ var len = 6 - hex.length;
275
+ if (len > 0) {
276
+ var o = [];
277
+ for (var i=0; i<len; i++) {
278
+ o.push('0');
279
+ }
280
+ o.push(hex);
281
+ hex = o.join('');
282
+ }
283
+ return hex;
284
+ },
285
+ HexToRGB = function (hex) {
286
+ var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
287
+ return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
288
+ },
289
+ HexToHSB = function (hex) {
290
+ return RGBToHSB(HexToRGB(hex));
291
+ },
292
+ RGBToHSB = function (rgb) {
293
+ var hsb = {
294
+ h: 0,
295
+ s: 0,
296
+ b: 0
297
+ };
298
+ var min = Math.min(rgb.r, rgb.g, rgb.b);
299
+ var max = Math.max(rgb.r, rgb.g, rgb.b);
300
+ var delta = max - min;
301
+ hsb.b = max;
302
+ if (max != 0) {
303
+
304
+ }
305
+ hsb.s = max != 0 ? 255 * delta / max : 0;
306
+ if (hsb.s != 0) {
307
+ if (rgb.r == max) {
308
+ hsb.h = (rgb.g - rgb.b) / delta;
309
+ } else if (rgb.g == max) {
310
+ hsb.h = 2 + (rgb.b - rgb.r) / delta;
311
+ } else {
312
+ hsb.h = 4 + (rgb.r - rgb.g) / delta;
313
+ }
314
+ } else {
315
+ hsb.h = -1;
316
+ }
317
+ hsb.h *= 60;
318
+ if (hsb.h < 0) {
319
+ hsb.h += 360;
320
+ }
321
+ hsb.s *= 100/255;
322
+ hsb.b *= 100/255;
323
+ return hsb;
324
+ },
325
+ HSBToRGB = function (hsb) {
326
+ var rgb = {};
327
+ var h = Math.round(hsb.h);
328
+ var s = Math.round(hsb.s*255/100);
329
+ var v = Math.round(hsb.b*255/100);
330
+ if(s == 0) {
331
+ rgb.r = rgb.g = rgb.b = v;
332
+ } else {
333
+ var t1 = v;
334
+ var t2 = (255-s)*v/255;
335
+ var t3 = (t1-t2)*(h%60)/60;
336
+ if(h==360) h = 0;
337
+ if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
338
+ else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
339
+ else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
340
+ else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
341
+ else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
342
+ else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
343
+ else {rgb.r=0; rgb.g=0; rgb.b=0}
344
+ }
345
+ return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
346
+ },
347
+ RGBToHex = function (rgb) {
348
+ var hex = [
349
+ rgb.r.toString(16),
350
+ rgb.g.toString(16),
351
+ rgb.b.toString(16)
352
+ ];
353
+ $.each(hex, function (nr, val) {
354
+ if (val.length == 1) {
355
+ hex[nr] = '0' + val;
356
+ }
357
+ });
358
+ return hex.join('');
359
+ },
360
+ HSBToHex = function (hsb) {
361
+ return RGBToHex(HSBToRGB(hsb));
362
+ },
363
+ restoreOriginal = function () {
364
+ var cal = $(this).parent();
365
+ var col = cal.data('colorpicker').origColor;
366
+ cal.data('colorpicker').color = col;
367
+ fillRGBFields(col, cal.get(0));
368
+ fillHexFields(col, cal.get(0));
369
+ fillHSBFields(col, cal.get(0));
370
+ setSelector(col, cal.get(0));
371
+ setHue(col, cal.get(0));
372
+ setNewColor(col, cal.get(0));
373
+ };
374
+ return {
375
+ init: function (opt) {
376
+ opt = $.extend({}, defaults, opt||{});
377
+ if (typeof opt.color == 'string') {
378
+ opt.color = HexToHSB(opt.color);
379
+ } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
380
+ opt.color = RGBToHSB(opt.color);
381
+ } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
382
+ opt.color = fixHSB(opt.color);
383
+ } else {
384
+ return this;
385
+ }
386
+ return this.each(function () {
387
+ if (!$(this).data('colorpickerId')) {
388
+ var options = $.extend({}, opt);
389
+ options.origColor = opt.color;
390
+ var id = 'collorpicker_' + parseInt(Math.random() * 1000);
391
+ $(this).data('colorpickerId', id);
392
+ var cal = $(tpl).attr('id', id);
393
+ if (options.flat) {
394
+ cal.appendTo(this).show();
395
+ } else {
396
+ cal.appendTo(document.body);
397
+ }
398
+ options.fields = cal
399
+ .find('input')
400
+ .bind('keyup', keyDown)
401
+ .bind('change', change)
402
+ .bind('blur', blur)
403
+ .bind('focus', focus);
404
+ cal
405
+ .find('span').bind('mousedown', downIncrement).end()
406
+ .find('>div.colorpicker_current_color').bind('click', restoreOriginal);
407
+ options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
408
+ options.selectorIndic = options.selector.find('div div');
409
+ options.el = this;
410
+ options.hue = cal.find('div.colorpicker_hue div');
411
+ cal.find('div.colorpicker_hue').bind('mousedown', downHue);
412
+ options.newColor = cal.find('div.colorpicker_new_color');
413
+ options.currentColor = cal.find('div.colorpicker_current_color');
414
+ cal.data('colorpicker', options);
415
+ cal.find('div.colorpicker_submit')
416
+ .bind('mouseenter', enterSubmit)
417
+ .bind('mouseleave', leaveSubmit)
418
+ .bind('click', clickSubmit);
419
+ fillRGBFields(options.color, cal.get(0));
420
+ fillHSBFields(options.color, cal.get(0));
421
+ fillHexFields(options.color, cal.get(0));
422
+ setHue(options.color, cal.get(0));
423
+ setSelector(options.color, cal.get(0));
424
+ setCurrentColor(options.color, cal.get(0));
425
+ setNewColor(options.color, cal.get(0));
426
+ if (options.flat) {
427
+ cal.css({
428
+ position: 'relative',
429
+ display: 'block'
430
+ });
431
+ } else {
432
+ $(this).bind(options.eventName, show);
433
+ }
434
+ }
435
+ });
436
+ },
437
+ showPicker: function() {
438
+ return this.each( function () {
439
+ if ($(this).data('colorpickerId')) {
440
+ show.apply(this);
441
+ }
442
+ });
443
+ },
444
+ hidePicker: function() {
445
+ return this.each( function () {
446
+ if ($(this).data('colorpickerId')) {
447
+ $('#' + $(this).data('colorpickerId')).hide();
448
+ }
449
+ });
450
+ },
451
+ setColor: function(col) {
452
+ if (typeof col == 'string') {
453
+ col = HexToHSB(col);
454
+ } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
455
+ col = RGBToHSB(col);
456
+ } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
457
+ col = fixHSB(col);
458
+ } else {
459
+ return this;
460
+ }
461
+ return this.each(function(){
462
+ if ($(this).data('colorpickerId')) {
463
+ var cal = $('#' + $(this).data('colorpickerId'));
464
+ cal.data('colorpicker').color = col;
465
+ cal.data('colorpicker').origColor = col;
466
+ fillRGBFields(col, cal.get(0));
467
+ fillHSBFields(col, cal.get(0));
468
+ fillHexFields(col, cal.get(0));
469
+ setHue(col, cal.get(0));
470
+ setSelector(col, cal.get(0));
471
+ setCurrentColor(col, cal.get(0));
472
+ setNewColor(col, cal.get(0));
473
+ }
474
+ });
475
+ }
476
+ };
477
+ }();
478
+ $.fn.extend({
479
+ ColorPicker: ColorPicker.init,
480
+ ColorPickerHide: ColorPicker.hidePicker,
481
+ ColorPickerShow: ColorPicker.showPicker,
482
+ ColorPickerSetColor: ColorPicker.setColor
483
+ });
484
+ })(jQuery)