51eb4c6d4119b37ba08d927697f1c3e2ec7ac35f
[bizou.git] / plugins / _disabled / balanced / scripts.js
1 function applyOptimalImagesSize()\r
2 {\r
3         var divimages = document.getElementsByClassName("image");\r
4         var images = new Array();\r
5         for(var i = 0 ; i < divimages.length ; ++i)\r
6         {\r
7                 images.push(divimages[i].children[0].children[0]);\r
8         }\r
9         var bestHeight = parseInt(document.getElementById("thumbsize").textContent);\r
10         var newHList = getOptimalHeights(images, bestHeight);\r
11         for( var i = 0 ; i < images.length ; ++i)\r
12         {\r
13                 images[i].height = newHList[i];\r
14         }\r
15 }\r
16 \r
17 //Renvoi un tuple (with,height) de la taille de la surface d'affichage du navigateur\r
18 function getClientWindowSize()\r
19 {\r
20         var w = 0;\r
21         var h = 0;\r
22         \r
23          if (document.body)\r
24         {\r
25                 w = (document.body.clientWidth);\r
26                 h = (document.body.clientHeight);\r
27         }\r
28         else\r
29         {\r
30                 w = (window.innerWidth);\r
31                 h = (window.innerHeight);\r
32         }\r
33         \r
34         return [w,h];\r
35 }\r
36 \r
37 //renvoie la hauteur optimal de chaque image pour occuper toute la largeur de la surface d'affichage\r
38 function getOptimalHeights(images, bestHeight)\r
39 {\r
40         var imageHeight = bestHeight;\r
41         var originalSizes = getAllImageSizesForHeight(images, imageHeight);\r
42         var clientSize = getClientWindowSize();\r
43         var newHeights = new Array();\r
44         var allWidth = new Array();\r
45         for(var i = 0 ; i < originalSizes.length ; ++i)\r
46         {\r
47                 allWidth.push(originalSizes[i][0]);\r
48         }\r
49         \r
50         var splittedWidth = splitTab(allWidth, clientSize[0]);\r
51         for(var i = 0 ; i < splittedWidth.length ; ++i)\r
52         {\r
53                 var sum = 15;\r
54                 var ratiosum = 0.0;\r
55                 for(var j=0 ; j< splittedWidth[i].length ; ++j)\r
56                 { \r
57                         sum += splittedWidth[i][j] + 5; \r
58                         ratiosum += parseFloat(splittedWidth[i][j]) / parseFloat(imageHeight);\r
59                 }\r
60                 var deltaHeight = parseInt((clientSize[0] - sum) / parseFloat(ratiosum));\r
61                 \r
62                 var lastandtoobig = i == (splittedWidth.length-1) && sum < clientSize[0]/2;\r
63 \r
64                 for(var j=0 ; j< splittedWidth[i].length ; ++j)\r
65                 { \r
66                         if(lastandtoobig)\r
67                         {\r
68                                 newHeights.push(bestHeight);\r
69                         }\r
70                         else\r
71                         {\r
72                                 newHeights.push(imageHeight + deltaHeight);\r
73                         }\r
74                 }\r
75         }\r
76         return newHeights;\r
77 }\r
78 \r
79 //donne la taille de toutes les images affichées\r
80 function getAllImageSizes(images)\r
81 {\r
82         var sizes = new Array();\r
83         for (var i = 0; i < images.length; i++) {\r
84                 sizes.push([images[i].width, images[i].height]);\r
85         }\r
86         return sizes;\r
87 }\r
88 \r
89 //donne la taille de toutes les images affichées, redimensionnées pour une hauteur donnée\r
90 function getAllImageSizesForHeight(images, height)\r
91 {\r
92         var sizes = new Array();\r
93         for (var i = 0; i < images.length; i++) {\r
94                 sizes.push([images[i].width / (images[i].height / height) , height]);\r
95         }\r
96         return sizes;\r
97 }\r
98 \r
99 \r
100 \r
101 \r
102 //Renvoi un tableau de tableau, correspondant au découpage du tableau d'entrée découpé par tranche de MAX\r
103 function splitTab(tab, max)\r
104 {\r
105         var splitedTabs = [new Array()];\r
106         var sumSize = 15;\r
107         for (var i = 0; i < tab.length; i++)\r
108         {\r
109                 element = tab[i];\r
110                 \r
111                 var total = sumSize + element + 5;\r
112                 //regles arbirtaire de découpage en plus de total > max\r
113                 //(parce que ca rend mieux visuellement)\r
114                 //=> on ajoute la suite l'élement qui dépasse si sa taille fait moins d'1/4 de max\r
115                 //=> ou si l'écart restant représente plus de la moitié de l'élément à ajouter\r
116                 if((total > max && (sumSize > max ||(max - sumSize) > (element / 2) || element > max / 4)) || element >= max)\r
117                 {\r
118                         splitedTabs.push(new Array());\r
119                         splitedTabs[splitedTabs.length - 1].push(element);\r
120                         sumSize = 16 + element + 4;\r
121                 }\r
122                 else\r
123                 {\r
124                         splitedTabs[splitedTabs.length - 1].push(element);\r
125                         sumSize = total;\r
126                 }\r
127         }       \r
128         return splitedTabs;\r
129 }\r