friends_ajax_core 0.0.51

Sign up to get free protection for your applications and to get access to all the features.
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)