diff --git a/modules/photoannotation/controllers/admin_photoannotation.php b/modules/photoannotation/controllers/admin_photoannotation.php
index e239e6b7..347c90de 100644
--- a/modules/photoannotation/controllers/admin_photoannotation.php
+++ b/modules/photoannotation/controllers/admin_photoannotation.php
@@ -28,13 +28,25 @@ class Admin_Photoannotation_Controller extends Admin_Controller {
$form = $this->_get_form();
if ($form->validate()) {
module::set_var(
- "photoannotation", "showusers", $form->photoannotation->showusers->value, true);
+ "photoannotation", "noborder", $form->hoverphoto->noborder->value, true);
module::set_var(
- "photoannotation", "showfaces", $form->photoannotation->showfaces->value, true);
+ "photoannotation", "bordercolor", $form->hoverphoto->bordercolor->value);
module::set_var(
- "photoannotation", "shownotes", $form->photoannotation->shownotes->value, true);
+ "photoannotation", "noclickablehover", $form->hoverclickable->noclickablehover->value, true);
module::set_var(
- "photoannotation", "fullname", $form->photoannotation->fullname->value, true);
+ "photoannotation", "clickablehovercolor", $form->hoverclickable->clickablehovercolor->value);
+ module::set_var(
+ "photoannotation", "nohover", $form->hovernoclickable->nohover->value, true);
+ module::set_var(
+ "photoannotation", "hovercolor", $form->hovernoclickable->hovercolor->value);
+ module::set_var(
+ "photoannotation", "showusers", $form->legendsettings->showusers->value, true);
+ module::set_var(
+ "photoannotation", "showfaces", $form->legendsettings->showfaces->value, true);
+ module::set_var(
+ "photoannotation", "shownotes", $form->legendsettings->shownotes->value, true);
+ module::set_var(
+ "photoannotation", "fullname", $form->legendsettings->fullname->value, true);
message::success(t("Your settings have been saved."));
url::redirect("admin/photoannotation");
}
@@ -50,7 +62,25 @@ class Admin_Photoannotation_Controller extends Admin_Controller {
private function _get_form() {
$form = new Forge("admin/photoannotation/handler", "", "post", array("id" => "g-admin-form"));
- $group = $form->group("photoannotation")->label(t("Photo annotation settings"));
+ $group = $form->group("hoverphoto")->label(t("Hovering over the photo"));
+ $group->checkbox("noborder")->label(t("Don't show borders."))
+ ->checked(module::get_var("photoannotation", "noborder", false));
+ $group->input("bordercolor")->label(t('Border color'))
+ ->value(module::get_var("photoannotation", "bordercolor", "000000"))
+ ->rules("valid_alpha_numeric|length[6]");
+ $group = $form->group("hoverclickable")->label(t("Hovering over a clickable annotation"));
+ $group->checkbox("noclickablehover")->label(t("Don't show borders."))
+ ->checked(module::get_var("photoannotation", "noclickablehover", false));
+ $group->input("clickablehovercolor")->label(t('Border color'))
+ ->value(module::get_var("photoannotation", "clickablehovercolor", "00AD00"))
+ ->rules("valid_alpha_numeric|length[6]");
+ $group = $form->group("hovernoclickable")->label(t("Hovering over a non-clickable annotation"));
+ $group->checkbox("nohover")->label(t("Don't show borders."))
+ ->checked(module::get_var("photoannotation", "nohover", false));
+ $group->input("hovercolor")->label(t('Border color'))
+ ->value(module::get_var("photoannotation", "hovercolor", "990000"))
+ ->rules("valid_alpha_numeric|length[6]");
+ $group = $form->group("legendsettings")->label(t("Legend settings"));
$group->checkbox("showusers")->label(t("Show face annotation below photo."))
->checked(module::get_var("photoannotation", "showusers", false));
$group->checkbox("showfaces")->label(t("Show face annotation below photo."))
diff --git a/modules/photoannotation/controllers/photoannotation.php b/modules/photoannotation/controllers/photoannotation.php
index 30f6ef65..3718d7bb 100644
--- a/modules/photoannotation/controllers/photoannotation.php
+++ b/modules/photoannotation/controllers/photoannotation.php
@@ -68,7 +68,7 @@ class photoannotation_Controller extends Controller {
->where("id", "=", $annotate_id)
->find();
if ($user_id > -1) { //Conversion user -> user
- $this->_saveuser($user_id, $item_id, $str_x1, $str_y1, $str_x2, $str_y2, $description, $annotate_id);
+ $this->_saveuser($user_id, $item_id, $str_x1, $str_y1, $str_x2, $str_y2, $description);
} elseif ($tag_data > -1) { //Conversion user -> face
$this->_saveface($tag_data, $item_id, $str_x1, $str_y1, $str_x2, $str_y2, $description);
$updateduser->delete(); //delete old user
@@ -162,13 +162,21 @@ class photoannotation_Controller extends Controller {
url::redirect($redir_uri);
}
- private function _saveuser($user_id, $item_id, $str_x1, $str_y1, $str_x2, $str_y2, $description, $annotate_id = "") {
- if ($annotate_id == "") {
+ private function _saveuser($user_id, $item_id, $str_x1, $str_y1, $str_x2, $str_y2, $description) {
+ //Since we are associating a user we will remove any old annotation of this user on this photo
+ $item_old_users = ORM::factory("items_user")
+ ->where("user_id", "=", $user_id)
+ ->where("item_id", "=", $item_id)
+ ->find_all();
+ if (count($item_old_users) > 1) {
+ foreach ($item_old_users as $item_old_user) {
+ $item_old_user->delete();
+ }
$item_user = ORM::factory("items_user");
+ } elseif (count($item_old_users) > 0) {
+ $item_user = ORM::factory("items_user", $item_old_users[0]->id);
} else {
- $item_user = ORM::factory("items_user")
- ->where("id", "=", $annotate_id)
- ->find();
+ $item_user = ORM::factory("items_user");
}
$item_user->user_id = $user_id;
$item_user->item_id = $item_id;
@@ -215,4 +223,4 @@ class photoannotation_Controller extends Controller {
$item_note->description = $description;
$item_note->save();
}
-}
\ No newline at end of file
+}
diff --git a/modules/photoannotation/controllers/user_profile.php b/modules/photoannotation/controllers/user_profile.php
deleted file mode 100644
index 20561c8e..00000000
--- a/modules/photoannotation/controllers/user_profile.php
+++ /dev/null
@@ -1,93 +0,0 @@
-where("user_id", "=", $id)->find_all();
- $children_count = count($item_users);
- foreach ($item_users as $item_user) {
- $item_thumb = ORM::factory("item")
- ->viewable()
- ->where("type", "!=", "album")
- ->where("id", ">=", $item_user->item_id)
- ->find();
- $item_thumbs[] = $item_thumb;
- }
- $page_size = module::get_var("gallery", "page_size", 9);
- $page = (int) Input::instance()->get("page", "1");
- $offset = ($page-1) * $page_size;
- $max_pages = max(ceil($children_count / $page_size), 1);
-
- // Make sure that the page references a valid offset
- if ($page < 1) {
- url::redirect($album->abs_url());
- } else if ($page > $max_pages) {
- url::redirect($album->abs_url("page=$max_pages"));
- }
-
- $v->set_global("page", $page);
- $v->set_global("max_pages", $max_pages);
- $v->set_global("page_size", $page_size);
- $v->set_global("userid", $id);
- $v->set_global("children", array_slice($item_thumbs, $offset, $page_size));
- $v->set_global("children_count", $children_count);
- $v->content = new View("photoannotation_user_profile.html");
- $v->content->user = $user;
- $v->content->contactable =
- !$user->guest && $user->id != identity::active_user()->id && $user->email;
- $v->content->editable =
- identity::is_writable() && !$user->guest && $user->id == identity::active_user()->id;
- $event_data = (object)array("user" => $user, "content" => array());
- module::event("show_user_profile", $event_data);
- $v->content->info_parts = $event_data->content;
- $v->content = new View("dynamic.html");
- print $v;
- }
-
- public function contact($id) {
- $user = identity::lookup_user($id);
- print user_profile::get_contact_form($user);
- }
-
- public function send($id) {
- access::verify_csrf();
- $user = identity::lookup_user($id);
- $form = user_profile::get_contact_form($user);
- if ($form->validate()) {
- Sendmail::factory()
- ->to($user->email)
- ->subject(html::clean($form->message->subject->value))
- ->header("Mime-Version", "1.0")
- ->header("Content-type", "text/html; charset=UTF-8")
- ->reply_to($form->message->reply_to->value)
- ->message(html::purify($form->message->message->value))
- ->send();
- message::success(t("Sent message to %user_name", array("user_name" => $user->display_name())));
- json::reply(array("result" => "success"));
- } else {
- json::reply(array("result" => "error", "html" => (string)$form));
- }
- }
-}
diff --git a/modules/photoannotation/css/colorpicker.css b/modules/photoannotation/css/colorpicker.css
new file mode 100644
index 00000000..05b02b48
--- /dev/null
+++ b/modules/photoannotation/css/colorpicker.css
@@ -0,0 +1,161 @@
+.colorpicker {
+ width: 356px;
+ height: 176px;
+ overflow: hidden;
+ position: absolute;
+ background: url(../images/colorpicker_background.png);
+ font-family: Arial, Helvetica, sans-serif;
+ display: none;
+}
+.colorpicker_color {
+ width: 150px;
+ height: 150px;
+ left: 14px;
+ top: 13px;
+ position: absolute;
+ background: #f00;
+ overflow: hidden;
+ cursor: crosshair;
+}
+.colorpicker_color div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 150px;
+ height: 150px;
+ background: url(../images/colorpicker_overlay.png);
+}
+.colorpicker_color div div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 11px;
+ height: 11px;
+ overflow: hidden;
+ background: url(../images/colorpicker_select.gif);
+ margin: -5px 0 0 -5px;
+}
+.colorpicker_hue {
+ position: absolute;
+ top: 13px;
+ left: 171px;
+ width: 35px;
+ height: 150px;
+ cursor: n-resize;
+}
+.colorpicker_hue div {
+ position: absolute;
+ width: 35px;
+ height: 9px;
+ overflow: hidden;
+ background: url(../images/colorpicker_indic.gif) left top;
+ margin: -4px 0 0 0;
+ left: 0px;
+}
+.colorpicker_new_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 213px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker_current_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 283px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker input {
+ background-color: transparent;
+ border: 1px solid transparent;
+ position: absolute;
+ font-size: 10px;
+ font-family: Arial, Helvetica, sans-serif;
+ color: #898989;
+ top: 4px;
+ right: 11px;
+ text-align: right;
+ margin: 0;
+ padding: 0;
+ height: 11px;
+}
+.colorpicker_hex {
+ position: absolute;
+ width: 72px;
+ height: 22px;
+ background: url(../images/colorpicker_hex.png) top;
+ left: 212px;
+ top: 142px;
+}
+.colorpicker_hex input {
+ right: 6px;
+}
+.colorpicker_field {
+ height: 22px;
+ width: 62px;
+ background-position: top;
+ position: absolute;
+}
+.colorpicker_field span {
+ position: absolute;
+ width: 12px;
+ height: 22px;
+ overflow: hidden;
+ top: 0;
+ right: 0;
+ cursor: n-resize;
+}
+.colorpicker_rgb_r {
+ background-image: url(../images/colorpicker_rgb_r.png);
+ top: 52px;
+ left: 212px;
+}
+.colorpicker_rgb_g {
+ background-image: url(../images/colorpicker_rgb_g.png);
+ top: 82px;
+ left: 212px;
+}
+.colorpicker_rgb_b {
+ background-image: url(../images/colorpicker_rgb_b.png);
+ top: 112px;
+ left: 212px;
+}
+.colorpicker_hsb_h {
+ background-image: url(../images/colorpicker_hsb_h.png);
+ top: 52px;
+ left: 282px;
+}
+.colorpicker_hsb_s {
+ background-image: url(../images/colorpicker_hsb_s.png);
+ top: 82px;
+ left: 282px;
+}
+.colorpicker_hsb_b {
+ background-image: url(../images/colorpicker_hsb_b.png);
+ top: 112px;
+ left: 282px;
+}
+.colorpicker_submit {
+ position: absolute;
+ width: 22px;
+ height: 22px;
+ background: url(../images/colorpicker_submit.png) top;
+ left: 322px;
+ top: 142px;
+ overflow: hidden;
+}
+.colorpicker_focus {
+ background-position: center;
+}
+.colorpicker_hex.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_submit.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_slider {
+ background-position: bottom;
+}
diff --git a/modules/photoannotation/css/photoannotation.css b/modules/photoannotation/css/photoannotation.css
index 9ec14368..de3e6f87 100644
--- a/modules/photoannotation/css/photoannotation.css
+++ b/modules/photoannotation/css/photoannotation.css
@@ -10,20 +10,15 @@
position: relative;
}
.image-annotate-area {
- border: 1px solid #000000;
position: absolute;
cursor: default;
}
.image-annotate-area div {
- border: 1px solid #FFFFFF;
display: block;
}
.image-annotate-area-editable {
cursor: pointer;
}
-.image-annotate-area-editable-hover div {
- border-color: #00AD00 !important;
-}
.image-annotate-note {
background: #000000 none repeat scroll 0 0;
color: #FFFFFF;
@@ -45,7 +40,6 @@
#image-annotate-edit-form {
background: #FFFFFF none repeat scroll 0 0;
border: 1px solid #000000;
- height: 300px;
padding: 7px;
position: absolute;
width: 250px;
diff --git a/modules/photoannotation/helpers/photoannotation_event.php b/modules/photoannotation/helpers/photoannotation_event.php
index b7e1e15c..ca5c5daf 100644
--- a/modules/photoannotation/helpers/photoannotation_event.php
+++ b/modules/photoannotation/helpers/photoannotation_event.php
@@ -74,6 +74,13 @@ class photoannotation_event_Core {
if (count($existingNotes) > 0) {
db::build()->delete("items_notes")->where("item_id", "=", $item->id)->execute();
}
+
+ $existingUsers = ORM::factory("items_user")
+ ->where("item_id", "=", $item->id)
+ ->find_all();
+ if (count($existingUsers) > 0) {
+ db::build()->delete("items_users")->where("item_id", "=", $item->id)->execute();
+ }
}
static function user_deleted($old) {
@@ -93,4 +100,42 @@ class photoannotation_event_Core {
->label(t("Photo Annotation"))
->url(url::site("admin/photoannotation")));
}
+
+ static function show_user_profile($data) {
+ $view = new View("dynamic.html");
+ //load thumbs
+ $item_users = ORM::factory("items_user")->where("user_id", "=", $data->user->id)->find_all();
+ $children_count = count($item_users);
+ foreach ($item_users as $item_user) {
+ $item_thumb = ORM::factory("item")
+ ->viewable()
+ ->where("type", "!=", "album")
+ ->where("id", ">=", $item_user->item_id)
+ ->find();
+ $item_thumbs[] = $item_thumb;
+ }
+ $page_size = module::get_var("gallery", "page_size", 9);
+ $page = (int) Input::instance()->get("page", "1");
+ $offset = ($page-1) * $page_size;
+ $max_pages = max(ceil($children_count / $page_size), 1);
+
+ // Make sure that the page references a valid offset
+ if ($page < 1) {
+ url::redirect($album->abs_url());
+ } else if ($page > $max_pages) {
+ url::redirect($album->abs_url("page=$max_pages"));
+ }
+ $view->set_global("page", $page);
+ $view->set_global("max_pages", $max_pages);
+ $view->set_global("page_size", $page_size);
+ $view->set_global("children", array_slice($item_thumbs, $offset, $page_size));;
+ $view->set_global("children_count", $children_count);
+ $view->set_global("total", $max_pages);
+ $view->set_global("position", t("Page") ." ". $page);
+ if ($children_count > 0) {
+ $data->content[] = (object)array("title" => t("Photos"), "view" => $view);
+ }
+ }
+
+
}
diff --git a/modules/photoannotation/helpers/photoannotation_theme.php b/modules/photoannotation/helpers/photoannotation_theme.php
index cbea80d1..844fab8d 100644
--- a/modules/photoannotation/helpers/photoannotation_theme.php
+++ b/modules/photoannotation/helpers/photoannotation_theme.php
@@ -22,6 +22,41 @@ class photoannotation_theme_Core {
if ($theme->page_subtype == "photo") {
$theme->css("photoannotation.css");
$theme->script("jquery.annotate.js");
+ $noborder = module::get_var("photoannotation", "noborder", false);
+ $noclickablehover = module::get_var("photoannotation", "noclickablehover", false);
+ $nohover = module::get_var("photoannotation", "nohover", false);
+ $bordercolor = "#". module::get_var("photoannotation", "bordercolor", "000000");
+ $v = "\n";
+ return $v;
}
}
@@ -31,10 +66,11 @@ class photoannotation_theme_Core {
}
}
- static function dynamic_top($theme) {
- return new View("photoannotation_user_profile.html");
- if ($theme->page_type == "photoannotationuserprofile") {
- return new View("photoannotation_user_profile.html");
+ static function admin_head($theme) {
+ if (strpos($theme->content->kohana_filename, "admin_photoannotation.html.php")) {
+ $theme->css("colorpicker.css");
+ $theme->script("colorpicker.js");
}
}
+
}
diff --git a/modules/photoannotation/images/blank.gif b/modules/photoannotation/images/blank.gif
new file mode 100644
index 00000000..75b945d2
Binary files /dev/null and b/modules/photoannotation/images/blank.gif differ
diff --git a/modules/photoannotation/images/colorpicker_background.png b/modules/photoannotation/images/colorpicker_background.png
new file mode 100644
index 00000000..8401572f
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_background.png differ
diff --git a/modules/photoannotation/images/colorpicker_hex.png b/modules/photoannotation/images/colorpicker_hex.png
new file mode 100644
index 00000000..4e532d7c
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_hex.png differ
diff --git a/modules/photoannotation/images/colorpicker_hsb_b.png b/modules/photoannotation/images/colorpicker_hsb_b.png
new file mode 100644
index 00000000..dfac595d
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_hsb_b.png differ
diff --git a/modules/photoannotation/images/colorpicker_hsb_h.png b/modules/photoannotation/images/colorpicker_hsb_h.png
new file mode 100644
index 00000000..3977ed9f
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_hsb_h.png differ
diff --git a/modules/photoannotation/images/colorpicker_hsb_s.png b/modules/photoannotation/images/colorpicker_hsb_s.png
new file mode 100644
index 00000000..a2a69973
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_hsb_s.png differ
diff --git a/modules/photoannotation/images/colorpicker_indic.gif b/modules/photoannotation/images/colorpicker_indic.gif
new file mode 100644
index 00000000..f9fa95e2
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_indic.gif differ
diff --git a/modules/photoannotation/images/colorpicker_overlay.png b/modules/photoannotation/images/colorpicker_overlay.png
new file mode 100644
index 00000000..561cdd9c
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_overlay.png differ
diff --git a/modules/photoannotation/images/colorpicker_rgb_b.png b/modules/photoannotation/images/colorpicker_rgb_b.png
new file mode 100644
index 00000000..dfac595d
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_rgb_b.png differ
diff --git a/modules/photoannotation/images/colorpicker_rgb_g.png b/modules/photoannotation/images/colorpicker_rgb_g.png
new file mode 100644
index 00000000..72b32760
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_rgb_g.png differ
diff --git a/modules/photoannotation/images/colorpicker_rgb_r.png b/modules/photoannotation/images/colorpicker_rgb_r.png
new file mode 100644
index 00000000..4855fe03
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_rgb_r.png differ
diff --git a/modules/photoannotation/images/colorpicker_select.gif b/modules/photoannotation/images/colorpicker_select.gif
new file mode 100644
index 00000000..599f7f13
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_select.gif differ
diff --git a/modules/photoannotation/images/colorpicker_submit.png b/modules/photoannotation/images/colorpicker_submit.png
new file mode 100644
index 00000000..566fe2dd
Binary files /dev/null and b/modules/photoannotation/images/colorpicker_submit.png differ
diff --git a/modules/photoannotation/images/custom_background.png b/modules/photoannotation/images/custom_background.png
new file mode 100644
index 00000000..cf55ffdd
Binary files /dev/null and b/modules/photoannotation/images/custom_background.png differ
diff --git a/modules/photoannotation/images/custom_hex.png b/modules/photoannotation/images/custom_hex.png
new file mode 100644
index 00000000..888f4444
Binary files /dev/null and b/modules/photoannotation/images/custom_hex.png differ
diff --git a/modules/photoannotation/images/custom_hsb_b.png b/modules/photoannotation/images/custom_hsb_b.png
new file mode 100644
index 00000000..2f99dae8
Binary files /dev/null and b/modules/photoannotation/images/custom_hsb_b.png differ
diff --git a/modules/photoannotation/images/custom_hsb_h.png b/modules/photoannotation/images/custom_hsb_h.png
new file mode 100644
index 00000000..a217e921
Binary files /dev/null and b/modules/photoannotation/images/custom_hsb_h.png differ
diff --git a/modules/photoannotation/images/custom_hsb_s.png b/modules/photoannotation/images/custom_hsb_s.png
new file mode 100644
index 00000000..7826b415
Binary files /dev/null and b/modules/photoannotation/images/custom_hsb_s.png differ
diff --git a/modules/photoannotation/images/custom_indic.gif b/modules/photoannotation/images/custom_indic.gif
new file mode 100644
index 00000000..222fb94c
Binary files /dev/null and b/modules/photoannotation/images/custom_indic.gif differ
diff --git a/modules/photoannotation/images/custom_rgb_b.png b/modules/photoannotation/images/custom_rgb_b.png
new file mode 100644
index 00000000..80764e5d
Binary files /dev/null and b/modules/photoannotation/images/custom_rgb_b.png differ
diff --git a/modules/photoannotation/images/custom_rgb_g.png b/modules/photoannotation/images/custom_rgb_g.png
new file mode 100644
index 00000000..fc9778be
Binary files /dev/null and b/modules/photoannotation/images/custom_rgb_g.png differ
diff --git a/modules/photoannotation/images/custom_rgb_r.png b/modules/photoannotation/images/custom_rgb_r.png
new file mode 100644
index 00000000..91b0cd4c
Binary files /dev/null and b/modules/photoannotation/images/custom_rgb_r.png differ
diff --git a/modules/photoannotation/images/custom_submit.png b/modules/photoannotation/images/custom_submit.png
new file mode 100644
index 00000000..cd202cd9
Binary files /dev/null and b/modules/photoannotation/images/custom_submit.png differ
diff --git a/modules/photoannotation/images/select.png b/modules/photoannotation/images/select.png
new file mode 100644
index 00000000..21213bfd
Binary files /dev/null and b/modules/photoannotation/images/select.png differ
diff --git a/modules/photoannotation/images/select2.png b/modules/photoannotation/images/select2.png
new file mode 100644
index 00000000..2cd2cabe
Binary files /dev/null and b/modules/photoannotation/images/select2.png differ
diff --git a/modules/photoannotation/images/slider.png b/modules/photoannotation/images/slider.png
new file mode 100644
index 00000000..8b03da96
Binary files /dev/null and b/modules/photoannotation/images/slider.png differ
diff --git a/modules/photoannotation/js/colorpicker.js b/modules/photoannotation/js/colorpicker.js
new file mode 100644
index 00000000..0c51991c
--- /dev/null
+++ b/modules/photoannotation/js/colorpicker.js
@@ -0,0 +1,484 @@
+/**
+ *
+ * Color picker
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ * Dual licensed under the MIT and GPL licenses
+ *
+ */
+(function ($) {
+ var ColorPicker = function () {
+ var
+ ids = {},
+ inAction,
+ charMin = 65,
+ visible,
+ tpl = '
',
+ defaults = {
+ eventName: 'click',
+ onShow: function () {},
+ onBeforeShow: function(){},
+ onHide: function () {},
+ onChange: function () {},
+ onSubmit: function () {},
+ color: 'ff0000',
+ livePreview: true,
+ flat: false
+ },
+ fillRGBFields = function (hsb, cal) {
+ var rgb = HSBToRGB(hsb);
+ $(cal).data('colorpicker').fields
+ .eq(1).val(rgb.r).end()
+ .eq(2).val(rgb.g).end()
+ .eq(3).val(rgb.b).end();
+ },
+ fillHSBFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(4).val(hsb.h).end()
+ .eq(5).val(hsb.s).end()
+ .eq(6).val(hsb.b).end();
+ },
+ fillHexFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(0).val(HSBToHex(hsb)).end();
+ },
+ setSelector = function (hsb, cal) {
+ $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
+ $(cal).data('colorpicker').selectorIndic.css({
+ left: parseInt(150 * hsb.s/100, 10),
+ top: parseInt(150 * (100-hsb.b)/100, 10)
+ });
+ },
+ setHue = function (hsb, cal) {
+ $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
+ },
+ setCurrentColor = function (hsb, cal) {
+ $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ setNewColor = function (hsb, cal) {
+ $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ keyDown = function (ev) {
+ var pressedKey = ev.charCode || ev.keyCode || -1;
+ if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
+ return false;
+ }
+ var cal = $(this).parent().parent();
+ if (cal.data('colorpicker').livePreview === true) {
+ change.apply(this);
+ }
+ },
+ change = function (ev) {
+ var cal = $(this).parent().parent(), col;
+ if (this.parentNode.className.indexOf('_hex') > 0) {
+ cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
+ } else if (this.parentNode.className.indexOf('_hsb') > 0) {
+ cal.data('colorpicker').color = col = fixHSB({
+ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
+ s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
+ });
+ } else {
+ cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
+ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
+ g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
+ }));
+ }
+ if (ev) {
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ }
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
+ },
+ blur = function (ev) {
+ var cal = $(this).parent().parent();
+ cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ },
+ focus = function () {
+ charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
+ $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ $(this).parent().addClass('colorpicker_focus');
+ },
+ downIncrement = function (ev) {
+ var field = $(this).parent().find('input').focus();
+ var current = {
+ el: $(this).parent().addClass('colorpicker_slider'),
+ max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
+ y: ev.pageY,
+ field: field,
+ val: parseInt(field.val(), 10),
+ preview: $(this).parent().parent().data('colorpicker').livePreview
+ };
+ $(document).bind('mouseup', current, upIncrement);
+ $(document).bind('mousemove', current, moveIncrement);
+ },
+ moveIncrement = function (ev) {
+ ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
+ if (ev.data.preview) {
+ change.apply(ev.data.field.get(0), [true]);
+ }
+ return false;
+ },
+ upIncrement = function (ev) {
+ change.apply(ev.data.field.get(0), [true]);
+ ev.data.el.removeClass('colorpicker_slider').find('input').focus();
+ $(document).unbind('mouseup', upIncrement);
+ $(document).unbind('mousemove', moveIncrement);
+ return false;
+ },
+ downHue = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ y: $(this).offset().top
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upHue);
+ $(document).bind('mousemove', current, moveHue);
+ },
+ moveHue = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(4)
+ .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upHue = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upHue);
+ $(document).unbind('mousemove', moveHue);
+ return false;
+ },
+ downSelector = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ pos: $(this).offset()
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upSelector);
+ $(document).bind('mousemove', current, moveSelector);
+ },
+ moveSelector = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(6)
+ .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
+ .end()
+ .eq(5)
+ .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upSelector = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upSelector);
+ $(document).unbind('mousemove', moveSelector);
+ return false;
+ },
+ enterSubmit = function (ev) {
+ $(this).addClass('colorpicker_focus');
+ },
+ leaveSubmit = function (ev) {
+ $(this).removeClass('colorpicker_focus');
+ },
+ clickSubmit = function (ev) {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').color;
+ cal.data('colorpicker').origColor = col;
+ setCurrentColor(col, cal.get(0));
+ cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
+ },
+ show = function (ev) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
+ var pos = $(this).offset();
+ var viewPort = getViewport();
+ var top = pos.top + this.offsetHeight;
+ var left = pos.left;
+ if (top + 176 > viewPort.t + viewPort.h) {
+ top -= this.offsetHeight + 176;
+ }
+ if (left + 356 > viewPort.l + viewPort.w) {
+ left -= 356;
+ }
+ cal.css({left: left + 'px', top: top + 'px'});
+ if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
+ cal.show();
+ }
+ $(document).bind('mousedown', {cal: cal}, hide);
+ return false;
+ },
+ hide = function (ev) {
+ if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
+ if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
+ ev.data.cal.hide();
+ }
+ $(document).unbind('mousedown', hide);
+ }
+ },
+ isChildOf = function(parentEl, el, container) {
+ if (parentEl == el) {
+ return true;
+ }
+ if (parentEl.contains) {
+ return parentEl.contains(el);
+ }
+ if ( parentEl.compareDocumentPosition ) {
+ return !!(parentEl.compareDocumentPosition(el) & 16);
+ }
+ var prEl = el.parentNode;
+ while(prEl && prEl != container) {
+ if (prEl == parentEl)
+ return true;
+ prEl = prEl.parentNode;
+ }
+ return false;
+ },
+ getViewport = function () {
+ var m = document.compatMode == 'CSS1Compat';
+ return {
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
+ };
+ },
+ fixHSB = function (hsb) {
+ return {
+ h: Math.min(360, Math.max(0, hsb.h)),
+ s: Math.min(100, Math.max(0, hsb.s)),
+ b: Math.min(100, Math.max(0, hsb.b))
+ };
+ },
+ fixRGB = function (rgb) {
+ return {
+ r: Math.min(255, Math.max(0, rgb.r)),
+ g: Math.min(255, Math.max(0, rgb.g)),
+ b: Math.min(255, Math.max(0, rgb.b))
+ };
+ },
+ fixHex = function (hex) {
+ var len = 6 - hex.length;
+ if (len > 0) {
+ var o = [];
+ for (var i=0; i -1) ? hex.substring(1) : hex), 16);
+ return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
+ },
+ HexToHSB = function (hex) {
+ return RGBToHSB(HexToRGB(hex));
+ },
+ RGBToHSB = function (rgb) {
+ var hsb = {
+ h: 0,
+ s: 0,
+ b: 0
+ };
+ var min = Math.min(rgb.r, rgb.g, rgb.b);
+ var max = Math.max(rgb.r, rgb.g, rgb.b);
+ var delta = max - min;
+ hsb.b = max;
+ if (max != 0) {
+
+ }
+ hsb.s = max != 0 ? 255 * delta / max : 0;
+ if (hsb.s != 0) {
+ if (rgb.r == max) {
+ hsb.h = (rgb.g - rgb.b) / delta;
+ } else if (rgb.g == max) {
+ hsb.h = 2 + (rgb.b - rgb.r) / delta;
+ } else {
+ hsb.h = 4 + (rgb.r - rgb.g) / delta;
+ }
+ } else {
+ hsb.h = -1;
+ }
+ hsb.h *= 60;
+ if (hsb.h < 0) {
+ hsb.h += 360;
+ }
+ hsb.s *= 100/255;
+ hsb.b *= 100/255;
+ return hsb;
+ },
+ HSBToRGB = function (hsb) {
+ var rgb = {};
+ var h = Math.round(hsb.h);
+ var s = Math.round(hsb.s*255/100);
+ var v = Math.round(hsb.b*255/100);
+ if(s == 0) {
+ rgb.r = rgb.g = rgb.b = v;
+ } else {
+ var t1 = v;
+ var t2 = (255-s)*v/255;
+ var t3 = (t1-t2)*(h%60)/60;
+ if(h==360) h = 0;
+ if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
+ else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
+ else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
+ else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
+ else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
+ else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
+ else {rgb.r=0; rgb.g=0; rgb.b=0}
+ }
+ return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
+ },
+ RGBToHex = function (rgb) {
+ var hex = [
+ rgb.r.toString(16),
+ rgb.g.toString(16),
+ rgb.b.toString(16)
+ ];
+ $.each(hex, function (nr, val) {
+ if (val.length == 1) {
+ hex[nr] = '0' + val;
+ }
+ });
+ return hex.join('');
+ },
+ HSBToHex = function (hsb) {
+ return RGBToHex(HSBToRGB(hsb));
+ },
+ restoreOriginal = function () {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').origColor;
+ cal.data('colorpicker').color = col;
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ };
+ return {
+ init: function (opt) {
+ opt = $.extend({}, defaults, opt||{});
+ if (typeof opt.color == 'string') {
+ opt.color = HexToHSB(opt.color);
+ } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
+ opt.color = RGBToHSB(opt.color);
+ } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
+ opt.color = fixHSB(opt.color);
+ } else {
+ return this;
+ }
+ return this.each(function () {
+ if (!$(this).data('colorpickerId')) {
+ var options = $.extend({}, opt);
+ options.origColor = opt.color;
+ var id = 'collorpicker_' + parseInt(Math.random() * 1000);
+ $(this).data('colorpickerId', id);
+ var cal = $(tpl).attr('id', id);
+ if (options.flat) {
+ cal.appendTo(this).show();
+ } else {
+ cal.appendTo(document.body);
+ }
+ options.fields = cal
+ .find('input')
+ .bind('keyup', keyDown)
+ .bind('change', change)
+ .bind('blur', blur)
+ .bind('focus', focus);
+ cal
+ .find('span').bind('mousedown', downIncrement).end()
+ .find('>div.colorpicker_current_color').bind('click', restoreOriginal);
+ options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
+ options.selectorIndic = options.selector.find('div div');
+ options.el = this;
+ options.hue = cal.find('div.colorpicker_hue div');
+ cal.find('div.colorpicker_hue').bind('mousedown', downHue);
+ options.newColor = cal.find('div.colorpicker_new_color');
+ options.currentColor = cal.find('div.colorpicker_current_color');
+ cal.data('colorpicker', options);
+ cal.find('div.colorpicker_submit')
+ .bind('mouseenter', enterSubmit)
+ .bind('mouseleave', leaveSubmit)
+ .bind('click', clickSubmit);
+ fillRGBFields(options.color, cal.get(0));
+ fillHSBFields(options.color, cal.get(0));
+ fillHexFields(options.color, cal.get(0));
+ setHue(options.color, cal.get(0));
+ setSelector(options.color, cal.get(0));
+ setCurrentColor(options.color, cal.get(0));
+ setNewColor(options.color, cal.get(0));
+ if (options.flat) {
+ cal.css({
+ position: 'relative',
+ display: 'block'
+ });
+ } else {
+ $(this).bind(options.eventName, show);
+ }
+ }
+ });
+ },
+ showPicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ show.apply(this);
+ }
+ });
+ },
+ hidePicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ $('#' + $(this).data('colorpickerId')).hide();
+ }
+ });
+ },
+ setColor: function(col) {
+ if (typeof col == 'string') {
+ col = HexToHSB(col);
+ } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
+ col = RGBToHSB(col);
+ } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
+ col = fixHSB(col);
+ } else {
+ return this;
+ }
+ return this.each(function(){
+ if ($(this).data('colorpickerId')) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').color = col;
+ cal.data('colorpicker').origColor = col;
+ fillRGBFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setCurrentColor(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ }
+ });
+ }
+ };
+ }();
+ $.fn.extend({
+ ColorPicker: ColorPicker.init,
+ ColorPickerHide: ColorPicker.hidePicker,
+ ColorPickerShow: ColorPicker.showPicker,
+ ColorPickerSetColor: ColorPicker.setColor
+ });
+})(jQuery);
diff --git a/modules/photoannotation/js/jquery.annotate.js b/modules/photoannotation/js/jquery.annotate.js
index 49f3e580..ba98339e 100644
--- a/modules/photoannotation/js/jquery.annotate.js
+++ b/modules/photoannotation/js/jquery.annotate.js
@@ -243,7 +243,7 @@
notetitle = this.note.text;
selecteduser = " selected=\"selected\"";
}
- var userdropdown = '