c783939f894519dd00cbabdd07c44403e71763c1
[phpfspot.git] / phpfspot.class.php
1 <?php
2
3 require_once "phpfspot_cfg.php";
4 require_once "phpfspot_db.php";
5 require_once "phpfspot_tmpl.php";
6
7 class PHPFSPOT {
8
9    var $cfg;
10    var $db;
11    var $cfg_db;
12    var $tmpl;
13    var $tags;
14    var $avail_tags;
15    var $current_tags;
16
17    public function __construct()
18    {
19       $this->cfg = new PHPFSPOT_CFG;
20
21       $this->db = new PHPFSPOT_DB(&$this, $this->cfg->fspot_db);
22       $this->cfg_db = new PHPFSPOT_DB(&$this, $this->cfg->phpfspot_db);
23       $this->tmpl = new PHPFSPOT_TMPL($this);
24
25       $this->get_tags();
26
27    } // __construct()
28
29    public function __destruct()
30    {
31
32    } // __destruct()
33
34    public function show()
35    {
36       $this->tmpl->assign('page_title', $this->cfg->page_title);
37       $this->tmpl->show("index.tpl");
38
39    } // show()
40
41    private function get_tags()
42    {
43       $this->avail_tags = Array();
44       $count = 0;
45    
46       $result = $this->db->db_query("
47          SELECT id,name
48          FROM tags
49          ORDER BY sort_priority ASC
50       ");
51       
52       while($row = $this->db->db_fetch_object($result)) {
53
54          $tag_id = $row['id'];
55          $tag_name = $row['name'];
56
57          $this->tags[$tag_id] = $tag_name; 
58          $this->avail_tags[$count] = $tag_id;
59
60          $count++;
61
62       }
63
64    } // get_tags()
65
66    public function get_photo_details($idx)
67    {
68       $result = $this->db->db_query("
69          SELECT *
70          FROM photos
71          WHERE id='". $idx ."'
72       ");
73       
74       return $this->db->db_fetch_object($result);
75
76    } // get_photo_details
77
78    public function translate_path($path, $width = 0)
79    {  
80       return str_replace($this->cfg->path_replace_from, $this->cfg->path_replace_to, $path);
81
82    } // translate_path
83
84    public function showPhoto($photo)
85    {
86       $all_photos = $this->getAllTagPhotos();
87
88       foreach($all_photos as $all_photo) {
89          
90          if($get_next) {
91             $next_img = $all_photo;
92             break;
93          }
94
95          if($all_photo == $photo) {
96             $get_next = 1;
97          }
98          else {
99             $previous_img = $all_photo;
100          }
101       }
102
103
104       $details = $this->get_photo_details($photo);
105       $meta = $this->get_meta_informations($this->translate_path($details['directory_path']) ."/". $details['name']);
106
107       $this->tmpl->assign('c_date', $meta['DateTime']);
108       $this->tmpl->assign('madewith', $meta['Make'] ." ". $meta['Model']);
109       $this->tmpl->assign('image_name', $details['name']);
110       $this->tmpl->assign('image_url', 'phpfspot_img.php?idx='. $photo ."&amp;width=". $this->cfg->photo_width);
111
112       if($previous_img) {
113          $this->tmpl->assign('previous_url', "javascript:showImage(". $previous_img .");");
114       }
115
116       if($next_img) {
117          $this->tmpl->assign('next_url', "javascript:showImage(". $next_img .");");
118       }
119
120       $this->tmpl->show("single_photo.tpl");
121
122    } // showPhoto()
123
124    public function getAvailableTags()
125    {
126       foreach($this->avail_tags as $tag)
127       {
128          if(isset($_SESSION['selected_tags']) && in_array($tag, $_SESSION['selected_tags']))
129             continue;
130
131          // return all available (= not selected) tags
132          print "<a href=\"javascript:Tags('add', ". $tag .");\">". $this->tags[$tag] ."</a>&nbsp;";
133
134       }
135
136    } // getAvailableTags()
137
138    public function getSelectedTags()
139    {
140       foreach($this->avail_tags as $tag)
141       {
142          // return all selected tags
143          if(isset($_SESSION['selected_tags']) && in_array($tag, $_SESSION['selected_tags'])) {
144             print "<a href=\"javascript:Tags('del', ". $tag .");\">". $this->tags[$tag] ."</a>&nbsp;";
145          }
146
147       }
148
149    } // getSelectedTags()
150
151    public function addTag($tag)
152    {
153       if(!isset($_SESSION['selected_tags']))
154          $_SESSION['selected_tags'] = Array();
155
156       array_push($_SESSION['selected_tags'], $tag);
157    
158    } // addTag()
159
160    public function delTag($tag)
161    {
162       if(isset($_SESSION['selected_tags'])) {
163          $key = array_search($tag, $_SESSION['selected_tags']);
164          unset($_SESSION['selected_tags'][$key]);
165       }
166
167    } // delTag()
168
169    public function resetTags()
170    {
171       unset($_SESSION['selected_tags']);
172
173    } // resetTags()
174
175    public function getAllTagPhotos()
176    {  
177       $tagged_photos = Array();
178
179       if(isset($_SESSION['selected_tags'])) {
180          $selected = "";
181          foreach($_SESSION['selected_tags'] as $tag)
182             $selected.= $tag .",";
183          $selected = substr($selected, 0, strlen($selected)-1);
184          $result = $this->db->db_query("
185             SELECT DISTINCT photo_id
186                FROM photo_tags pt
187             INNER JOIN photos p
188                ON p.id=pt.photo_id
189             WHERE pt.tag_id IN (". $selected .")
190             ORDER BY p.time ASC
191          ");
192       }
193       else {
194          $result = $this->db->db_query("
195             SELECT DISTINCT photo_id
196                FROM photo_tags pt
197             INNER JOIN photos p
198                ON p.id=pt.photo_id
199             ORDER BY p.time ASC
200          ");
201       }
202
203       while($row = $this->db->db_fetch_object($result)) {
204          array_push($tagged_photos, $row['photo_id']);
205       }
206
207       return $tagged_photos;
208
209    } // getAllTagPhotos()
210
211    public function showPhotoIndex()
212    {
213       $photos = $this->getAllTagPhotos();
214       $count = count($photos);
215
216       $rows = 0;
217       $cols = 0;
218       $images[$rows] = Array();
219
220       for($i = 0; $i < $count; $i++) {
221
222          $images[$rows][$cols] = $photos[$i];
223
224          if($cols == $this->cfg->thumbs_per_row-1) {
225             $cols = 0;
226             $rows++;
227             $images[$rows] = Array();
228          }
229          else {
230             $cols++;
231          }
232       } 
233
234       // +1 for for smarty's selection iteration
235       $rows++;
236
237          //$images.= "<img src=\"phpfspot_img.php?idx=". $photo ."&amp;width=". $this->cfg->thumb_width ."\" /><br />\n";
238
239       $this->tmpl->assign('count', $count);
240       $this->tmpl->assign('width', $this->cfg->thumb_width);
241       $this->tmpl->assign('images', $images);
242       $this->tmpl->assign('rows', $rows);
243       $this->tmpl->assign('columns', $this->cfg->thumbs_per_row);
244       $this->tmpl->show("photo_index.tpl");
245
246
247    } // showPhotoIndex()
248
249    public function showBubbleDetails($photo, $direction)
250    {
251       if($direction == "up")
252          $direction = "bubbleimg_up";
253       else
254          $direction = "bubbleimg_down";
255
256       $details = $this->get_photo_details($photo);
257
258       $image_url = "phpfspot_img.php?idx=". $photo ."&amp;width=200";
259
260       $filesize = filesize($this->translate_path($details['directory_path'])  ."/". $details['name']);
261       $filesize = rand($filesize/1024, 2);
262
263       $img = getimagesize($this->translate_path($details['directory_path'])  ."/". $details['name']);
264
265       $this->tmpl->assign('file_size', $filesize);
266       $this->tmpl->assign('width', $img[0]);
267       $this->tmpl->assign('height', $img[1]);
268       $this->tmpl->assign('file_name', $details['name']);
269       $this->tmpl->assign('image_id', $direction);
270       $this->tmpl->assign('image_url', $image_url);
271       $this->tmpl->show("bubble_details.tpl");
272
273    } // showBubbleDetails()
274
275    public function showCredits()
276    {
277       $this->tmpl->assign('version', $this->cfg->version);
278       $this->tmpl->assign('product', $this->cfg->product);
279       $this->tmpl->show("credits.tpl");
280
281    } // showCredits()
282
283    public function resize_image($image, $width)
284    {  
285       // if thumbnail already exists, don't recreate it
286       if(file_exists(dirname($image) ."/thumbs/". $width ."_". basename($image)))
287          return;
288
289       $src_img = @imagecreatefromjpeg($image);
290
291       if($src_img)
292       {  
293          /* grabs the height and width */
294          $new_w = imagesx($src_img);
295          $new_h = imagesy($src_img);
296
297          // If requested width is more then the actual image width,
298          // do not generate a thumbnail
299
300          if($width >= $new_w) {
301             imagedestroy($src_img);
302             return;
303          }
304
305          /* calculates aspect ratio */
306          $aspect_ratio = $new_h / $new_w;
307
308          /* sets new size */
309          $new_w = $width;
310          $new_h = abs($new_w * $aspect_ratio);
311
312          /* creates new image of that size */
313          $dst_img = imagecreatetruecolor($new_w,$new_h);
314
315          imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255));
316
317          /* copies resized portion of original image into new image */
318          imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_w,$new_h,imagesx($src_img),imagesy($src_img));
319
320          /* write down new generated file */
321
322          if(!file_exists(dirname($image) ."/thumbs"))
323             mkdir(dirname($image) ."/thumbs");
324
325          $newfile = dirname($image) ."/thumbs/". $width ."_". basename($image);
326          imagejpeg($dst_img, $newfile, 75);
327
328          /* free your mind */
329          imagedestroy($dst_img);
330          imagedestroy($src_img);
331       }
332
333    } // resize_image()
334
335    public function get_meta_informations($file)
336    {
337
338       return exif_read_data($file);
339
340    } // get_meta_informations()
341
342 }
343
344 ?>