public void view_contribution(collection_item i)
        {
            //ImageSource src = new BitmapImage(new Uri(configurations.GetAbsoluteContributionPath() + contribution_id.ToString() + ".jpg"));
            //window_manager.contributions.Add(contribution_id, src);
            //the_image.Source = src;
            this.item = i;
            //the_media.Visibility = System.Windows.Visibility.Collapsed;
            //the_image.Visibility = System.Windows.Visibility.Visible;
            if (i.is_image || i.is_audio)
            {
                if (i.is_audio)
                {
                    the_item.Background = new ImageBrush(configurations.img_sound_image_pic);
                    the_item.UpdateLayout();
                    string fname = i._contribution.media_url;
                    string ext = fname.Substring(fname.Length - 4, 4);
                    the_media.Source = new Uri(configurations.GetAbsoluteContributionPath() + item._contribution.id.ToString() + ext);
                    the_media.Play();
                    return;
                }
                //if (window_manager.contributions.ContainsKey(i._contribution.id))
                //{
                //    double h = window_manager.contributions[i._contribution.id].Height;
                //    double w = window_manager.contributions[i._contribution.id].Width;
                //    the_item.Height = (h / w) * the_item.Width;
                //    the_item.Background = new ImageBrush(window_manager.contributions[i._contribution.id]);
                //    the_item.UpdateLayout();
                //}
                //else
                //{
                    worker.DoWork += new DoWorkEventHandler(load_image);
                    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(show_image);
                    worker.RunWorkerAsync((object)i._contribution.id);
                //}

            }
            if (i.is_video)
            {
                if (window_manager.thumbnails.ContainsKey(i._contribution.id))
                {
                    the_item.Background = new ImageBrush(window_manager.thumbnails[i._contribution.id]);
                    the_item.UpdateLayout();
                }
                string fname = i._contribution.media_url;
                string ext = fname.Substring(fname.Length - 4, 4);
                the_media.Source = new Uri(configurations.GetAbsoluteContributionPath() + item._contribution.id.ToString() + ext);
                the_media.Play();
                the_media.MediaOpened += new RoutedEventHandler(the_media_MediaOpened);
                //the_media.Loaded += new RoutedEventHandler(the_media_Loaded);
            }
        }
        public bool start_drag(ListBoxItem item, collection_item contribution_item, TouchDevice touch_device, ImageSource i)
        {
            Image i2 = new Image();
            i2.Source = i;
            ContentControl cursorVisual = new ContentControl()
            {
                Content = i2,
                Style = FindResource("CursorStyle") as Style
            };

            //SurfaceDragDrop.AddTargetChangedHandler(cursorVisual, OnTargetChanged);

            List<InputDevice> devices = new List<InputDevice>();
            devices.Add(touch_device);
            foreach (TouchDevice touch in item.TouchesCapturedWithin)
            {
                if (touch != touch_device)
                {
                    devices.Add(touch);
                }
            }

            SurfaceDragCursor startDragOkay =
                SurfaceDragDrop.BeginDragDrop(
                  this.contributions,         // The SurfaceListBox object that the cursor is dragged out from.
                  item,                       // The SurfaceListBoxItem object that is dragged from the drag source.
                  cursorVisual,               // The visual element of the cursor.
                  contribution_item,          // The data associated with the cursor.
                  devices,                    // The input devices that start dragging the cursor.
                  DragDropEffects.Copy);      // The allowed drag-and-drop effects of the operation.

            return (startDragOkay != null);
        }
        public static void open_contribution_window(collection_item citem, double pos_x, double pos_y, string ctype)
        {
            if (window_manager.image_frames.Count + 1 > configurations.max_image_display_frame)
                return;

            //window_frame frame = new window_frame();
            window_content content = new window_content();
            //contribution_view m = new contribution_view();
            //m.view_contribution(citem);
            image_frame iframe = new image_frame();
            iframe.view_contribution(citem);
            content.initialize_comments(citem._contribution);
            iframe.window_content.Content = content;
            if (!configurations.center_commentarea_and_keyboard)
            {
                iframe.the_content.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
                content.center_keyboard = false;
            }
            iframe.UpdateLayout();
            content.initialize_contents(null, Type.GetType("nature_net.Contribution"), citem._contribution.id, iframe, iframe.the_content.Width);
            //frame.window_content.Content = content;
            //window_manager.image_display_frames.Add(frame);
            //open_window(frame, pos_x, pos_y);
            //m.center_image();
            //frame.hide_change_view();
            //frame.set_title(ctype);
            main_canvas.Children.Add(iframe);
            iframe.UpdateLayout();
            window_manager.image_frames.Add(iframe);

            double h = iframe.ActualHeight;
            pos_x = pos_x - (iframe.ActualWidth / 2);
            //try { h = ((window_content)(iframe.window_content.Content)).the_item.ActualHeight; }
            //catch (Exception) { }
            if (pos_y > window_manager.main_canvas.ActualHeight - h)
                pos_y = window_manager.main_canvas.ActualHeight - h;
            TranslateTransform m = new TranslateTransform(pos_x, pos_y);
            Matrix matrix = m.Value;
            iframe.RenderTransform = new MatrixTransform(matrix);
            UpdateZOrder(iframe, true);
        }
        public collection_item create_collection_item_from_contribution(Contribution c)
        {
            collection_item ci = new collection_item();
            ci._contribution = c;
            int i = c.id;

            if (c.media_url == null) return ci;
            string fname = c.media_url;
            string ext = fname.Substring(fname.Length - 4, 4);
            ext = ext.ToLower();
            if (ext == ".jpg" || ext == ".bmp" || ext == ".png")
                ci.is_image = true;
            if (ext == ".wmv" || ext == ".mpg" || ext == "mpeg" || ext == ".avi" || ext == ".mp4" || ext == ".3gp" || ext == ".mov")
                ci.is_video = true;
            if (ext == ".wav" || ext == ".mp3")
                ci.is_audio = true;

            if (!window_manager.thumbnails.ContainsKey(i))
            {
                if (!window_manager.downloaded_contributions.Contains(i))
                {
                    bool result = file_manager.download_file_from_googledirve(c.media_url, i);
                    if (result) window_manager.downloaded_contributions.Add(i);
                }

                ImageSource img = null;
                if (ci.is_image)
                    img = configurations.GetThumbnailFromImage(i.ToString() + ext, configurations.thumbnail_pixel_height);
                if (ci.is_video)
                    img = configurations.GetThumbnailFromVideo(i.ToString() + ext, configurations.thumbnail_video_span, configurations.thumbnail_pixel_height);
                if (ci.is_audio)
                    img = configurations.img_sound_image_pic;
                if (img == null)
                    return ci;

                if (!window_manager.thumbnails.ContainsKey(i))
                {
                    // save the thumbnail
                    try
                    {
                        BitmapSource bs = img as BitmapSource;
                        if (!ci.is_audio)
                        {
                            configurations.SaveThumbnail(bs, i.ToString());
                        }
                        img = new BitmapImage(new Uri(configurations.GetAbsoluteThumbnailPath() + i.ToString() + ".jpg"));
                        img.Freeze();
                        window_manager.thumbnails.Add(i, img);
                    }
                    catch (Exception) { }   // not a problem
                }
            }

            return ci;
        }