From b5ab6830421b7147eac005470f50d0cb44080daf Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <benoit.pin@gmail.com>
Date: Sun, 31 Aug 2014 20:29:38 +0200
Subject: [PATCH 01/16] =?utf8?q?Callback=20ajax=20apr=C3=A8s=20d=C3=A9plac?=
 =?utf8?q?ement.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/photo_lightbox_viewer.js | 50 ++++++++++++++++++++++++++++------
 skins/portfolio_move_photos.py | 17 ++++++++++++
 2 files changed, 59 insertions(+), 8 deletions(-)
 create mode 100644 skins/portfolio_move_photos.py

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index cffa157..f4c4498 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -490,25 +490,59 @@ Lightbox.prototype.onDragOver = function(evt) {
 	if (target !== this.dragged) {
 		target.classList.add('dragover');
 	}
-	if (this.previousDragOver && this.previousDragOver !== target) {
-		this.previousDragOver.classList.remove('dragover');
+	if (this.lastDropTarget && this.lastDropTarget !== target) {
+		this.lastDropTarget.classList.remove('dragover');
 	}
-	this.previousDragOver = target;
+	this.lastDropTarget = target;
 };
 
 Lightbox.prototype.onDragEnd = function(evt) {
-	if (this.previousDragOver) {
-		this.previousDragOver.classList.remove('dragover');
+	if (this.lastDropTarget) {
+		this.lastDropTarget.classList.remove('dragover');
 		var i, slide;
 		for(i=this.draggedSelection.length -1 ; i>=0 ; i--) {
-			console.log(i);
 			slide = this.draggedSelection[i].cloneNode(true);
-			this.grid.insertBefore(slide, this.previousDragOver.nextSibling);
+			this.grid.insertBefore(slide, this.lastDropTarget.nextSibling);
 			slide.style.opacity = 1;
 			slide.style.width = '';
 		}
+		this.moveSelectedPhotos();
 	}
-	this.draggedSelection = this.previousDragOver = this.dragged = undefined;
+	// this.draggedSelection = this.lastDropTarget
+	this.dragged = undefined;
+};
+
+Lightbox.prototype.moveSelectedPhotos = function() {
+	var req = new XMLHttpRequest();
+	self = this;
+	req.onreadystatechange = function() {
+		switch (req.readyState) {
+			case 1 :
+				showProgressImage();
+				break;
+			case 4 :
+				hideProgressImage();
+				if (req.status === 200) {
+					console.log(req.responseText);
+					// self._refreshGrid(req);
+				}
+				break;
+		}
+	};
+	
+	var url = absolute_url() + '/portfolio_move_photos';
+  	req.open("POST", url, true);
+  	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
+	var query = 'container_type=' + this.container_type;
+	var i;
+	for (i=0 ; i<this.draggedSelection.length ; i++) {
+		query += '&uids:list=' + this.draggedSelection[i].getAttribute('name');
+	}
+	query += '&afterUid=' + this.lastDropTarget.getAttribute('name');
+  	req.send(query);
+};
+
+Lightbox.prototype.moveSelectedPhoto = function() {
 };
 
 }());
\ No newline at end of file
diff --git a/skins/portfolio_move_photos.py b/skins/portfolio_move_photos.py
new file mode 100644
index 0000000..99c8ba1
--- /dev/null
+++ b/skins/portfolio_move_photos.py
@@ -0,0 +1,17 @@
+##parameters=
+req = context.REQUEST
+form = req.form
+fg = form.get
+
+container_type = fg('container_type')
+if container_type == 'portfolio' :
+    from Products.CMFCore.utils import getUtilityByInterfaceName
+    uidh = getUtilityByInterfaceName('Products.CMFUid.interfaces.IUniqueIdHandler')
+    ctool = getUtilityByInterfaceName('Products.CMFCore.interfaces.ICatalogTool')
+    dropId = uidh.getBrain(int(fg('afterUid'))).getId
+    uids = fg('uids', [])
+    ids = [uidh.getBrain(uid).getId for uid in uids]
+    context.moveObjectsAfter(ids, dropId)
+
+return printed
+
-- 
2.20.1


From 9d15a219a1b6910463064c64f9c211c606b4b5eb Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <benoit.pin@gmail.com>
Date: Sun, 31 Aug 2014 21:44:36 +0200
Subject: [PATCH 02/16] =?utf8?q?Traitement=20de=20la=20r=C3=A9ponse=20http?=
 =?utf8?q?=20lors=20d'un=20tri.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/photo_lightbox_viewer.js | 33 ++++++++++++++++++++++++++++-----
 skins/portfolio_move_photos.py |  7 ++++++-
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index f4c4498..3c69aec 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -500,8 +500,10 @@ Lightbox.prototype.onDragEnd = function(evt) {
 	if (this.lastDropTarget) {
 		this.lastDropTarget.classList.remove('dragover');
 		var i, slide;
+		this.pendingMovedSlides = [];
 		for(i=this.draggedSelection.length -1 ; i>=0 ; i--) {
 			slide = this.draggedSelection[i].cloneNode(true);
+			this.pendingMovedSlides.push(slide);
 			this.grid.insertBefore(slide, this.lastDropTarget.nextSibling);
 			slide.style.opacity = 1;
 			slide.style.width = '';
@@ -522,10 +524,7 @@ Lightbox.prototype.moveSelectedPhotos = function() {
 				break;
 			case 4 :
 				hideProgressImage();
-				if (req.status === 200) {
-					console.log(req.responseText);
-					// self._refreshGrid(req);
-				}
+				self._moveSelectedPhotos(req)
 				break;
 		}
 	};
@@ -542,7 +541,31 @@ Lightbox.prototype.moveSelectedPhotos = function() {
   	req.send(query);
 };
 
-Lightbox.prototype.moveSelectedPhoto = function() {
+Lightbox.prototype._moveSelectedPhotos = function(req) {
+	var i, slide;
+	if (req.status === 200) {
+		var doc = req.responseXML.documentElement;
+		if (doc.nodeName === 'ok') {
+			this.pendingMovedSlides = undefined;
+			for(i=0 ; i<this.draggedSelection.length ; i++) {
+				slide = this.draggedSelection[i];
+				this.grid.removeChild(slide);
+			}
+			this.cbIndex = undefined;
+			return;
+		}
+	}
+	
+	for(i=0 ; i<this.pendingMovedSlides.length ; i++) {
+		slide = this.pendingMovedSlides[i];
+		this.grid.removeChild(slide);
+	}
+	
+	for(i=0 ; i<this.draggedSelection.length ; i++) {
+		slide = this.draggedSelection[i];
+		slide.style.opacity = 1;
+		slide.style.width = '';
+	}
 };
 
 }());
\ No newline at end of file
diff --git a/skins/portfolio_move_photos.py b/skins/portfolio_move_photos.py
index 99c8ba1..afee01d 100644
--- a/skins/portfolio_move_photos.py
+++ b/skins/portfolio_move_photos.py
@@ -11,7 +11,12 @@ if container_type == 'portfolio' :
     dropId = uidh.getBrain(int(fg('afterUid'))).getId
     uids = fg('uids', [])
     ids = [uidh.getBrain(uid).getId for uid in uids]
-    context.moveObjectsAfter(ids, dropId)
+    context.REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml;;charset=utf-8')
+    try :
+        context.moveObjectsAfter(ids, dropId)
+        return '<ok/>'
+    except NotImplementedError :
+        raise
 
 return printed
 
-- 
2.20.1


From 42f8aecd3f2b63a3929bb3a0baf420c6bd47b05f Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <benoit.pin@gmail.com>
Date: Thu, 4 Sep 2014 22:51:23 +0200
Subject: [PATCH 03/16] =?utf8?q?Introduction=20d'un=20syst=C3=A8me=20de=20?=
 =?utf8?q?remise=20scriptable.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/my_cart.py          | 184 ++++++++++++++++++++------------------
 skins/my_cart_template.pt |   5 ++
 2 files changed, 100 insertions(+), 89 deletions(-)

diff --git a/skins/my_cart.py b/skins/my_cart.py
index f305a1e..e12acec 100755
--- a/skins/my_cart.py
+++ b/skins/my_cart.py
@@ -22,127 +22,133 @@ form = context.REQUEST.form
 nextStep = None
 
 if cart.locked :
-	pendingOrder = context.restrictedTraverse(cart.pendingOrderPath)
-	return context.setRedirect(pendingOrder, 'object/view', ajax=form.get('ajax'))
+    pendingOrder = context.restrictedTraverse(cart.pendingOrderPath)
+    return context.setRedirect(pendingOrder, 'object/view', ajax=form.get('ajax'))
 
 if order :
-	if isAnon :
-		atool = portal.portal_actions
-		came_from = '%s/my_cart' % portal_url
-		return context.setRedirect(atool, 'customer/login', came_from=came_from, ajax=form.get('ajax'))
+    if isAnon :
+        atool = portal.portal_actions
+        came_from = '%s/my_cart' % portal_url
+        return context.setRedirect(atool, 'customer/login', came_from=came_from, ajax=form.get('ajax'))
 
 if shipping :
-	member = mtool.getAuthenticatedMember()
-	options['shipping_fullname']	= member.getMemberFullName(nameBefore=0)
-	options['shipping_address']		= member.getProperty('billing_address')
-	options['shipping_city']		= member.getProperty('billing_city')
-	options['shipping_zipcode']		= member.getProperty('billing_zipcode')
-	options['shipping_country']		= member.getProperty('country')
-	return context.shipping_template(**options)
+    member = mtool.getAuthenticatedMember()
+    options['shipping_fullname']    = member.getMemberFullName(nameBefore=0)
+    options['shipping_address']     = member.getProperty('billing_address')
+    options['shipping_city']        = member.getProperty('billing_city')
+    options['shipping_zipcode']     = member.getProperty('billing_zipcode')
+    options['shipping_country']     = member.getProperty('country')
+    return context.shipping_template(**options)
 
 if set_shipping :
-	fg = lambda name : form.get(name,'').strip()
-	if context.shipping_set_control(**form) :
-		order = pptool.addPrintOrder(cart)
-		return context.setRedirect(order, 'object/view', ajax=fg('ajax'))
-	else :
-		for name in [ 'shipping_fullname'
-					, 'shipping_address'
-					, 'shipping_city'
-					, 'shipping_zipcode'
-					, 'shipping_country'] :
-			options[name] = fg(name)
-		return context.shipping_template(**options)
+    fg = lambda name : form.get(name,'').strip()
+    if context.shipping_set_control(**form) :
+        order = pptool.addPrintOrder(cart)
+        return context.setRedirect(order, 'object/view', ajax=fg('ajax'))
+    else :
+        for name in [ 'shipping_fullname'
+                    , 'shipping_address'
+                    , 'shipping_city'
+                    , 'shipping_zipcode'
+                    , 'shipping_country'] :
+            options[name] = fg(name)
+        return context.shipping_template(**options)
 
 if isAnon :
-	nextStep = {'name':'order', 'value' : _('Order >>')}
+    nextStep = {'name':'order', 'value' : _('Order >>')}
 else :
-	nextStep = {'name':'shipping', 'value' : _('Shipping >>')}
-	
+    nextStep = {'name':'shipping', 'value' : _('Shipping >>')}
+    
 
 msg = ''
 
 for k, v in form.items() :
-	if hasattr(v, 'items') :
-		uid, templateId = k.split('_',1)
-		if v.has_key('refresh') :
-			quantity = v['quantity']
-			try :
-				quantity = int(quantity)
-			except ValueError:
-				msg = _('You must enter an integer for quantity (found: %s)') % quantity
-			if quantity <= 0 :
-				msg = _('You must enter a positive value for quantity (found: %s)') % quantity
-			if not msg :
-				item = {'cmf_uid'			: uid
-					   ,'printing_template' : templateId
-					   ,'quantity'			: quantity}
-				try :
-					cart.update(context, item)
-				except SoldOutError, e :
-					n = e.n
-					if n > 1 :
-						msg = _("Only %d available copies of this photo in this size.") % n
-					elif n == 1 :
-						msg = _("Only one last available copy of this photo in this size.")
-					else :
-						msg = _("No more available copy of this photo and in this size.")
-					
-
-		if v.has_key('delete'):
-			cart.remove(context, uid, templateId)
+    if hasattr(v, 'items') :
+        uid, templateId = k.split('_',1)
+        if v.has_key('refresh') :
+            quantity = v['quantity']
+            try :
+                quantity = int(quantity)
+            except ValueError:
+                msg = _('You must enter an integer for quantity (found: %s)') % quantity
+            if quantity <= 0 :
+                msg = _('You must enter a positive value for quantity (found: %s)') % quantity
+            if not msg :
+                item = {'cmf_uid'           : uid
+                       ,'printing_template' : templateId
+                       ,'quantity'          : quantity}
+                try :
+                    cart.update(context, item)
+                except SoldOutError, e :
+                    n = e.n
+                    if n > 1 :
+                        msg = _("Only %d available copies of this photo in this size.") % n
+                    elif n == 1 :
+                        msg = _("Only one last available copy of this photo in this size.")
+                    else :
+                        msg = _("No more available copy of this photo and in this size.")
+                    
+
+        if v.has_key('delete'):
+            cart.remove(context, uid, templateId)
 
 options['empty'] = not cart
 infos = []
 prices = []
 quantityTotal = 0
 for item in cart :
-	b = uidh.getBrain(item['cmf_uid'])
-	poptions = pptool.getPrintingOptionsContainerFor(b.getObject())
-	pt = getattr(poptions, item['printing_template'])
-	size = b.getThumbnailSize
-	d = {'thumbUrl' : '%s/getThumbnail' % b.getURL()
-		,'thumbHeight' : size['height'] / 2
-		,'thumbWidth' : size['width'] / 2
-		,'alt' : ('%s - %s' % (b.Title, b.Description)).strip(' -')
-		,'cmf_uid':b.cmf_uid
-		,'title': pt.title
-		,'description': pt.description
-		,'quantity':item['quantity']
-		,'amount': '%s €' % (pt.price * item['quantity']).taxed
-		,'templateId': pt.getId()
-		}
-	quantityTotal += item['quantity']
-	prices.append(pt.price * item['quantity'])
-	infos.append(d)
+    b = uidh.getBrain(item['cmf_uid'])
+    poptions = pptool.getPrintingOptionsContainerFor(b.getObject())
+    pt = getattr(poptions, item['printing_template'])
+    size = b.getThumbnailSize
+    d = {'thumbUrl' : '%s/getThumbnail' % b.getURL()
+        ,'thumbHeight' : size['height'] / 2
+        ,'thumbWidth' : size['width'] / 2
+        ,'alt' : ('%s - %s' % (b.Title, b.Description)).strip(' -')
+        ,'cmf_uid':b.cmf_uid
+        ,'title': pt.title
+        ,'description': pt.description
+        ,'quantity':item['quantity']
+        ,'amount': '%s €' % (pt.price * item['quantity']).taxed
+        ,'templateId': pt.getId()
+        }
+    quantityTotal += item['quantity']
+    prices.append(pt.price * item['quantity'])
+    infos.append(d)
 
 options['infos'] = infos
 if len(prices) == 1:
-	pricesTotal = prices[0]
+    pricesTotal = prices[0]
 elif len(prices) > 1 :
-	pricesTotal = reduce(lambda a, b : a + b, prices)
+    pricesTotal = reduce(lambda a, b : a + b, prices)
+
 
 if prices :
-	options['pricesTotal'] = pricesTotal
-	options['quantityTotal'] = quantityTotal
-	shippingFees = pptool.getShippingFeesFor(price=pricesTotal)
-	options['shippingFees'] = shippingFees
-	options['totalAmount'] = pricesTotal + shippingFees
+    options['pricesTotal'] = pricesTotal
+    options['quantityTotal'] = quantityTotal
+    discount = 0
+    if context.get('photoprint_discount') :
+        discount = context.photoprint_discount(pricesTotal, quantityTotal)
+    options['discount'] = discount
+    shippingFees = pptool.getShippingFeesFor(price=pricesTotal)
+    options['shippingFees'] = shippingFees
+    coeff = (100 - discount) / 100.
+    options['totalAmount'] = pricesTotal * coeff + shippingFees
 
 breadcrumbs = [
-	{ 'id'		: 'root'
-	, 'title'	: portal.title
-	, 'url'		: portal_url},
+    { 'id'      : 'root'
+    , 'title'   : portal.title
+    , 'url'     : portal_url},
 
-	{'id'		: 'my_cart'
-	,'title'	: _('My cart')
-	, 'url'		: '%s/my_cart' % portal_url}
-	]
+    {'id'       : 'my_cart'
+    ,'title'    : _('My cart')
+    , 'url'     : '%s/my_cart' % portal_url}
+    ]
 
 options['breadcrumbs'] = breadcrumbs
 
 if msg :
-	context.REQUEST.other['portal_status_message'] = msg
+    context.REQUEST.other['portal_status_message'] = msg
 options['cartIsOrder'] = False
 options['nextStep'] = nextStep
 return context.my_cart_template(**options)
diff --git a/skins/my_cart_template.pt b/skins/my_cart_template.pt
index b05a499..bdafd8c 100644
--- a/skins/my_cart_template.pt
+++ b/skins/my_cart_template.pt
@@ -76,6 +76,11 @@
                 <td tal:content="python:'%s €' % options['pricesTotal'].taxed">prices total</td>
                 <td colspan="2"><br/></td>
               </tr>
+              <tr tal:define="discount options/discount" tal:condition="discount">
+                <th colspan="3" style="text-align:right;padding-right:1em" i18n:translate="">Discount</th>
+                <td><span tal:replace="discount"/>%</td>
+                <td colspan="2"><br/></td>
+              </tr>
               <tr>
                 <th colspan="3" style="text-align:right;padding-right:1em" i18n:translate="">Shipping</th>
                 <td tal:content="python:'%s €' % options['shippingFees'].taxed">2</td>
-- 
2.20.1


From 01d91dfe8e676a59d83166eba69a55cff7796bd1 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <benoit.pin@gmail.com>
Date: Thu, 4 Sep 2014 23:28:18 +0200
Subject: [PATCH 04/16] maniaquerie

---
 skins/my_cart_template.pt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/skins/my_cart_template.pt b/skins/my_cart_template.pt
index bdafd8c..3fe3747 100644
--- a/skins/my_cart_template.pt
+++ b/skins/my_cart_template.pt
@@ -78,7 +78,7 @@
               </tr>
               <tr tal:define="discount options/discount" tal:condition="discount">
                 <th colspan="3" style="text-align:right;padding-right:1em" i18n:translate="">Discount</th>
-                <td><span tal:replace="discount"/>%</td>
+                <td><span tal:replace="discount"/> %</td>
                 <td colspan="2"><br/></td>
               </tr>
               <tr>
-- 
2.20.1


From f7e548f8e74520f1ff8b9ad72ff40ed0d4126773 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <benoit.pin@gmail.com>
Date: Fri, 5 Sep 2014 00:24:56 +0200
Subject: [PATCH 05/16] localisation++

---
 locales/en/LC_MESSAGES/portfolio.po |  20 ++++++++++++--------
 locales/fr/LC_MESSAGES/portfolio.mo | Bin 7387 -> 7419 bytes
 locales/fr/LC_MESSAGES/portfolio.po |  24 ++++++++++++++----------
 locales/portfolio.pot               |  22 +++++++++++++---------
 4 files changed, 39 insertions(+), 27 deletions(-)

diff --git a/locales/en/LC_MESSAGES/portfolio.po b/locales/en/LC_MESSAGES/portfolio.po
index 09f46f3..e6d88cf 100644
--- a/locales/en/LC_MESSAGES/portfolio.po
+++ b/locales/en/LC_MESSAGES/portfolio.po
@@ -74,15 +74,15 @@ msgstr ""
 msgid "Lightbox created."
 msgstr ""
 
-#: o/skins/lightbox_view.py:53
+#: o/skins/lightbox_view.py:51
 msgid "Photo removed."
 msgstr ""
 
-#: o/skins/lightbox_view.py:55
+#: o/skins/lightbox_view.py:53
 msgid "Removed photos."
 msgstr ""
 
-#: o/skins/lightbox_view.py:57
+#: o/skins/lightbox_view.py:55
 msgid "Nothing to remove."
 msgstr ""
 
@@ -116,7 +116,7 @@ msgstr ""
 msgid "No more available copy of this photo and in this size."
 msgstr ""
 
-#: o/skins/my_cart.py:138 o/skins/my_cart_template.pt:113
+#: o/skins/my_cart.py:144 o/skins/my_cart_template.pt:118
 msgid "My cart"
 msgstr ""
 
@@ -148,19 +148,23 @@ msgstr ""
 msgid "Total"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:80 o/skins/sell_macros.pt:16
+#: o/skins/my_cart_template.pt:80
+msgid "Discount"
+msgstr ""
+
+#: o/skins/my_cart_template.pt:85 o/skins/sell_macros.pt:16
 msgid "Shipping"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:85
+#: o/skins/my_cart_template.pt:90
 msgid "VAT"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:90
+#: o/skins/my_cart_template.pt:95
 msgid "Total amount to pay"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:114
+#: o/skins/my_cart_template.pt:119
 msgid "Your cart is currently empty."
 msgstr ""
 
diff --git a/locales/fr/LC_MESSAGES/portfolio.mo b/locales/fr/LC_MESSAGES/portfolio.mo
index 400e2cc169966841099ff3430814d5cd92fb9e51..47e28696ad121ba16980a628598faaf46db37ca5 100644
GIT binary patch
delta 2462
zcmYk-Urg0y9LMpmLU2GuKu`>mLlH&>9uJ5DDpG)$k${4!fgv30l>AYuo66rs!Y1Pa
zbImqdR&#mL2HEkdE!WZuofp-dmN`vnI+x2Xw8>^o-=E)k+Ir^q_j;b^{Lb^|`#c9P
zRot)eu4E>DXp~-J0Wp$brjCD-cu<;B%u2BtGjI^+;vt-Y<Cu=$U>csqWc(HN{-o=_
zi&?Z2Qq44U4kns;mKU#B0nX%uBGdro&ef<d)Z-j%#M#)1TEK41#P^VYHp(M_V>k<s
zU<kiPE%bNP_wQnW`7M!AG{7u;1cRsn3Q;>)f?9cv>u*CgW7|;+jiMI58`+WV#bSIP
z%kdb7@g{1XTwazXn8o~7<2u@~jCK@P;3ues{EV9DDk{Y{Q4720+9_;P3(UcJSnS$$
zm_vIj>c|E#h{LFHzeG=!<5cwGx2RNKK&9%k^EPV74^Z!?unHYTCMuPMsGXN1S+y#B
z9P3f<N0H6j9@HJ%i^{-Q8u>4vGERq5f6jRkHNkJFf$yLeIECC#%V1Uwn2ifDA0NXt
zsLXYsGI0o%`U&^>B(A2d-DzRf={kQZ4RmPdji{Y(;-P^fsMPI4eLjX{-9ATsZvsh*
z9Y+oLJt|XYQJFZ8tl6%*&;N4$Q?8xhagaLOnWzD>@W*NF2CHe`CQnqYgmm~jM729m
z8R<u*azAREk5LmJK}|e?%ESrx`32NQuAnmRU8kZQ-9qhX%DwO}YA1=@tVb~o>9QhJ
z>Q}k`b*KruQ3Ln6{<m>0?E}bW?V|G!)c5b>eEt5Dv*RntM-8+HwX-m4;`OM^>_m>w
z`cUtAsMHU;&p*N{+MhWuJLhwLx^%6mOzlA?wn0qS@Bc8BdOE(s=kOjXBUR*06E~nz
z-i%sU7iuBzq82#f`i~<2>^mNs@E6R(zi|m>^JOi(4mExg7BauJQ_<P&L#22GwbD;f
zUx=ZO;so-~PV>-$uAx$S2lc%N7{)nlPw&^GKM_7fyB*284dEgjLr<6BBo%oE*}VOL
zx(hcj7jL0{cFAm43z~sX;#}uStfjpJ_5M**CQsrMm`tbc!eZ2d2T*s#%O(F>=@1<p
zmyO~met~SpmXk-l*o4~2X4H{%qf*`D`UjmKpl<zP)Oh2r{}gJTpHSmnLTzMn0r}S@
z`jZZRb^bljN^1xeeMx7i^IJyfCaY|TW8F@%oltr;aW$d8AG#+m5t>X#TtO(aMTAN(
z^ZVr$o=Rzh--<svU@6f<X!k0*7gc`EYy)m|^=;Vh>iRpOqNCI?G!Z(UH;Dh2RWv+Z
z1Qne>S@+NDS*#>TieGl|%y;z{Q7Kl|blG%Fn+cVbgf3cyc!AhNsJupW5^IQZqLt7E
zZZvE0&v6}%|4IRsHlmo&e<F3n(?lupJi%SGtwfaY|CXal38BmN%)w)Ud0v;gDBM6>
z?APKC{Z3kl*InPMs2jC{2ofRUWulCjPUyBY6DsTD*mB(I>S70xKoqJ`@J|1(NM~$q
zO6{~jZFHck@2%c9W5cNvNwYUb`h&q`!BD6&Tv{0lA8g22m|9UBiuaVo`ZI1!Pil$u
ML<b_V)~unxLt5L;MF0Q*

delta 2415
zcmXxlYiO5M9Ki82HJzI7?y`AVHs?yGyX&_8>D<Li&8amnS!?BH>4X^=fzaP96A?lh
zjzW+?gX~37dsEpWqm))*7%NC{Z^S|NLRdy(P~Y!=XNUd%pYxpOdCui`&ZBo~uhb^5
zW=}d1D0_)H#2XVsu;I_i{7_a+4WSYnFbntNEIfkK@f2p_hd2|@;S?N1pT8X2uVF6N
zqiEOZ(?XaOLNa8GRYES_&5hY;2gT8)=nFNNg9*&QjpzhAFdO$Gf8iiMGw>Le;k)Pr
z2hsPgU^?EwY{n0NQMrqTDfH%z8R*Psp))Rt?FnS^p#_~_D>~t=$Vx&dmf~)#!FR9%
zFQF5hz{8q{seZj?{E(nhg{`;(52F+L3LWSon%Ya~#IDBcn`lS>VLs-vY_FH#J=lP5
z)pjhzeQ3XLM^9qX2hUJ3#RF)nzKsr{E544tcoW@%+h{6hFe_I+7fE7RfD5n`eZCc0
zeAtGbtxhxphp-4w%q0J&{tFuPYjl7MXve>!6C6g)W%vi}@L!yV>C9p-E<!WcjAr6h
zH1&P){`dGW*CXh}idm)oFUutVuDpr{S6<JL9j`-Ew+Fp{2+49dioV!~Bq5wcJ3NbK
z>QgimUm|l17vue3WBYKt{sZ0G(PV76gFmOyIUBr^8$;yDz0M;YsTHEv&1goppsDOZ
zJ9-@*_!v5HADW5x<NX12A>W~y{t;bJ@-h`yG#nqehOXoW-ix=8zmUnvGWA7hdl@?5
z+IZcDYq;KrtR;LN9Yo)|g0pc1oj_V%>iuMxLd6wjqa80sQ`&-TSJ;3K)Q+Zncf9`!
z)^q(@bRc>gJ#5wNpBdVO4%~@OEQu|692@=qf1_e53dolOm!PRGM<>>ZPGko<!S2|8
z1o;c^@#BD>;d~szWq1pn_(D3d|1vDb1iEEAF^BO(Hx*}k5PhK+-GWodU-*C@Cv+Z7
z<uB-#3}Xe3qR$tz%+x?w!gT`4cId)IcmPfP>F8NB8{uOro`DNkfIpz0+Xy<L8@Lev
zj?N(sO<b==pFe_)cpC4=5%erf=cW_hj2^yrbfR6zE`^=~@_(Gln>4V9kWU_cunb+v
za&$|YkZgwavAr|;5_;N`Xoqjb_A}@}pP>DnLl^Q5dWL>NKDN;8{<lzBMOb{v?|&&#
zMR;H=TgM2`N97s9^g6KrxcHfRPPPyZ<{qyg%&gmC**ivP$0B0Qc*nLsO_UMcgsZoB
zF6vUX5FW=(vA!L5#5#*f6}NIVv4LppJ)fSFe27{xVR7f#m()Md4OmN%_Eg!!Z{b)q
ztVeTdp2`U~x{a{Z6P~1<#9CrAVcA7IOROZSi6;n7Y+G1I#f^J}7%!fXCy6D*eZ&jI
z1B6HUQNn|;jo3{ji1AWN#nZHyrR67|i_IL#@L;TqAI3)FMK35_ghyyOF`w|ue2S<f
zCJ-KvR>Jbw7^(lgJ7Zlsh>3*XKqxxU)7{z8zh!DuTK}18A5G3^*uSf=qPDQSvaY(i
cuCltfBWvEY6{WGIrvGTx^$Gni=N?Y~ADULk-v9sr

diff --git a/locales/fr/LC_MESSAGES/portfolio.po b/locales/fr/LC_MESSAGES/portfolio.po
index 00a754f..edfe697 100644
--- a/locales/fr/LC_MESSAGES/portfolio.po
+++ b/locales/fr/LC_MESSAGES/portfolio.po
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Plinn 2.0\n"
-"POT-Creation-Date: Fri Aug 29 13:55:35 2014\n"
-"PO-Revision-Date: 2014-08-29 13:56+0200\n"
+"POT-Creation-Date: Fri Sep  5 00:23:02 2014\n"
+"PO-Revision-Date: 2014-09-05 00:24+0200\n"
 "Last-Translator:  Benoît PIN\n"
 "Language-Team: CRI http://cri.ensmp.fr\n"
 "Language: \n"
@@ -97,15 +97,15 @@ msgstr "Vous devez entrer un titre."
 msgid "Lightbox created."
 msgstr "Table lumineuse créée."
 
-#: o/skins/lightbox_view.py:53
+#: o/skins/lightbox_view.py:51
 msgid "Photo removed."
 msgstr "Photo retirée."
 
-#: o/skins/lightbox_view.py:55
+#: o/skins/lightbox_view.py:53
 msgid "Removed photos."
 msgstr "Photos retirées."
 
-#: o/skins/lightbox_view.py:57
+#: o/skins/lightbox_view.py:55
 msgid "Nothing to remove."
 msgstr "Rien à retirer."
 
@@ -141,7 +141,7 @@ msgstr "Livraison >>"
 msgid "No more available copy of this photo and in this size."
 msgstr "Plus aucun tirage disponible pour cette photo à ce format."
 
-#: o/skins/my_cart.py:138 o/skins/my_cart_template.pt:113
+#: o/skins/my_cart.py:144 o/skins/my_cart_template.pt:118
 msgid "My cart"
 msgstr "Mon panier"
 
@@ -173,19 +173,23 @@ msgstr "Tirages"
 msgid "Total"
 msgstr "Total"
 
-#: o/skins/my_cart_template.pt:80 o/skins/sell_macros.pt:16
+#: o/skins/my_cart_template.pt:80
+msgid "Discount"
+msgstr "Remise"
+
+#: o/skins/my_cart_template.pt:85 o/skins/sell_macros.pt:16
 msgid "Shipping"
 msgstr "Livraison"
 
-#: o/skins/my_cart_template.pt:85
+#: o/skins/my_cart_template.pt:90
 msgid "VAT"
 msgstr "TVA"
 
-#: o/skins/my_cart_template.pt:90
+#: o/skins/my_cart_template.pt:95
 msgid "Total amount to pay"
 msgstr "Montant total à payer"
 
-#: o/skins/my_cart_template.pt:114
+#: o/skins/my_cart_template.pt:119
 msgid "Your cart is currently empty."
 msgstr "Votre panier est actuellement vide."
 
diff --git a/locales/portfolio.pot b/locales/portfolio.pot
index fd5694f..fca8f26 100644
--- a/locales/portfolio.pot
+++ b/locales/portfolio.pot
@@ -14,7 +14,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 3.0\n"
-"POT-Creation-Date: Fri Aug 29 13:55:35 2014\n"
+"POT-Creation-Date: Fri Sep  5 00:23:02 2014\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: Zope 3 Developers <zope-dev@zope.org>\n"
@@ -106,15 +106,15 @@ msgstr ""
 msgid "Lightbox created."
 msgstr ""
 
-#: o/skins/lightbox_view.py:53
+#: o/skins/lightbox_view.py:51
 msgid "Photo removed."
 msgstr ""
 
-#: o/skins/lightbox_view.py:55
+#: o/skins/lightbox_view.py:53
 msgid "Removed photos."
 msgstr ""
 
-#: o/skins/lightbox_view.py:57
+#: o/skins/lightbox_view.py:55
 msgid "Nothing to remove."
 msgstr ""
 
@@ -155,8 +155,8 @@ msgstr ""
 msgid "No more available copy of this photo and in this size."
 msgstr ""
 
-#: o/skins/my_cart.py:138
-#: o/skins/my_cart_template.pt:113
+#: o/skins/my_cart.py:144
+#: o/skins/my_cart_template.pt:118
 msgid "My cart"
 msgstr ""
 
@@ -190,19 +190,23 @@ msgid "Total"
 msgstr ""
 
 #: o/skins/my_cart_template.pt:80
+msgid "Discount"
+msgstr ""
+
+#: o/skins/my_cart_template.pt:85
 #: o/skins/sell_macros.pt:16
 msgid "Shipping"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:85
+#: o/skins/my_cart_template.pt:90
 msgid "VAT"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:90
+#: o/skins/my_cart_template.pt:95
 msgid "Total amount to pay"
 msgstr ""
 
-#: o/skins/my_cart_template.pt:114
+#: o/skins/my_cart_template.pt:119
 msgid "Your cart is currently empty."
 msgstr ""
 
-- 
2.20.1


From 821f2dd54fd8a66a73d7a4c8b99331fbe7476d86 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Thu, 18 Sep 2014 14:59:18 +0200
Subject: [PATCH 06/16] maj et compilation traductions anglaises.

---
 locales/en/LC_MESSAGES/portfolio.mo | Bin 0 -> 6838 bytes
 locales/en/LC_MESSAGES/portfolio.po | 246 ++++++++++++++++------------
 2 files changed, 137 insertions(+), 109 deletions(-)
 create mode 100644 locales/en/LC_MESSAGES/portfolio.mo

diff --git a/locales/en/LC_MESSAGES/portfolio.mo b/locales/en/LC_MESSAGES/portfolio.mo
new file mode 100644
index 0000000000000000000000000000000000000000..8ba607f355f39645c2f86c789b9247e3ef2a4e54
GIT binary patch
literal 6838
zcmeI0UyL199mfxpf-azd3JQY9(k&Ev?{2p(l)F&6-QBheyY15577NHSd*|%lp>t=h
zGjn%)t0Y2vfP|Q!#Ypr45*2yqgMS_jAtWZCZ^jZ8Uoa-d7ap4U;=icz^PM@{?JhC#
z(Zo*nH=pzW{Lb(9J7><_-(7dvi-spfK8>8-V2lc`x`G$a6CXC_IvBtmuz=UX@5Afi
z>+ni=7G4A2gCBwCpoaJ-RQrv6Rrw9@<K(x%%i%D*4DRzh0IwoH3Dy6&X8_ecf**q&
z_)+*3sQFJr>G?9`&-{qjhv1v=YWQ<F2!9Qw=jC)#{~Ms%-3HZv5N?E{zI*~o|07U(
zhrYZAS(<qUO3&w^^ga!>o>yQEeh=OSe+7r&l{C^kdpsY4<+wiIgFC5z9`1%eh0^cu
zQ1fhHF|zNKP<q|y^V^`t8HP8&X`gSwPm+HM%3t4r7M_6`_ZOb;Lbdxnl%4+uWhYH0
zUJJF}O;G)|LHS`9lpQCa)_ojeV)HoM1S6>S&qGXLUWAIXSD@_hCfp3qLfQS#p8tRv
z|566mxYtAJcM~K;%}%KCcEelX7`z!aq3rfFlpS7&vim!}ej|(7L;hAMz2>3DKLNGw
z4&=`)^U}D_LfP$AsQNb{t}t&y^?L_mD)TPXcz=Yl(>W+R{1vhkvjJzR{yM1gn|yu?
zlwSvY{%$yZi7|Vj?DGOI?Yr+lip+1J^m!j@{g+@QrZ87S&2tOXcr~c@yL|ZpsQ5Sr
zwT=@|`e&ZYQ0w{<RR8BZUw~@=66DXk%nMVRA4ARm7DN^EOQ?1I0cxG+pzQJ&I0!c~
zx%9jXs{a9~b`L}Ke*((?xi9ZQ>HiGm&z$z<uR+=OhfsRH0j2j_Q0qAhYw$Nv`|h$&
zRQ?}^nkVsm8q&m^_W9S~PV#R+#m}Fh^t%INYn~lY_8o@O>j9sC3~HPcQ1SL<pZ_LQ
zyq<ylnV<2p@I9z;|K)iFoz(6cC_8V3veTgF2-JFyK=peJVp8Lv?AU`^_j6G8|0>kJ
zdkL!j8&H0F8*1O3g|fprxEWr;<g)t~&uviS4?&H)AM$4&<fVNVLXFpg+8+hfzWX}d
z4SxU`+Pn{k;H96c>UTlyyBR3Gz6Le^x1iSjGSs?Xg(3V2l-+K=v8vw*<>z6jeg~oA
zYYJ+-N1^N#LfIjK@>kE-KkLh1@cC~;`SrU#e+IJc%mL&evJcUtu`Hq(z6+7>^*mC+
zI8WgTgs>^~-U~m2Xidiv*-Uyi5ZU_<L{D151aJ#7;q$^AA{!=%)~ZLoxwlMlPQY28
zehfbD)AEZR`C$xs2pLCW<ibb(xZM}X2a1o)$S5+5$gg_Zh+<05VMK8!+wMSclldH?
z=RRaBvVcq>M-e>{GLMWPcO%CT#o!@?Ffk7xD^EX(hmksRE3zNC6Vcv$5W!96QRGSF
zeq`ktAffoEtrT3qOGzuH^xTAOD^t}=dv^vo;mcZ3adZ#zS!6r%d1M!&_*cvvLG(;k
zDC2(7r-de>7`;uI&0iclerRNBVsviw@S)l9L$gm&)QMe?ySX@BjFP8pv|xK_*DeQ1
zVT;t}!IHB@E6Q!|V%IF9G^v~Z_CS9)(0|<aA8hnbHTq{ve{O>?bYa<Lwc$uumNbK`
zFg|^L7!_0<R9#m#b9rt?+G&@$Z;z5@Y>VLJRx{EqS}rM~W}xZKzMy$R^K{azSV-e2
zt=H>jG)S5*2Fx@X6+JVWCJRy4uDXnB$c)0w1%(UE7%CRd!*-aL@vEj)RcJe{v`F(h
zZSrOob;_AZmuo}q^VLz?B{^#4W-Q8^n#YWXQDNJz2*RKU%y_#~^la1)7G1-3J8>F>
zHb|-hyAZ|BMv2{|KATwXeBF0AZ>PH1-;HC77S1L1_JyrwJ_*{+9E?I|7t)OJ(xivo
zax<ZM%!97CoMvHeCZokxF`u5a^w!GjW>WJrW4pKNQ8Sf>(L#h_rg}Dr=ezA(snTum
zyej69J6V`RX<5U>-6X8r<7qdeNiHMUcF?meg^WAdi89Sc>vozs8!QD;9L%%aX4>i5
zbfJo>(vIj~>Qu#9bjtmg-B`xjF4br&PSPmUCyR=fuypylqN?SZ!pybPB@{TE#68=O
zt1i?#a``&V*Q!u<N)u<}ATQQ-UBBdY9kbA7cF!I&9rOsO!b~gtywX^4CA+$`s-)6Z
z4a!Yy>B=~PZL$SESXk|X50opG))yw)&)SdcDo#Zm92l;)&s|~jR@CXp&QU@%R(mct
z)0ta}+;XEzC^)CHh;2-}s#WRsqStX%h3eBLQ`)>>8!LEL3(`*Kf`T+N4|O@Aw9${0
z4qJ2Z__EbqIzvbry=;){v?!C!ZkA!M)$pd$#(u+?8Na6U33+FwaLq!?GZJNITIuq-
z-8id*le3X`5VHeA4g$rjTb;CSW}_l@W;QK?xO&^5Is$dZ1wAt>3mr|$gJU5}+iSP(
zv5{GGEQlk{8YdOmjy7PwIS!OE^rZr;Dq0)^jj}pSliP}Fn+A#B@V4hTgVnj+C3IKf
zsFUUlgWZ;bxLchyU+{+KDAEDYV0~LZ*b&#n1j+gVIroUrMPgLP)_)o*s}2|x_da4P
zIvu0sfUC7}+C1UHMql*>BQD#dFhfsA(u#XI2Q^)k<t*?KAHHUukBF(x1QVvqm32E&
zv*>2dtOUW_%66OMIE#a%{6gfW{8G*p>6|`}Wt;Nr&<>I=E^L=)ssC0bIxv%zAfst0
zBOAUpOObZN%IX^?a|@18Y`QYZu50-aFnKFY<wld^VWNf*GdbTqiW=rrN-#u8#k9+z
zk)==ajjm0EwPP;Rf!we=>VtjLhi7Z$r;n1_7=hBT`?JW-xQ?~E?BHNyXh&mk$PNu|
z-$~or5foHs-&Do5!Fy`kciZhd8@uklb8u*Iuy2wRt~Q$mNgfA9nla+h$w|xQV%*+4
zJ~c8ixp!o2?8x}c%pRI1i(NiTwOJRm8}^a3<LnMQ=9XMcGRy6~r(i8~OM8{5r`h73
zzNv|+@zqsqXBB+W3*xe-{m`%lmL0$;Q8H|stsvtZy6@=h{@U)<c2W+**2WV~ELqI%
zo{x&Y11@oyK8Ce@y@u6{13{-VKrjWd%Lf=Y3z|i})9br<U%Gf-x_Do@;0kr|zNE|5
z#rsnAL-68#Y5nzv-=zPK_oechTV9&1ers}XTe&zjs^7Uecix~V|FKZj*o3?Ca>Vc2
ipj)K+#lXjxTi!f(obskrUX$sfuX6QIhyU4I*S`U}!?RKV

literal 0
HcmV?d00001

diff --git a/locales/en/LC_MESSAGES/portfolio.po b/locales/en/LC_MESSAGES/portfolio.po
index e6d88cf..fe3e5c7 100644
--- a/locales/en/LC_MESSAGES/portfolio.po
+++ b/locales/en/LC_MESSAGES/portfolio.po
@@ -1,444 +1,472 @@
+# #############################################################################
+#
+# Copyright (c) 2003-2004 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+# #############################################################################
+msgid ""
+msgstr ""
+"Project-Id-Version: 3.0\n"
+"POT-Creation-Date: Fri Sep  5 00:23:02 2014\n"
+"PO-Revision-Date: 2014-09-18 14:57+0200\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Zope 3 Developers <zope-dev@zope.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+
 #: o/ImageManipulationTool.py:40
 msgid "Processor"
-msgstr ""
+msgstr "Processor"
 
 #: o/ImageManipulationTool.py:56
 msgid "Process started."
-msgstr ""
+msgstr "Process started."
 
 #: o/ImageManipulationTool.py:64
 msgid "Process stopped."
-msgstr ""
+msgstr "Process stopped."
 
 #: o/skins/add_to_cart.py:20 o/skins/my_cart.py:73
 msgid "You must enter an integer for quantity (found: %s)"
-msgstr ""
+msgstr "You must enter an integer for quantity (found: %s)"
 
 #: o/skins/add_to_cart.py:23 o/skins/my_cart.py:75
 msgid "You must enter a positive value for quantity (found: %s)"
-msgstr ""
+msgstr "You must enter a positive value for quantity (found: %s)"
 
 #: o/skins/add_to_cart.py:49 o/skins/my_cart.py:85
 msgid "Only %d available copies of this photo in this size."
-msgstr ""
+msgstr "Only %d available copies of this photo in this size."
 
 #: o/skins/add_to_cart.py:51 o/skins/my_cart.py:87
 msgid "Only one last available copy of this photo in this size."
-msgstr ""
+msgstr "Only one last available copy of this photo in this size."
 
 #: o/skins/add_to_cart.py:53
 msgid "No more available copy of this photo in this size."
-msgstr ""
+msgstr "No more available copy of this photo in this size."
 
 #: o/skins/add_to_cart.py:62
 msgid ""
 "Your cart is locked:\n"
 "please complete your current order first."
 msgstr ""
+"Your cart is locked:\n"
+"please complete your current order first."
 
 #: o/skins/add_to_cart.py:72 o/skins/add_to_cart.py:74
 msgid "Added to cart."
-msgstr ""
+msgstr "Added to cart."
 
 #: o/skins/add_to_selection.py:37
 msgid "%s added to selection."
-msgstr ""
+msgstr "%s added to selection."
 
 #: o/skins/add_to_selection.py:39
 msgid "This %s is already in the selection."
-msgstr ""
+msgstr "This %s is already in the selection."
 
 #: o/skins/get_slide_buyable_items.pt:21 o/skins/photo_layout_macros.pt:51
 #: o/skins/photo_layout_macros.pt:54 o/skins/photo_view.pt:91
 #: o/skins/photo_view.pt:94
 msgid "Add to cart"
-msgstr ""
+msgstr "Add to cart"
 
 #: o/skins/get_slide_buyable_items.pt:27
 msgid "quantity:"
-msgstr ""
+msgstr "quantity:"
 
 #: o/skins/get_slide_buyable_items.pt:34
 msgid "Cancel"
-msgstr ""
+msgstr "Cancel"
 
 #: o/skins/lightbox_save_control.py:10
 msgid "No photo selected."
-msgstr ""
+msgstr "No photo selected."
 
 #: o/skins/lightbox_save_control.py:21
 msgid "You must enter a title."
-msgstr ""
+msgstr "You must enter a title."
 
 #: o/skins/lightbox_save_control.py:27
 msgid "Lightbox created."
-msgstr ""
+msgstr "Lightbox created."
 
 #: o/skins/lightbox_view.py:51
 msgid "Photo removed."
-msgstr ""
+msgstr "Photo removed."
 
 #: o/skins/lightbox_view.py:53
 msgid "Removed photos."
-msgstr ""
+msgstr "Removed photos."
 
 #: o/skins/lightbox_view.py:55
 msgid "Nothing to remove."
-msgstr ""
+msgstr "Nothing to remove."
 
 #. Default: ""
 #: o/skins/lightbox_view_template.pt:19
 msgid "lightbox_selected_explanations"
-msgstr ""
+msgstr "This light box is selected: images that you select now will automatically be saved in that location."
 
 #: o/skins/lightbox_view_template.pt:24 o/skins/my_cart_template.pt:59
 #: o/skins/portfolio_view.pt:88 o/skins/selection_view_template.pt:31
 msgid "delete"
-msgstr ""
+msgstr "delete"
 
 #: o/skins/lightbox_view_template.pt:31 o/skins/selection_view_template.pt:20
 msgid "${DYNAMIC_CONTENT}"
-msgstr ""
+msgstr "${DYNAMIC_CONTENT}"
 
 #: o/skins/metadata_edit_form_macros.pt:258
 msgid "Save"
-msgstr ""
+msgstr "Save"
 
 #: o/skins/my_cart.py:58
 msgid "Order >>"
-msgstr ""
+msgstr "Order >>"
 
 #: o/skins/my_cart.py:60
 msgid "Shipping >>"
-msgstr ""
+msgstr "Shipping >>"
 
 #: o/skins/my_cart.py:89
 msgid "No more available copy of this photo and in this size."
-msgstr ""
+msgstr "No more available copy of this photo and in this size."
 
 #: o/skins/my_cart.py:144 o/skins/my_cart_template.pt:118
 msgid "My cart"
-msgstr ""
+msgstr "My cart"
 
 #: o/skins/my_cart_template.pt:26
 msgid "Image"
-msgstr ""
+msgstr "Image"
 
 #: o/skins/my_cart_template.pt:27
 msgid "Printing format and type"
-msgstr ""
+msgstr "Printing format and type"
 
 #: o/skins/my_cart_template.pt:28
 msgid "Quantity"
-msgstr ""
+msgstr "Quantity"
 
 #: o/skins/my_cart_template.pt:29
 msgid "Amount (incl tax)"
-msgstr ""
+msgstr "Amount (incl tax)"
 
 #: o/skins/my_cart_template.pt:53
 msgid "refresh amount"
-msgstr ""
+msgstr "refresh amount"
 
 #: o/skins/my_cart_template.pt:69
 msgid "Prints"
-msgstr ""
+msgstr "Prints"
 
 #: o/skins/my_cart_template.pt:70
 msgid "Total"
-msgstr ""
+msgstr "Total"
 
 #: o/skins/my_cart_template.pt:80
 msgid "Discount"
-msgstr ""
+msgstr "Discount"
 
 #: o/skins/my_cart_template.pt:85 o/skins/sell_macros.pt:16
 msgid "Shipping"
-msgstr ""
+msgstr "Shipping"
 
 #: o/skins/my_cart_template.pt:90
 msgid "VAT"
-msgstr ""
+msgstr "VAT"
 
 #: o/skins/my_cart_template.pt:95
 msgid "Total amount to pay"
-msgstr ""
+msgstr "Total amount to pay"
 
 #: o/skins/my_cart_template.pt:119
 msgid "Your cart is currently empty."
-msgstr ""
+msgstr "Your cart is currently empty."
 
 #: o/skins/photo_info.pt:9
 msgid "Preview:"
-msgstr ""
+msgstr "Preview:"
 
 #: o/skins/photo_info.pt:18 o/skins/save_as_lightbox_template.pt:15
 msgid "Title"
-msgstr ""
+msgstr "Title"
 
 #: o/skins/photo_info.pt:22
 msgid "Type"
-msgstr ""
+msgstr "Type"
 
 #: o/skins/photo_info.pt:26
 msgid "Created"
-msgstr ""
+msgstr "Created"
 
 #: o/skins/photo_info.pt:30
 msgid "Modified"
-msgstr ""
+msgstr "Modified"
 
 #: o/skins/photo_info.pt:34
 msgid "Dimensions"
-msgstr ""
+msgstr "Dimensions"
 
 #: o/skins/photo_layout_macros.pt:32 o/skins/photo_layout_macros.pt:35
 msgid "Add to selection"
-msgstr ""
+msgstr "Add to selection"
 
 #: o/skins/photo_layout_macros.pt:41 o/skins/photo_layout_macros.pt:44
 msgid "Remove to selection"
-msgstr ""
+msgstr "Remove to selection"
 
 #: o/skins/photo_layout_macros.pt:60 o/skins/photo_layout_macros.pt:63
 #: o/skins/portfolio_presentation_template.pt:47
 msgid "Delete"
-msgstr ""
+msgstr "Delete"
 
 #: o/skins/photo_layout_macros.pt:78 o/skins/photo_layout_macros.pt:81
 msgid "Hide for anonymous"
-msgstr ""
+msgstr "Hide for anonymous"
 
 #: o/skins/photo_layout_macros.pt:91 o/skins/photo_layout_macros.pt:94
 msgid "Show for anonymous"
-msgstr ""
+msgstr "Show for anonymous"
 
 #: o/skins/photo_medium.pt:37 o/skins/photo_medium.pt:38
 msgid "previous"
-msgstr ""
+msgstr "previous"
 
 #: o/skins/photo_medium.pt:44 o/skins/photo_medium.pt:45
 msgid "next"
-msgstr ""
+msgstr "next"
 
 #: o/skins/photo_medium.pt:52
 msgid "zoom in"
-msgstr ""
+msgstr "zoom in"
 
 #: o/skins/photo_medium.pt:52
 msgid "zoom out"
-msgstr ""
+msgstr "zoom out"
 
 #: o/skins/photo_view.pt:31
 msgid "Empty image: upload an image file in \"Edit\" tab."
-msgstr ""
+msgstr "Empty image: upload an image file in \"Edit\" tab."
 
 #: o/skins/photo_view.pt:46 o/skins/photo_view.pt:49
 msgid "Previous"
-msgstr ""
+msgstr "Previous"
 
 #: o/skins/photo_view.pt:52 o/skins/photo_view.pt:55
 msgid "Next"
-msgstr ""
+msgstr "Next"
 
 #: o/skins/photo_view.pt:58
 msgid "slide show"
-msgstr ""
+msgstr "slide show"
 
 #: o/skins/photo_view.pt:69 o/skins/photo_view.pt:72
 msgid "Back to portfolio..."
-msgstr ""
+msgstr "Back to portfolio..."
 
 #: o/skins/photo_view.pt:75 o/skins/photo_view.pt:77
 msgid "Full screen (f)"
-msgstr ""
+msgstr "Full screen (f)"
 
 #: o/skins/photo_view.pt:99 o/skins/photo_view.pt:104
 msgid "Edit metadata"
-msgstr ""
+msgstr "Edit metadata"
 
 #: o/skins/photo_view.pt:118
 msgid "Keywords"
-msgstr ""
+msgstr "Keywords"
 
 #: o/skins/photo_view.pt:125
 msgid "reference:"
-msgstr ""
+msgstr "reference:"
 
 #: o/skins/photo_view.pt:131
 msgid "download picture"
-msgstr ""
+msgstr "download picture"
 
 #: o/skins/portfolio_edit_form.py:17
 msgid "Photo deleted."
-msgstr ""
+msgstr "Photo deleted."
 
 #: o/skins/portfolio_edit_form.py:19
 msgid "Deleted photos."
-msgstr ""
+msgstr "Deleted photos."
 
 #: o/skins/portfolio_edit_form.py:22
 msgid "Nothing to delete."
-msgstr ""
+msgstr "Nothing to delete."
 
 #: o/skins/portfolio_presentation_template.pt:22
 msgid "Delete presentation"
-msgstr ""
+msgstr "Delete presentation"
 
 #: o/skins/portfolio_view.pt:74
 msgid "sorting:"
-msgstr ""
+msgstr "sorting:"
 
 #: o/skins/portfolio_view.pt:77
 msgid "manual"
-msgstr ""
+msgstr "manual"
 
 #: o/skins/portfolio_view.pt:79
 msgid "shooting"
-msgstr ""
+msgstr "shooting"
 
 #: o/skins/portfolio_view.pt:81
 msgid "modification"
-msgstr ""
+msgstr "modification"
 
 #: o/skins/save_as_lightbox_template.pt:12
 msgid "Save current selection as lightbox"
-msgstr ""
+msgstr "Save current selection as lightbox"
 
 #: o/skins/save_as_lightbox_template.pt:21
 msgid "Description"
-msgstr ""
+msgstr "Description"
 
 #: o/skins/selection_view.py:56
 msgid "Photo deselected."
-msgstr ""
+msgstr "Photo deselected."
 
 #: o/skins/selection_view.py:58
 msgid "Deselected photos."
-msgstr ""
+msgstr "Deselected photos."
 
 #: o/skins/selection_view.py:60
 msgid "Nothing to deselect."
-msgstr ""
+msgstr "Nothing to deselect."
 
 #: o/skins/selection_view.py:70 o/skins/selection_view.py:72
 #: o/skins/selection_view_template.pt:18 o/skins/selectioncontext.py:116
 #: o/skins/selectioncontext.py:118
 msgid "My selection"
-msgstr ""
+msgstr "My selection"
 
 #: o/skins/selection_view_template.pt:23
 msgid "You are editing this ligthbox:"
-msgstr ""
+msgstr "You are editing this ligthbox:"
 
 #: o/skins/selection_view_template.pt:42
 msgid "Save as..."
-msgstr ""
+msgstr "Save as..."
 
 #: o/skins/selection_view_template.pt:45
 msgid "${please_login} if you want to save this selection."
-msgstr ""
+msgstr "${please_login} if you want to save this selection."
 
 #. Default: "Please log in"
 #: o/skins/selection_view_template.pt:46
 msgid "login_to_save_seletion"
-msgstr ""
+msgstr "login_to_save_seletion"
 
 #: o/skins/selection_view_template.pt:50
 msgid "Empty selection."
-msgstr ""
+msgstr "Empty selection."
 
 #: o/skins/sell_macros.pt:14
 msgid "Cart"
-msgstr ""
+msgstr "Cart"
 
 #: o/skins/sell_macros.pt:15
 msgid "Authentication"
-msgstr ""
+msgstr "Authentication"
 
 #: o/skins/sell_macros.pt:17
 msgid "Payment"
-msgstr ""
+msgstr "Payment"
 
 #: o/skins/sell_macros.pt:18
 msgid "Confirmation"
-msgstr ""
+msgstr "Confirmation"
 
 #: o/skins/shipping_set_control.py:8
 msgid "Please enter a name."
-msgstr ""
+msgstr "Please enter a name."
 
 #: o/skins/shipping_set_control.py:9
 msgid "Please enter an address."
-msgstr ""
+msgstr "Please enter an address."
 
 #: o/skins/shipping_set_control.py:10
 msgid "Please enter a city."
-msgstr ""
+msgstr "Please enter a city."
 
 #: o/skins/shipping_set_control.py:11
 msgid "Please enter zip code."
-msgstr ""
+msgstr "Please enter zip code."
 
 #: o/skins/shipping_set_control.py:12
 msgid "Please enter a country."
-msgstr ""
+msgstr "Please enter a country."
 
 #: o/skins/shipping_set_control.py:27
 msgid "No cart found. Your session may have expired."
-msgstr ""
+msgstr "No cart found. Your session may have expired."
 
 #: o/skins/shipping_set_control.py:30
 msgid "Shipping informations saved."
-msgstr ""
+msgstr "Shipping informations saved."
 
 #: o/skins/shipping_template.pt:14
 msgid "Please set shipping informations"
-msgstr ""
+msgstr "Please set shipping informations"
 
 #: o/skins/shipping_template.pt:19 o/skins/shipping_template.pt:60
 msgid "Validate >>"
-msgstr ""
+msgstr "Validate >>"
 
 #: o/skins/shipping_template.pt:23
 msgid "Fullname"
-msgstr ""
+msgstr "Fullname"
 
 #: o/skins/shipping_template.pt:29
 msgid "Address"
-msgstr ""
+msgstr "Address"
 
 #: o/skins/shipping_template.pt:36
 msgid "City"
-msgstr ""
+msgstr "City"
 
 #: o/skins/shipping_template.pt:42
 msgid "Zip code"
-msgstr ""
+msgstr "Zip code"
 
 #: o/skins/shipping_template.pt:48
 msgid "Country"
-msgstr ""
+msgstr "Country"
 
 #: o/skins/zoom_view.pt:32
 msgid "back"
-msgstr ""
+msgstr "back"
 
 # from portfolio-manual
 msgid "not saved yet"
-msgstr ""
+msgstr "not saved yet"
 
 msgid "Load in my selection"
-msgstr ""
+msgstr "Load in my selection"
 
 msgid "Unload from my selection"
-msgstr ""
+msgstr "Unload from my selection"
 
 msgid "My albums"
-msgstr ""
+msgstr "My albums"
 
 msgid "You don't have any album yet."
-msgstr ""
+msgstr "You don't have any album yet."
 
+# date et heure de prise de vue
 msgid "%m/%d/%Y %H:%M:%S"
-msgstr ""
+msgstr "%m/%d/%Y %H:%M:%S"
-- 
2.20.1


From 20d32cad15428a0a8d893a8e248d925b004df2c8 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Thu, 9 Oct 2014 18:18:41 +0200
Subject: [PATCH 07/16] =?utf8?q?Effacement=20de=20la=20s=C3=A9lection=20qu?=
 =?utf8?q?and=20le=20d=C3=A9placement=20est=20effectif=20(valid=C3=A9=20pa?=
 =?utf8?q?r=20le=20serveur).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/photo_lightbox_viewer.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index 3c69aec..97c7f79 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -542,15 +542,18 @@ Lightbox.prototype.moveSelectedPhotos = function() {
 };
 
 Lightbox.prototype._moveSelectedPhotos = function(req) {
-	var i, slide;
+	var i, slide, cb;
 	if (req.status === 200) {
 		var doc = req.responseXML.documentElement;
 		if (doc.nodeName === 'ok') {
-			this.pendingMovedSlides = undefined;
 			for(i=0 ; i<this.draggedSelection.length ; i++) {
 				slide = this.draggedSelection[i];
 				this.grid.removeChild(slide);
+				cb = this.pendingMovedSlides[i].getElementsByTagName('input')[0]
+				cb.checked = false;
+				cb.removeAttribute('checked');
 			}
+			this.pendingMovedSlides = undefined;
 			this.cbIndex = undefined;
 			return;
 		}
-- 
2.20.1


From 56cf98937c95ed6aee58b464aa389ee3a90c9413 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 10:54:04 +0200
Subject: [PATCH 08/16] bugfix.

---
 skins/photo_lightbox_viewer.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index 97c7f79..3438151 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -482,10 +482,10 @@ Lightbox.prototype.onDragStart = function(evt) {
 
 Lightbox.prototype.onDragOver = function(evt) {
 	var target = getTargetedObject(evt);
-	if (!target) {return;}
-	while(target.className !== 'slide') {
+	while(target && target.className !== 'slide') {
 		target = target.parentNode;
 	}
+	if (!target) {return;}
 	target = target.parentNode;
 	if (target !== this.dragged) {
 		target.classList.add('dragover');
-- 
2.20.1


From 578b0986d2b8fbcc52fb6a38961a568469046e85 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 11:27:59 +0200
Subject: [PATCH 09/16] =?utf8?q?D=C3=A9sactivation=20du=20dragover=20si=20?=
 =?utf8?q?rien=20n'est=20s=C3=A9lectionn=C3=A9=C2=A0:=C2=A0se=20produit=20?=
 =?utf8?q?lors=20d'un=20upload=20par=20drag=20and=20drop.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/photo_lightbox_viewer.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index 3438151..024e01e 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -481,6 +481,9 @@ Lightbox.prototype.onDragStart = function(evt) {
 };
 
 Lightbox.prototype.onDragOver = function(evt) {
+	if (!this.dragged) {
+		return;
+	}
 	var target = getTargetedObject(evt);
 	while(target && target.className !== 'slide') {
 		target = target.parentNode;
-- 
2.20.1


From 8e1a01f483d5572199464ed072747ba998bb978f Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 11:30:40 +0200
Subject: [PATCH 10/16] jslint

---
 skins/photo_lightbox_viewer.js | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index 024e01e..e0f304d 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -527,21 +527,21 @@ Lightbox.prototype.moveSelectedPhotos = function() {
 				break;
 			case 4 :
 				hideProgressImage();
-				self._moveSelectedPhotos(req)
+				self._moveSelectedPhotos(req);
 				break;
 		}
 	};
 	
 	var url = absolute_url() + '/portfolio_move_photos';
-  	req.open("POST", url, true);
-  	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
+	req.open("POST", url, true);
+	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
 	var query = 'container_type=' + this.container_type;
 	var i;
 	for (i=0 ; i<this.draggedSelection.length ; i++) {
 		query += '&uids:list=' + this.draggedSelection[i].getAttribute('name');
 	}
 	query += '&afterUid=' + this.lastDropTarget.getAttribute('name');
-  	req.send(query);
+	req.send(query);
 };
 
 Lightbox.prototype._moveSelectedPhotos = function(req) {
@@ -552,7 +552,7 @@ Lightbox.prototype._moveSelectedPhotos = function(req) {
 			for(i=0 ; i<this.draggedSelection.length ; i++) {
 				slide = this.draggedSelection[i];
 				this.grid.removeChild(slide);
-				cb = this.pendingMovedSlides[i].getElementsByTagName('input')[0]
+				cb = this.pendingMovedSlides[i].getElementsByTagName('input')[0];
 				cb.checked = false;
 				cb.removeAttribute('checked');
 			}
-- 
2.20.1


From fbdbc13c9f32f9df94087780ce90bc0916bde420 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 13:00:26 +0200
Subject: [PATCH 11/16] jslint

---
 skins/cart_listing.js | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/skins/cart_listing.js b/skins/cart_listing.js
index 593002a..cf160c3 100644
--- a/skins/cart_listing.js
+++ b/skins/cart_listing.js
@@ -9,39 +9,39 @@ var CartListing;
 (function(){
 var ENTERKEY = 13;
 
-CartListing = function(table) {
+CartListing = function(table) {
 	var thisCL = this;
 	this.table = table;
 	var form = table.parentNode;
-	while(form.tagName != 'FORM')
-		form = form.parentNode;
+	while(form.tagName !== 'FORM') {
+		form = form.parentNode;}
 	
 	this.fm = new FormManager(form);
 	
-	if (browser.isIE)
-		addListener(table, 'focusout', function(evt){thisCL.updateRow(evt);});
-	else
-		addListener(table, 'change', function(evt){thisCL.updateRow(evt);});
+	if (browser.isIE){
+		addListener(table, 'focusout', function(evt){thisCL.updateRow(evt);});}
+	else{
+		addListener(table, 'change', function(evt){thisCL.updateRow(evt);});}
 	
 	addListener(table, 'keypress', function(evt){thisCL.onKeypress(evt);});
-}
+};
 
 CartListing.prototype.updateRow = function(evt) {
 	var target = getTargetedObject(evt);
-	if (target.tagName != 'INPUT')
-		return;
+	if (target.tagName !== 'INPUT'){
+		return;}
 			
 	
 	var row = target.parentNode.parentNode;
-	var inputs = row.getElementsByTagName('input')
+	var inputs = row.getElementsByTagName('input');
 	var refreshBtn = inputs[1];
 	this.fm.submitButton = refreshBtn;
 	this.fm.submit(evt);
 };
 
 CartListing.prototype.onKeypress = function(evt){
-	if (evt.keyCode == ENTERKEY)
-		this.updateRow(evt);
+	if (evt.keyCode === ENTERKEY){
+		this.updateRow(evt);}
 };
 
-})();
\ No newline at end of file
+}());
-- 
2.20.1


From 1a791f652fc028bbb22d800351ce748a7c56974f Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 13:07:05 +0200
Subject: [PATCH 12/16] jslint

---
 skins/cart_widgets.js | 39 +++++++++++++++++----------------------
 1 file changed, 17 insertions(+), 22 deletions(-)

diff --git a/skins/cart_widgets.js b/skins/cart_widgets.js
index 594fd22..9f59306 100644
--- a/skins/cart_widgets.js
+++ b/skins/cart_widgets.js
@@ -19,7 +19,7 @@ CartWidget = function(slide, url) {
 	req.send(null);
 	hideProgressImage();
 	
-	if (req.status != 200){
+	if (req.status !== 200){
 		alert(req.status);
 		return;
 	}
@@ -27,12 +27,12 @@ CartWidget = function(slide, url) {
 	var wdgtNode = this.wdgtNode = getCopyOfNode(doc);
 	slide.appendChild(wdgtNode);
 	
-	var descriptions = this.descriptions = new Array();
+	var descriptions = this.descriptions = [];
 	var divs = wdgtNode.getElementsByTagName('div');
-	var d;
-	for (var i=0; i<divs.length; i++) {
+	var d, i;
+	for (i=0; i<divs.length; i++) {
 		d = divs[i];
-		if (d.className =='ppt-description') {
+		if (d.className === 'ppt-description') {
 			descriptions[d.getAttribute('name')] = d;
 		}
 	}
@@ -44,31 +44,26 @@ CartWidget = function(slide, url) {
 	fm.onBeforeSubmit  = function(fm, evt){return thisCart.onBeforeSubmit(fm, evt);};
 	fm.onResponseLoad = function(req){return thisCart.loadResponse(req);};
 
-	with (descriptions[itemSelector.value].style) {
-		visibility = 'visible';
-		display='block';
-	}
+	descriptions[itemSelector.value].style.visibility = 'visible';
+	descriptions[itemSelector.value].style.display='block';
 	this.selectedItem = itemSelector.value;
 	
-	addListener(itemSelector, 'change', function(evt){thisCart.selectItem(evt)})
-}
+	addListener(itemSelector, 'change', function(evt){thisCart.selectItem(evt);});
+};
 
 CartWidget.prototype.selectItem = function(evt) {
-	with(this.descriptions[this.selectedItem].style) {
-		visibility = 'hidden';
-		display = 'none'
-	}
+	this.descriptions[this.selectedItem].style.visibility = 'hidden';
+	this.descriptions[this.selectedItem].style.display = 'none';
 	var name = this.itemSelector.value;
 	
-	with (this.descriptions[name].style) {
-		visibility = 'visible';
-		display='block';
-	}
+	this.descriptions[name].style.visibility = 'visible';
+	this.descriptions[name].style.display='block';
+
 	this.selectedItem = name;
 };
 
 CartWidget.prototype.onBeforeSubmit = function(fm, evt) {
-	if (fm.submitButton.name == 'cancel') {
+	if (fm.submitButton.name === 'cancel') {
 		this.onCancel();
 		return 'cancelSubmit';
 	}
@@ -87,7 +82,7 @@ CartWidget.prototype.loadResponse = function(req) {
 			confirm.innerHTML = text;
 			slide.appendChild(confirm);
 
-			var duration = parseInt(doc.getAttribute('duration')) * 1000;
+			var duration = parseInt(doc.getAttribute('duration'), 10) * 1000;
 			var thisCart = this;
 
 			setTimeout(function(){
@@ -112,4 +107,4 @@ CartWidget.prototype.onCancel = function() {
 
 CartWidget.prototype.onAfterConfirm = function(){};
 
-})();
\ No newline at end of file
+}());
\ No newline at end of file
-- 
2.20.1


From 8ead6f1e3deb946c8ff614793f1637fe0e26efa0 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 16:11:10 +0200
Subject: [PATCH 13/16] jslint

---
 skins/photo_film_viewer.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/skins/photo_film_viewer.js b/skins/photo_film_viewer.js
index c6f583b..fa929b2 100644
--- a/skins/photo_film_viewer.js
+++ b/skins/photo_film_viewer.js
@@ -211,9 +211,9 @@ FilmSlider.prototype.getBestFitSize = function(ratio) {
 };
 
 FilmSlider.prototype.adjustImage = function(img) {
-	var dispWidth = parseInt(this.stretchable.style.width);
+	var dispWidth = parseInt(this.stretchable.style.width, 10);
 	var imgWidth = img.naturalWidth;
-	var dispHeight = parseInt(this.stretchable.style.height);
+	var dispHeight = parseInt(this.stretchable.style.height, 10);
 	var imgHeight = img.naturalHeight;
 	var ratio;
 
-- 
2.20.1


From bf33c9ca85d7668e07e0a98d7af0be131d665b31 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 10 Oct 2014 17:16:17 +0200
Subject: [PATCH 14/16] =?utf8?q?Activation=20de=20l'ordonnancement=20par?=
 =?utf8?q?=20drag=20and=20drop=20que=20quand=20c'est=20possible=20(permiss?=
 =?utf8?q?ions,=20crit=C3=A8re=20de=20tri).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/photo_layout_macros.pt   | 10 +++++++---
 skins/photo_lightbox_viewer.js | 26 ++++++++++++++++++++++----
 skins/portfolio_view.pt        |  2 ++
 3 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/skins/photo_layout_macros.pt b/skins/photo_layout_macros.pt
index 7960516..f68f193 100644
--- a/skins/photo_layout_macros.pt
+++ b/skins/photo_layout_macros.pt
@@ -9,7 +9,9 @@
     <div metal:define-macro="grid"
          tal:define="slide_size portal_object/slide_size;
                      mayBeDropable exists:dropable;
-                     dropable python:True if mayBeDropable and dropable else False"
+                     dropable python:True if mayBeDropable and dropable else False;
+                     mayBeOrderable exists:orderable;
+                     orderable python:True if mayBeOrderable and orderable else False"
          i18n:domain="portfolio">
       <div id="lightbox" tal:attributes="class python:'lightbox photo-drop-target' if dropable else 'lightbox'">
         <span metal:define-macro="thumbnails" tal:repeat="info infos" tal:omit-tag="">
@@ -122,7 +124,8 @@
                 new Lightbox(lb,
                              document.getElementById('lightbox_toolbar'),
                              %(complete)s,
-                             '%(container_type)s');
+                             '%(container_type)s',
+                             %(orderable)s);
                 var uploadUrl = '%(putUrl)s';
                 var options = {'slideSize' : %(slideSize)d,
                                'thumbnailSize' : %(thumbnailSize)d};
@@ -132,7 +135,8 @@
                      'slideSize' : portal_object.slide_size,
                      'thumbnailSize' : portal_object.thumb_size,
                      'complete': 'true' if not batch.next else 'false',
-                     'container_type' : options.get('container_type', 'portfolio')}">
+                     'container_type' : options.get('container_type', 'portfolio'),
+                     'orderable' : 'true' if orderable else 'false'}">
       </script>
     </div>
     <div metal:define-macro="film_bar" tal:omit-tag="">
diff --git a/skins/photo_lightbox_viewer.js b/skins/photo_lightbox_viewer.js
index e0f304d..ba3ecf1 100644
--- a/skins/photo_lightbox_viewer.js
+++ b/skins/photo_lightbox_viewer.js
@@ -11,7 +11,7 @@ var Lightbox;
 
 var reSelected = /.*selected.*/;
 
-Lightbox = function(grid, toolbar, complete, container_type) {
+Lightbox = function(grid, toolbar, complete, container_type, orderable) {
 	var self = this;
 	this.grid = grid;
 	this._buildSlidesIndex(); // set this.slides and this.lastSlide;
@@ -48,9 +48,11 @@ Lightbox = function(grid, toolbar, complete, container_type) {
 
 	// drag and drop
 	this.disableDefaultDragging();
-	addListener(this.grid, 'dragstart', function(evt){self.onDragStart(evt);});
-	addListener(this.grid, 'dragover', function(evt){self.onDragOver(evt);});
-	addListener(this.grid, 'dragend', function(evt){self.onDragEnd(evt);});
+	this._DDOrderingListeners = {'dragstart' : function(evt){self.onDragStart(evt);},
+								 'dragover' : function(evt){self.onDragOver(evt);},
+								 'dragend' : function(evt){self.onDragEnd(evt);}
+								 };
+	if(orderable) {this.enableDDOrdering();}
 };
 
 Lightbox.prototype._buildSlidesIndex = function() {
@@ -76,6 +78,7 @@ Lightbox.prototype.windowScrollToolbarlHandler = function(evt) {
 		this.switchToolBarPositioning(false);
 	}
 };
+
 Lightbox.prototype.windowScrollGridHandler = function(evt) {
 	if (!this.complete &&
 		!this.fetchingDisabled &&
@@ -180,6 +183,8 @@ Lightbox.prototype.mouseClickHandler = function(evt) {
 Lightbox.prototype.onChangeHandler = function(evt) {
 	var target = getTargetedObject(evt);
 	if (target.name === 'sort_on') {
+		if (target.value === 'position') {this.enableDDOrdering();}
+		else {this.disableDDOrdering();}
 		this.fm.submitButton = {'name' : 'set_sorting', 'value' : 'ok'};
 		this.fm.submit(evt);
 	}
@@ -464,6 +469,19 @@ Lightbox.prototype.getSelectedSlides = function() {
 	return slides;
 };
 
+
+Lightbox.prototype.enableDDOrdering = function() {
+	addListener(this.grid, 'dragstart', this._DDOrderingListeners.dragstart);
+	addListener(this.grid, 'dragover', this._DDOrderingListeners.dragover);
+	addListener(this.grid, 'dragend', this._DDOrderingListeners.dragend);
+};
+
+Lightbox.prototype.disableDDOrdering = function() {
+	removeListener(this.grid, 'dragstart', this._DDOrderingListeners.dragstart);
+	removeListener(this.grid, 'dragover', this._DDOrderingListeners.dragover);
+	removeListener(this.grid, 'dragend', this._DDOrderingListeners.dragend);
+};
+
 Lightbox.prototype.onDragStart = function(evt) {
 	var target = getTargetedObject(evt);
 	this.dragged = target;
diff --git a/skins/portfolio_view.pt b/skins/portfolio_view.pt
index 06de5c3..a194d6f 100644
--- a/skins/portfolio_view.pt
+++ b/skins/portfolio_view.pt
@@ -28,7 +28,9 @@
 
     <div metal:fill-slot="main" tal:omit-tag=""
          tal:define="AddPortalContent modules/Products/CMFCore/permissions/AddPortalContent;
+                     ManageProperties modules/Products/CMFCore/permissions/ManageProperties;
                      dropable python:mtool.checkPermission(AddPortalContent, here);
+                     orderable python:mtool.checkPermission(ManageProperties, here) and here.getDefaultSorting()[0] == 'position';
                      Batch python:modules['Products.Plinn'].Batch;
                      pho_start python:request.get('pho_start', 0);
                      port_start python:request.get('port_start', 0);
-- 
2.20.1


From e73353500c67453ef9663d67eaeee7dd46c358ee Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Fri, 19 Dec 2014 16:43:34 +0100
Subject: [PATCH 15/16] eggification

---
 .../Portfolio/Extensions}/__init__.py          |   0
 .../Portfolio/Extensions}/composite.py         |   0
 .../Portfolio/Extensions}/difference.py        |   0
 .../Portfolio/Extensions}/fonts/Meta           |   0
 .../Portfolio/Extensions}/fonts/MetaBol        |   0
 .../Portfolio/Extensions}/fonts/MetaBolCap     |   0
 .../Portfolio/Extensions}/fonts/MetaCap        |   0
 .../Portfolio/Extensions}/fonts/MetaIta        |   0
 .../Portfolio/Extensions}/fonts/MetaItaCap     |   0
 .../Portfolio/Extensions}/fonts/MetaNor        |   0
 .../Portfolio/Extensions}/fonts/verdana.ttf    | Bin
 .../Portfolio/Extensions}/watermark.py         |   0
 .../Portfolio/ImageManipulationTool.py         |   0
 .../Portfolio/Portfolio.py                     |   0
 __init__.py => Products/Portfolio/__init__.py  |   0
 .../Portfolio/_zctl}/regenPhotos.py            |   0
 .../Portfolio/_zctl}/updateDateTimeOriginal.py |   0
 .../Portfolio/compile-i18n.sh                  |   0
 .../Portfolio/configure.zcml                   |   0
 .../Portfolio/container.py                     |   0
 .../Portfolio/content.zcml                     |   0
 .../Portfolio/deprecated}/Portfolio.py         |   0
 .../Portfolio/deprecated}/__init__.py          |   0
 event.zcml => Products/Portfolio/event.zcml    |   0
 .../Portfolio/event_handlers.py                |   0
 .../Portfolio/graphics}/add_to_cart.psd        | Bin
 .../graphics}/cart-slide-background.ai         |   0
 .../Portfolio/graphics}/film-arrows.psd        | Bin
 .../Portfolio/graphics}/image_toolbar.psd      | Bin
 .../Portfolio/graphics}/lightbox_icon.psd      | Bin
 .../Portfolio/graphics}/refresh.psd            | Bin
 .../Portfolio/graphics}/sellbar-arrow.psd      | Bin
 .../Portfolio/graphics}/slides-background.psd  | Bin
 .../Portfolio/graphics}/trash.psd              | Bin
 .../Portfolio/interfaces.py                    |   0
 .../Portfolio/license-fr.txt                   |   0
 license.txt => Products/Portfolio/license.txt  |   0
 lightbox.py => Products/Portfolio/lightbox.py  |   0
 .../locales}/en/LC_MESSAGES/portfolio.mo       | Bin
 .../locales}/en/LC_MESSAGES/portfolio.po       |   0
 .../locales}/fr/LC_MESSAGES/portfolio.mo       | Bin
 .../locales}/fr/LC_MESSAGES/portfolio.po       |   0
 .../Portfolio/locales}/portfolio-manual.pot    |   0
 .../Portfolio/locales}/portfolio.pot           |   0
 .../Portfolio/manipulation.py                  |   0
 .../Portfolio/migration}/__init__.py           |   0
 .../Portfolio/migration}/toV3.py               |   0
 .../Portfolio/permissions.py                   |   0
 .../Portfolio/permissions.zcml                 |   0
 photo.py => Products/Portfolio/photo.py        |   0
 .../Portfolio/skins}/add_to_cart.png           | Bin
 .../Portfolio/skins}/add_to_cart.py            |   0
 .../Portfolio/skins}/add_to_selection.py       |   0
 .../Portfolio/skins}/cart-slide-background.png | Bin
 .../Portfolio/skins}/cart_btn.gif              | Bin
 .../Portfolio/skins}/cart_listing.js           |   0
 .../Portfolio/skins}/cart_widgets.js           |   0
 {skins => Products/Portfolio/skins}/close.gif  | Bin
 .../Portfolio/skins}/corse_071.jpg             | Bin
 .../Portfolio/skins}/createPortfolio.py        |   0
 .../Portfolio/skins}/edit_metadata_btn.gif     | Bin
 .../Portfolio/skins}/empty_portfolio.gif       | Bin
 .../Portfolio/skins}/fleche_d.ai               |   0
 .../Portfolio/skins}/fleche_d.gif              | Bin
 .../Portfolio/skins}/fleche_g.ai               | Bin
 .../Portfolio/skins}/fleche_g.gif              | Bin
 .../Portfolio/skins}/full_screen_btn.gif       | Bin
 .../Portfolio/skins}/getLightboxPhotosInfos.py |   0
 .../Portfolio/skins}/getPhotoBrainsInfos.py    |   0
 .../Portfolio/skins}/getPhotoContextInfos.py   |   0
 .../Portfolio/skins}/getPhotoInfo.py           |   0
 .../Portfolio/skins}/getPhotosInfos.py         |   0
 .../skins}/getSelectionPhotosInfos.py          |   0
 .../skins}/get_slide_buyable_items.pt          |   0
 .../Portfolio/skins}/hidden-slide-bg.png       | Bin
 .../skins}/image-upload-dd-target.png          | Bin
 .../Portfolio/skins}/image_toolbar_bg.gif      | Bin
 .../Portfolio/skins}/imagelist.xml.py          |   0
 .../Portfolio/skins}/imagelist_template.pt     |   0
 .../Portfolio/skins}/imgtoolbar_sep.gif        | Bin
 .../Portfolio/skins}/keyword_sep.gif           | Bin
 .../Portfolio/skins}/left_film_arrow.gif       | Bin
 .../Portfolio/skins}/lightbox_btn.gif          | Bin
 .../Portfolio/skins}/lightbox_icon.png         | Bin
 .../Portfolio/skins}/lightbox_save_control.py  |   0
 .../Portfolio/skins}/lightbox_view.py          |   0
 .../Portfolio/skins}/lightbox_view_template.pt |   0
 .../Portfolio/skins}/lightboxcontext.py        |   0
 .../Portfolio/skins}/lrservice.py              |   0
 .../skins}/metadata_edit_form_macros.pt        |   0
 .../Portfolio/skins}/mosaique.js               |   0
 .../Portfolio/skins}/mosaique.js.metadata      |   0
 {skins => Products/Portfolio/skins}/my_cart.py |   0
 .../Portfolio/skins}/my_cart_template.pt       |   0
 .../Portfolio/skins}/navigateur.js             |   0
 .../Portfolio/skins}/navigateur.js.metadata    |   0
 .../Portfolio/skins}/next_img_btn.gif          | Bin
 .../Portfolio/skins}/no_image.jpg              | Bin
 {skins => Products/Portfolio/skins}/pause.gif  | Bin
 .../Portfolio/skins}/photo_download.py         |   0
 .../Portfolio/skins}/photo_edit_control.py     |   0
 .../Portfolio/skins}/photo_edit_form.py        |   0
 .../Portfolio/skins}/photo_edit_template.pt    |   0
 .../Portfolio/skins}/photo_film_viewer.js      |   0
 .../skins}/photo_film_viewer.js.metadata       |   0
 .../Portfolio/skins}/photo_gridthumbnail.pt    |   0
 .../Portfolio/skins}/photo_icon.gif            | Bin
 .../Portfolio/skins}/photo_info.pt             |   0
 .../Portfolio/skins}/photo_layout_macros.pt    |   0
 .../Portfolio/skins}/photo_lightbox_viewer.js  |   0
 .../Portfolio/skins}/photo_medium.pt           |   0
 .../skins}/photo_metadata_edit_control.py      |   0
 .../Portfolio/skins}/photo_view.pt             |   0
 .../Portfolio/skins}/photo_view_ajax.py        |   0
 .../skins}/photo_view_ajax_template.pt         |   0
 {skins => Products/Portfolio/skins}/play.ai    |   0
 {skins => Products/Portfolio/skins}/play.gif   | Bin
 .../Portfolio/skins}/portfolio_edit_form.py    |   0
 .../Portfolio/skins}/portfolio_icon.gif        | Bin
 .../Portfolio/skins}/portfolio_move_photos.py  |   0
 .../skins}/portfolio_presentation_form.py      |   0
 .../skins}/portfolio_presentation_template.pt  |   0
 .../skins}/portfolio_properties.props          |   0
 .../Portfolio/skins}/portfolio_style.css.dtml  |   0
 .../skins}/portfolio_thumbnails_tail.py        |   0
 .../portfolio_thumbnails_tail_template.pt      |   0
 .../Portfolio/skins}/portfolio_upload.js       |   0
 .../skins}/portfolio_upload.js.metadata        |   0
 .../Portfolio/skins}/portfolio_view.pt         |   0
 .../Portfolio/skins}/prev_img_btn.gif          | Bin
 .../Portfolio/skins}/refresh.png               | Bin
 .../Portfolio/skins}/remove_to_lightbox.py     |   0
 .../Portfolio/skins}/remove_to_selection.py    |   0
 .../Portfolio/skins}/retractable_menu.js       |   0
 .../Portfolio/skins}/right_film_arrow.gif      | Bin
 .../Portfolio/skins}/save_as_lightbox_form.py  |   0
 .../skins}/save_as_lightbox_template.pt        |   0
 .../Portfolio/skins}/select_flag_btn.gif       | Bin
 .../Portfolio/skins}/selection_view.py         |   0
 .../skins}/selection_view_template.pt          |   0
 .../Portfolio/skins}/selectioncontext.py       |   0
 .../Portfolio/skins}/sell_macros.pt            |   0
 .../Portfolio/skins}/sellbar-arrow.gif         | Bin
 .../Portfolio/skins}/set_photo_title.py        |   0
 .../Portfolio/skins}/shipping_set_control.py   |   0
 .../Portfolio/skins}/shipping_template.pt      |   0
 .../Portfolio/skins}/slide-cart-btn.png        | Bin
 .../skins}/slide-cart-btn.png.metadata         |   0
 .../Portfolio/skins}/slide-del-btn.png         | Bin
 .../Portfolio/skins}/slide-deselect-btn.png    | Bin
 .../Portfolio/skins}/slide-eye-closed.png      | Bin
 .../Portfolio/skins}/slide-eye-open-btn.png    | Bin
 .../skins}/slide-eye-open-btn.png.metadata     |   0
 .../Portfolio/skins}/slide-select-btn.png      | Bin
 .../skins}/slide-select-btn.png.metadata       |   0
 .../Portfolio/skins}/slide_show.pt             |   0
 .../Portfolio/skins}/slide_show.swf            | Bin
 .../Portfolio/skins}/slide_show_btn.gif        | Bin
 .../Portfolio/skins}/slide_style.css           |   0
 .../Portfolio/skins}/slide_style.css.metadata  |   0
 .../Portfolio/skins}/slidebg_del.gif           | Bin
 .../Portfolio/skins}/slidebg_desel.gif         | Bin
 .../Portfolio/skins}/slidebg_desel_del.gif     | Bin
 .../Portfolio/skins}/slidebg_sel.gif           | Bin
 .../Portfolio/skins}/slidebg_sel_del.gif       | Bin
 .../Portfolio/skins}/slider_bg.gif             | Bin
 {skins => Products/Portfolio/skins}/style.css  |   0
 .../Portfolio/skins}/swfobject.js              |   0
 .../Portfolio/skins}/thumbnail.jpg             | Bin
 .../Portfolio/skins}/tiling_infos.xml.py       |   0
 .../Portfolio/skins}/tiling_infos_template.pt  |   0
 .../Portfolio/skins}/transparent.gif           | Bin
 {skins => Products/Portfolio/skins}/trash.png  | Bin
 .../Portfolio/skins}/trash_btn.gif             | Bin
 .../Portfolio/skins}/unselect_flag_btn.gif     | Bin
 .../Portfolio/skins}/zoom_disabled.gif         | Bin
 .../Portfolio/skins}/zoom_in.gif               | Bin
 .../Portfolio/skins}/zoom_out.gif              | Bin
 .../Portfolio/skins}/zoom_view.pt              |   0
 tool.gif => Products/Portfolio/tool.gif        | Bin
 .../Portfolio/update-i18n.sh                   |   0
 utils.py => Products/Portfolio/utils.py        |   0
 version.txt => Products/Portfolio/version.txt  |   0
 .../Portfolio/www}/manageProcessor.zpt         |   0
 Products/__init__.py                           |   5 +++++
 setup.py                                       |  17 +++++++++++++++++
 186 files changed, 22 insertions(+)
 rename {Extensions => Products/Portfolio/Extensions}/__init__.py (100%)
 rename {Extensions => Products/Portfolio/Extensions}/composite.py (100%)
 rename {Extensions => Products/Portfolio/Extensions}/difference.py (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/Meta (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaBol (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaBolCap (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaCap (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaIta (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaItaCap (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/MetaNor (100%)
 rename {Extensions => Products/Portfolio/Extensions}/fonts/verdana.ttf (100%)
 rename {Extensions => Products/Portfolio/Extensions}/watermark.py (100%)
 rename ImageManipulationTool.py => Products/Portfolio/ImageManipulationTool.py (100%)
 rename Portfolio.py => Products/Portfolio/Portfolio.py (100%)
 rename __init__.py => Products/Portfolio/__init__.py (100%)
 rename {_zctl => Products/Portfolio/_zctl}/regenPhotos.py (100%)
 rename {_zctl => Products/Portfolio/_zctl}/updateDateTimeOriginal.py (100%)
 rename compile-i18n.sh => Products/Portfolio/compile-i18n.sh (100%)
 rename configure.zcml => Products/Portfolio/configure.zcml (100%)
 rename container.py => Products/Portfolio/container.py (100%)
 rename content.zcml => Products/Portfolio/content.zcml (100%)
 rename {deprecated => Products/Portfolio/deprecated}/Portfolio.py (100%)
 rename {deprecated => Products/Portfolio/deprecated}/__init__.py (100%)
 rename event.zcml => Products/Portfolio/event.zcml (100%)
 rename event_handlers.py => Products/Portfolio/event_handlers.py (100%)
 rename {graphics => Products/Portfolio/graphics}/add_to_cart.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/cart-slide-background.ai (100%)
 rename {graphics => Products/Portfolio/graphics}/film-arrows.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/image_toolbar.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/lightbox_icon.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/refresh.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/sellbar-arrow.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/slides-background.psd (100%)
 rename {graphics => Products/Portfolio/graphics}/trash.psd (100%)
 rename interfaces.py => Products/Portfolio/interfaces.py (100%)
 rename license-fr.txt => Products/Portfolio/license-fr.txt (100%)
 rename license.txt => Products/Portfolio/license.txt (100%)
 rename lightbox.py => Products/Portfolio/lightbox.py (100%)
 rename {locales => Products/Portfolio/locales}/en/LC_MESSAGES/portfolio.mo (100%)
 rename {locales => Products/Portfolio/locales}/en/LC_MESSAGES/portfolio.po (100%)
 rename {locales => Products/Portfolio/locales}/fr/LC_MESSAGES/portfolio.mo (100%)
 rename {locales => Products/Portfolio/locales}/fr/LC_MESSAGES/portfolio.po (100%)
 rename {locales => Products/Portfolio/locales}/portfolio-manual.pot (100%)
 rename {locales => Products/Portfolio/locales}/portfolio.pot (100%)
 rename manipulation.py => Products/Portfolio/manipulation.py (100%)
 rename {migration => Products/Portfolio/migration}/__init__.py (100%)
 rename {migration => Products/Portfolio/migration}/toV3.py (100%)
 rename permissions.py => Products/Portfolio/permissions.py (100%)
 rename permissions.zcml => Products/Portfolio/permissions.zcml (100%)
 rename photo.py => Products/Portfolio/photo.py (100%)
 rename {skins => Products/Portfolio/skins}/add_to_cart.png (100%)
 rename {skins => Products/Portfolio/skins}/add_to_cart.py (100%)
 rename {skins => Products/Portfolio/skins}/add_to_selection.py (100%)
 rename {skins => Products/Portfolio/skins}/cart-slide-background.png (100%)
 rename {skins => Products/Portfolio/skins}/cart_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/cart_listing.js (100%)
 rename {skins => Products/Portfolio/skins}/cart_widgets.js (100%)
 rename {skins => Products/Portfolio/skins}/close.gif (100%)
 rename {skins => Products/Portfolio/skins}/corse_071.jpg (100%)
 rename {skins => Products/Portfolio/skins}/createPortfolio.py (100%)
 rename {skins => Products/Portfolio/skins}/edit_metadata_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/empty_portfolio.gif (100%)
 rename {skins => Products/Portfolio/skins}/fleche_d.ai (100%)
 rename {skins => Products/Portfolio/skins}/fleche_d.gif (100%)
 rename {skins => Products/Portfolio/skins}/fleche_g.ai (100%)
 rename {skins => Products/Portfolio/skins}/fleche_g.gif (100%)
 rename {skins => Products/Portfolio/skins}/full_screen_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/getLightboxPhotosInfos.py (100%)
 rename {skins => Products/Portfolio/skins}/getPhotoBrainsInfos.py (100%)
 rename {skins => Products/Portfolio/skins}/getPhotoContextInfos.py (100%)
 rename {skins => Products/Portfolio/skins}/getPhotoInfo.py (100%)
 rename {skins => Products/Portfolio/skins}/getPhotosInfos.py (100%)
 rename {skins => Products/Portfolio/skins}/getSelectionPhotosInfos.py (100%)
 rename {skins => Products/Portfolio/skins}/get_slide_buyable_items.pt (100%)
 rename {skins => Products/Portfolio/skins}/hidden-slide-bg.png (100%)
 rename {skins => Products/Portfolio/skins}/image-upload-dd-target.png (100%)
 rename {skins => Products/Portfolio/skins}/image_toolbar_bg.gif (100%)
 rename {skins => Products/Portfolio/skins}/imagelist.xml.py (100%)
 rename {skins => Products/Portfolio/skins}/imagelist_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/imgtoolbar_sep.gif (100%)
 rename {skins => Products/Portfolio/skins}/keyword_sep.gif (100%)
 rename {skins => Products/Portfolio/skins}/left_film_arrow.gif (100%)
 rename {skins => Products/Portfolio/skins}/lightbox_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/lightbox_icon.png (100%)
 rename {skins => Products/Portfolio/skins}/lightbox_save_control.py (100%)
 rename {skins => Products/Portfolio/skins}/lightbox_view.py (100%)
 rename {skins => Products/Portfolio/skins}/lightbox_view_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/lightboxcontext.py (100%)
 rename {skins => Products/Portfolio/skins}/lrservice.py (100%)
 rename {skins => Products/Portfolio/skins}/metadata_edit_form_macros.pt (100%)
 rename {skins => Products/Portfolio/skins}/mosaique.js (100%)
 rename {skins => Products/Portfolio/skins}/mosaique.js.metadata (100%)
 rename {skins => Products/Portfolio/skins}/my_cart.py (100%)
 rename {skins => Products/Portfolio/skins}/my_cart_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/navigateur.js (100%)
 rename {skins => Products/Portfolio/skins}/navigateur.js.metadata (100%)
 rename {skins => Products/Portfolio/skins}/next_img_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/no_image.jpg (100%)
 rename {skins => Products/Portfolio/skins}/pause.gif (100%)
 rename {skins => Products/Portfolio/skins}/photo_download.py (100%)
 rename {skins => Products/Portfolio/skins}/photo_edit_control.py (100%)
 rename {skins => Products/Portfolio/skins}/photo_edit_form.py (100%)
 rename {skins => Products/Portfolio/skins}/photo_edit_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_film_viewer.js (100%)
 rename {skins => Products/Portfolio/skins}/photo_film_viewer.js.metadata (100%)
 rename {skins => Products/Portfolio/skins}/photo_gridthumbnail.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_icon.gif (100%)
 rename {skins => Products/Portfolio/skins}/photo_info.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_layout_macros.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_lightbox_viewer.js (100%)
 rename {skins => Products/Portfolio/skins}/photo_medium.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_metadata_edit_control.py (100%)
 rename {skins => Products/Portfolio/skins}/photo_view.pt (100%)
 rename {skins => Products/Portfolio/skins}/photo_view_ajax.py (100%)
 rename {skins => Products/Portfolio/skins}/photo_view_ajax_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/play.ai (100%)
 rename {skins => Products/Portfolio/skins}/play.gif (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_edit_form.py (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_icon.gif (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_move_photos.py (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_presentation_form.py (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_presentation_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_properties.props (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_style.css.dtml (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_thumbnails_tail.py (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_thumbnails_tail_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_upload.js (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_upload.js.metadata (100%)
 rename {skins => Products/Portfolio/skins}/portfolio_view.pt (100%)
 rename {skins => Products/Portfolio/skins}/prev_img_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/refresh.png (100%)
 rename {skins => Products/Portfolio/skins}/remove_to_lightbox.py (100%)
 rename {skins => Products/Portfolio/skins}/remove_to_selection.py (100%)
 rename {skins => Products/Portfolio/skins}/retractable_menu.js (100%)
 rename {skins => Products/Portfolio/skins}/right_film_arrow.gif (100%)
 rename {skins => Products/Portfolio/skins}/save_as_lightbox_form.py (100%)
 rename {skins => Products/Portfolio/skins}/save_as_lightbox_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/select_flag_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/selection_view.py (100%)
 rename {skins => Products/Portfolio/skins}/selection_view_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/selectioncontext.py (100%)
 rename {skins => Products/Portfolio/skins}/sell_macros.pt (100%)
 rename {skins => Products/Portfolio/skins}/sellbar-arrow.gif (100%)
 rename {skins => Products/Portfolio/skins}/set_photo_title.py (100%)
 rename {skins => Products/Portfolio/skins}/shipping_set_control.py (100%)
 rename {skins => Products/Portfolio/skins}/shipping_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/slide-cart-btn.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-cart-btn.png.metadata (100%)
 rename {skins => Products/Portfolio/skins}/slide-del-btn.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-deselect-btn.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-eye-closed.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-eye-open-btn.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-eye-open-btn.png.metadata (100%)
 rename {skins => Products/Portfolio/skins}/slide-select-btn.png (100%)
 rename {skins => Products/Portfolio/skins}/slide-select-btn.png.metadata (100%)
 rename {skins => Products/Portfolio/skins}/slide_show.pt (100%)
 rename {skins => Products/Portfolio/skins}/slide_show.swf (100%)
 rename {skins => Products/Portfolio/skins}/slide_show_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/slide_style.css (100%)
 rename {skins => Products/Portfolio/skins}/slide_style.css.metadata (100%)
 rename {skins => Products/Portfolio/skins}/slidebg_del.gif (100%)
 rename {skins => Products/Portfolio/skins}/slidebg_desel.gif (100%)
 rename {skins => Products/Portfolio/skins}/slidebg_desel_del.gif (100%)
 rename {skins => Products/Portfolio/skins}/slidebg_sel.gif (100%)
 rename {skins => Products/Portfolio/skins}/slidebg_sel_del.gif (100%)
 rename {skins => Products/Portfolio/skins}/slider_bg.gif (100%)
 rename {skins => Products/Portfolio/skins}/style.css (100%)
 rename {skins => Products/Portfolio/skins}/swfobject.js (100%)
 rename {skins => Products/Portfolio/skins}/thumbnail.jpg (100%)
 rename {skins => Products/Portfolio/skins}/tiling_infos.xml.py (100%)
 rename {skins => Products/Portfolio/skins}/tiling_infos_template.pt (100%)
 rename {skins => Products/Portfolio/skins}/transparent.gif (100%)
 rename {skins => Products/Portfolio/skins}/trash.png (100%)
 rename {skins => Products/Portfolio/skins}/trash_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/unselect_flag_btn.gif (100%)
 rename {skins => Products/Portfolio/skins}/zoom_disabled.gif (100%)
 rename {skins => Products/Portfolio/skins}/zoom_in.gif (100%)
 rename {skins => Products/Portfolio/skins}/zoom_out.gif (100%)
 rename {skins => Products/Portfolio/skins}/zoom_view.pt (100%)
 rename tool.gif => Products/Portfolio/tool.gif (100%)
 rename update-i18n.sh => Products/Portfolio/update-i18n.sh (100%)
 rename utils.py => Products/Portfolio/utils.py (100%)
 rename version.txt => Products/Portfolio/version.txt (100%)
 rename {www => Products/Portfolio/www}/manageProcessor.zpt (100%)
 create mode 100644 Products/__init__.py
 create mode 100644 setup.py

diff --git a/Extensions/__init__.py b/Products/Portfolio/Extensions/__init__.py
similarity index 100%
rename from Extensions/__init__.py
rename to Products/Portfolio/Extensions/__init__.py
diff --git a/Extensions/composite.py b/Products/Portfolio/Extensions/composite.py
similarity index 100%
rename from Extensions/composite.py
rename to Products/Portfolio/Extensions/composite.py
diff --git a/Extensions/difference.py b/Products/Portfolio/Extensions/difference.py
similarity index 100%
rename from Extensions/difference.py
rename to Products/Portfolio/Extensions/difference.py
diff --git a/Extensions/fonts/Meta b/Products/Portfolio/Extensions/fonts/Meta
similarity index 100%
rename from Extensions/fonts/Meta
rename to Products/Portfolio/Extensions/fonts/Meta
diff --git a/Extensions/fonts/MetaBol b/Products/Portfolio/Extensions/fonts/MetaBol
similarity index 100%
rename from Extensions/fonts/MetaBol
rename to Products/Portfolio/Extensions/fonts/MetaBol
diff --git a/Extensions/fonts/MetaBolCap b/Products/Portfolio/Extensions/fonts/MetaBolCap
similarity index 100%
rename from Extensions/fonts/MetaBolCap
rename to Products/Portfolio/Extensions/fonts/MetaBolCap
diff --git a/Extensions/fonts/MetaCap b/Products/Portfolio/Extensions/fonts/MetaCap
similarity index 100%
rename from Extensions/fonts/MetaCap
rename to Products/Portfolio/Extensions/fonts/MetaCap
diff --git a/Extensions/fonts/MetaIta b/Products/Portfolio/Extensions/fonts/MetaIta
similarity index 100%
rename from Extensions/fonts/MetaIta
rename to Products/Portfolio/Extensions/fonts/MetaIta
diff --git a/Extensions/fonts/MetaItaCap b/Products/Portfolio/Extensions/fonts/MetaItaCap
similarity index 100%
rename from Extensions/fonts/MetaItaCap
rename to Products/Portfolio/Extensions/fonts/MetaItaCap
diff --git a/Extensions/fonts/MetaNor b/Products/Portfolio/Extensions/fonts/MetaNor
similarity index 100%
rename from Extensions/fonts/MetaNor
rename to Products/Portfolio/Extensions/fonts/MetaNor
diff --git a/Extensions/fonts/verdana.ttf b/Products/Portfolio/Extensions/fonts/verdana.ttf
similarity index 100%
rename from Extensions/fonts/verdana.ttf
rename to Products/Portfolio/Extensions/fonts/verdana.ttf
diff --git a/Extensions/watermark.py b/Products/Portfolio/Extensions/watermark.py
similarity index 100%
rename from Extensions/watermark.py
rename to Products/Portfolio/Extensions/watermark.py
diff --git a/ImageManipulationTool.py b/Products/Portfolio/ImageManipulationTool.py
similarity index 100%
rename from ImageManipulationTool.py
rename to Products/Portfolio/ImageManipulationTool.py
diff --git a/Portfolio.py b/Products/Portfolio/Portfolio.py
similarity index 100%
rename from Portfolio.py
rename to Products/Portfolio/Portfolio.py
diff --git a/__init__.py b/Products/Portfolio/__init__.py
similarity index 100%
rename from __init__.py
rename to Products/Portfolio/__init__.py
diff --git a/_zctl/regenPhotos.py b/Products/Portfolio/_zctl/regenPhotos.py
similarity index 100%
rename from _zctl/regenPhotos.py
rename to Products/Portfolio/_zctl/regenPhotos.py
diff --git a/_zctl/updateDateTimeOriginal.py b/Products/Portfolio/_zctl/updateDateTimeOriginal.py
similarity index 100%
rename from _zctl/updateDateTimeOriginal.py
rename to Products/Portfolio/_zctl/updateDateTimeOriginal.py
diff --git a/compile-i18n.sh b/Products/Portfolio/compile-i18n.sh
similarity index 100%
rename from compile-i18n.sh
rename to Products/Portfolio/compile-i18n.sh
diff --git a/configure.zcml b/Products/Portfolio/configure.zcml
similarity index 100%
rename from configure.zcml
rename to Products/Portfolio/configure.zcml
diff --git a/container.py b/Products/Portfolio/container.py
similarity index 100%
rename from container.py
rename to Products/Portfolio/container.py
diff --git a/content.zcml b/Products/Portfolio/content.zcml
similarity index 100%
rename from content.zcml
rename to Products/Portfolio/content.zcml
diff --git a/deprecated/Portfolio.py b/Products/Portfolio/deprecated/Portfolio.py
similarity index 100%
rename from deprecated/Portfolio.py
rename to Products/Portfolio/deprecated/Portfolio.py
diff --git a/deprecated/__init__.py b/Products/Portfolio/deprecated/__init__.py
similarity index 100%
rename from deprecated/__init__.py
rename to Products/Portfolio/deprecated/__init__.py
diff --git a/event.zcml b/Products/Portfolio/event.zcml
similarity index 100%
rename from event.zcml
rename to Products/Portfolio/event.zcml
diff --git a/event_handlers.py b/Products/Portfolio/event_handlers.py
similarity index 100%
rename from event_handlers.py
rename to Products/Portfolio/event_handlers.py
diff --git a/graphics/add_to_cart.psd b/Products/Portfolio/graphics/add_to_cart.psd
similarity index 100%
rename from graphics/add_to_cart.psd
rename to Products/Portfolio/graphics/add_to_cart.psd
diff --git a/graphics/cart-slide-background.ai b/Products/Portfolio/graphics/cart-slide-background.ai
similarity index 100%
rename from graphics/cart-slide-background.ai
rename to Products/Portfolio/graphics/cart-slide-background.ai
diff --git a/graphics/film-arrows.psd b/Products/Portfolio/graphics/film-arrows.psd
similarity index 100%
rename from graphics/film-arrows.psd
rename to Products/Portfolio/graphics/film-arrows.psd
diff --git a/graphics/image_toolbar.psd b/Products/Portfolio/graphics/image_toolbar.psd
similarity index 100%
rename from graphics/image_toolbar.psd
rename to Products/Portfolio/graphics/image_toolbar.psd
diff --git a/graphics/lightbox_icon.psd b/Products/Portfolio/graphics/lightbox_icon.psd
similarity index 100%
rename from graphics/lightbox_icon.psd
rename to Products/Portfolio/graphics/lightbox_icon.psd
diff --git a/graphics/refresh.psd b/Products/Portfolio/graphics/refresh.psd
similarity index 100%
rename from graphics/refresh.psd
rename to Products/Portfolio/graphics/refresh.psd
diff --git a/graphics/sellbar-arrow.psd b/Products/Portfolio/graphics/sellbar-arrow.psd
similarity index 100%
rename from graphics/sellbar-arrow.psd
rename to Products/Portfolio/graphics/sellbar-arrow.psd
diff --git a/graphics/slides-background.psd b/Products/Portfolio/graphics/slides-background.psd
similarity index 100%
rename from graphics/slides-background.psd
rename to Products/Portfolio/graphics/slides-background.psd
diff --git a/graphics/trash.psd b/Products/Portfolio/graphics/trash.psd
similarity index 100%
rename from graphics/trash.psd
rename to Products/Portfolio/graphics/trash.psd
diff --git a/interfaces.py b/Products/Portfolio/interfaces.py
similarity index 100%
rename from interfaces.py
rename to Products/Portfolio/interfaces.py
diff --git a/license-fr.txt b/Products/Portfolio/license-fr.txt
similarity index 100%
rename from license-fr.txt
rename to Products/Portfolio/license-fr.txt
diff --git a/license.txt b/Products/Portfolio/license.txt
similarity index 100%
rename from license.txt
rename to Products/Portfolio/license.txt
diff --git a/lightbox.py b/Products/Portfolio/lightbox.py
similarity index 100%
rename from lightbox.py
rename to Products/Portfolio/lightbox.py
diff --git a/locales/en/LC_MESSAGES/portfolio.mo b/Products/Portfolio/locales/en/LC_MESSAGES/portfolio.mo
similarity index 100%
rename from locales/en/LC_MESSAGES/portfolio.mo
rename to Products/Portfolio/locales/en/LC_MESSAGES/portfolio.mo
diff --git a/locales/en/LC_MESSAGES/portfolio.po b/Products/Portfolio/locales/en/LC_MESSAGES/portfolio.po
similarity index 100%
rename from locales/en/LC_MESSAGES/portfolio.po
rename to Products/Portfolio/locales/en/LC_MESSAGES/portfolio.po
diff --git a/locales/fr/LC_MESSAGES/portfolio.mo b/Products/Portfolio/locales/fr/LC_MESSAGES/portfolio.mo
similarity index 100%
rename from locales/fr/LC_MESSAGES/portfolio.mo
rename to Products/Portfolio/locales/fr/LC_MESSAGES/portfolio.mo
diff --git a/locales/fr/LC_MESSAGES/portfolio.po b/Products/Portfolio/locales/fr/LC_MESSAGES/portfolio.po
similarity index 100%
rename from locales/fr/LC_MESSAGES/portfolio.po
rename to Products/Portfolio/locales/fr/LC_MESSAGES/portfolio.po
diff --git a/locales/portfolio-manual.pot b/Products/Portfolio/locales/portfolio-manual.pot
similarity index 100%
rename from locales/portfolio-manual.pot
rename to Products/Portfolio/locales/portfolio-manual.pot
diff --git a/locales/portfolio.pot b/Products/Portfolio/locales/portfolio.pot
similarity index 100%
rename from locales/portfolio.pot
rename to Products/Portfolio/locales/portfolio.pot
diff --git a/manipulation.py b/Products/Portfolio/manipulation.py
similarity index 100%
rename from manipulation.py
rename to Products/Portfolio/manipulation.py
diff --git a/migration/__init__.py b/Products/Portfolio/migration/__init__.py
similarity index 100%
rename from migration/__init__.py
rename to Products/Portfolio/migration/__init__.py
diff --git a/migration/toV3.py b/Products/Portfolio/migration/toV3.py
similarity index 100%
rename from migration/toV3.py
rename to Products/Portfolio/migration/toV3.py
diff --git a/permissions.py b/Products/Portfolio/permissions.py
similarity index 100%
rename from permissions.py
rename to Products/Portfolio/permissions.py
diff --git a/permissions.zcml b/Products/Portfolio/permissions.zcml
similarity index 100%
rename from permissions.zcml
rename to Products/Portfolio/permissions.zcml
diff --git a/photo.py b/Products/Portfolio/photo.py
similarity index 100%
rename from photo.py
rename to Products/Portfolio/photo.py
diff --git a/skins/add_to_cart.png b/Products/Portfolio/skins/add_to_cart.png
similarity index 100%
rename from skins/add_to_cart.png
rename to Products/Portfolio/skins/add_to_cart.png
diff --git a/skins/add_to_cart.py b/Products/Portfolio/skins/add_to_cart.py
similarity index 100%
rename from skins/add_to_cart.py
rename to Products/Portfolio/skins/add_to_cart.py
diff --git a/skins/add_to_selection.py b/Products/Portfolio/skins/add_to_selection.py
similarity index 100%
rename from skins/add_to_selection.py
rename to Products/Portfolio/skins/add_to_selection.py
diff --git a/skins/cart-slide-background.png b/Products/Portfolio/skins/cart-slide-background.png
similarity index 100%
rename from skins/cart-slide-background.png
rename to Products/Portfolio/skins/cart-slide-background.png
diff --git a/skins/cart_btn.gif b/Products/Portfolio/skins/cart_btn.gif
similarity index 100%
rename from skins/cart_btn.gif
rename to Products/Portfolio/skins/cart_btn.gif
diff --git a/skins/cart_listing.js b/Products/Portfolio/skins/cart_listing.js
similarity index 100%
rename from skins/cart_listing.js
rename to Products/Portfolio/skins/cart_listing.js
diff --git a/skins/cart_widgets.js b/Products/Portfolio/skins/cart_widgets.js
similarity index 100%
rename from skins/cart_widgets.js
rename to Products/Portfolio/skins/cart_widgets.js
diff --git a/skins/close.gif b/Products/Portfolio/skins/close.gif
similarity index 100%
rename from skins/close.gif
rename to Products/Portfolio/skins/close.gif
diff --git a/skins/corse_071.jpg b/Products/Portfolio/skins/corse_071.jpg
similarity index 100%
rename from skins/corse_071.jpg
rename to Products/Portfolio/skins/corse_071.jpg
diff --git a/skins/createPortfolio.py b/Products/Portfolio/skins/createPortfolio.py
similarity index 100%
rename from skins/createPortfolio.py
rename to Products/Portfolio/skins/createPortfolio.py
diff --git a/skins/edit_metadata_btn.gif b/Products/Portfolio/skins/edit_metadata_btn.gif
similarity index 100%
rename from skins/edit_metadata_btn.gif
rename to Products/Portfolio/skins/edit_metadata_btn.gif
diff --git a/skins/empty_portfolio.gif b/Products/Portfolio/skins/empty_portfolio.gif
similarity index 100%
rename from skins/empty_portfolio.gif
rename to Products/Portfolio/skins/empty_portfolio.gif
diff --git a/skins/fleche_d.ai b/Products/Portfolio/skins/fleche_d.ai
similarity index 100%
rename from skins/fleche_d.ai
rename to Products/Portfolio/skins/fleche_d.ai
diff --git a/skins/fleche_d.gif b/Products/Portfolio/skins/fleche_d.gif
similarity index 100%
rename from skins/fleche_d.gif
rename to Products/Portfolio/skins/fleche_d.gif
diff --git a/skins/fleche_g.ai b/Products/Portfolio/skins/fleche_g.ai
similarity index 100%
rename from skins/fleche_g.ai
rename to Products/Portfolio/skins/fleche_g.ai
diff --git a/skins/fleche_g.gif b/Products/Portfolio/skins/fleche_g.gif
similarity index 100%
rename from skins/fleche_g.gif
rename to Products/Portfolio/skins/fleche_g.gif
diff --git a/skins/full_screen_btn.gif b/Products/Portfolio/skins/full_screen_btn.gif
similarity index 100%
rename from skins/full_screen_btn.gif
rename to Products/Portfolio/skins/full_screen_btn.gif
diff --git a/skins/getLightboxPhotosInfos.py b/Products/Portfolio/skins/getLightboxPhotosInfos.py
similarity index 100%
rename from skins/getLightboxPhotosInfos.py
rename to Products/Portfolio/skins/getLightboxPhotosInfos.py
diff --git a/skins/getPhotoBrainsInfos.py b/Products/Portfolio/skins/getPhotoBrainsInfos.py
similarity index 100%
rename from skins/getPhotoBrainsInfos.py
rename to Products/Portfolio/skins/getPhotoBrainsInfos.py
diff --git a/skins/getPhotoContextInfos.py b/Products/Portfolio/skins/getPhotoContextInfos.py
similarity index 100%
rename from skins/getPhotoContextInfos.py
rename to Products/Portfolio/skins/getPhotoContextInfos.py
diff --git a/skins/getPhotoInfo.py b/Products/Portfolio/skins/getPhotoInfo.py
similarity index 100%
rename from skins/getPhotoInfo.py
rename to Products/Portfolio/skins/getPhotoInfo.py
diff --git a/skins/getPhotosInfos.py b/Products/Portfolio/skins/getPhotosInfos.py
similarity index 100%
rename from skins/getPhotosInfos.py
rename to Products/Portfolio/skins/getPhotosInfos.py
diff --git a/skins/getSelectionPhotosInfos.py b/Products/Portfolio/skins/getSelectionPhotosInfos.py
similarity index 100%
rename from skins/getSelectionPhotosInfos.py
rename to Products/Portfolio/skins/getSelectionPhotosInfos.py
diff --git a/skins/get_slide_buyable_items.pt b/Products/Portfolio/skins/get_slide_buyable_items.pt
similarity index 100%
rename from skins/get_slide_buyable_items.pt
rename to Products/Portfolio/skins/get_slide_buyable_items.pt
diff --git a/skins/hidden-slide-bg.png b/Products/Portfolio/skins/hidden-slide-bg.png
similarity index 100%
rename from skins/hidden-slide-bg.png
rename to Products/Portfolio/skins/hidden-slide-bg.png
diff --git a/skins/image-upload-dd-target.png b/Products/Portfolio/skins/image-upload-dd-target.png
similarity index 100%
rename from skins/image-upload-dd-target.png
rename to Products/Portfolio/skins/image-upload-dd-target.png
diff --git a/skins/image_toolbar_bg.gif b/Products/Portfolio/skins/image_toolbar_bg.gif
similarity index 100%
rename from skins/image_toolbar_bg.gif
rename to Products/Portfolio/skins/image_toolbar_bg.gif
diff --git a/skins/imagelist.xml.py b/Products/Portfolio/skins/imagelist.xml.py
similarity index 100%
rename from skins/imagelist.xml.py
rename to Products/Portfolio/skins/imagelist.xml.py
diff --git a/skins/imagelist_template.pt b/Products/Portfolio/skins/imagelist_template.pt
similarity index 100%
rename from skins/imagelist_template.pt
rename to Products/Portfolio/skins/imagelist_template.pt
diff --git a/skins/imgtoolbar_sep.gif b/Products/Portfolio/skins/imgtoolbar_sep.gif
similarity index 100%
rename from skins/imgtoolbar_sep.gif
rename to Products/Portfolio/skins/imgtoolbar_sep.gif
diff --git a/skins/keyword_sep.gif b/Products/Portfolio/skins/keyword_sep.gif
similarity index 100%
rename from skins/keyword_sep.gif
rename to Products/Portfolio/skins/keyword_sep.gif
diff --git a/skins/left_film_arrow.gif b/Products/Portfolio/skins/left_film_arrow.gif
similarity index 100%
rename from skins/left_film_arrow.gif
rename to Products/Portfolio/skins/left_film_arrow.gif
diff --git a/skins/lightbox_btn.gif b/Products/Portfolio/skins/lightbox_btn.gif
similarity index 100%
rename from skins/lightbox_btn.gif
rename to Products/Portfolio/skins/lightbox_btn.gif
diff --git a/skins/lightbox_icon.png b/Products/Portfolio/skins/lightbox_icon.png
similarity index 100%
rename from skins/lightbox_icon.png
rename to Products/Portfolio/skins/lightbox_icon.png
diff --git a/skins/lightbox_save_control.py b/Products/Portfolio/skins/lightbox_save_control.py
similarity index 100%
rename from skins/lightbox_save_control.py
rename to Products/Portfolio/skins/lightbox_save_control.py
diff --git a/skins/lightbox_view.py b/Products/Portfolio/skins/lightbox_view.py
similarity index 100%
rename from skins/lightbox_view.py
rename to Products/Portfolio/skins/lightbox_view.py
diff --git a/skins/lightbox_view_template.pt b/Products/Portfolio/skins/lightbox_view_template.pt
similarity index 100%
rename from skins/lightbox_view_template.pt
rename to Products/Portfolio/skins/lightbox_view_template.pt
diff --git a/skins/lightboxcontext.py b/Products/Portfolio/skins/lightboxcontext.py
similarity index 100%
rename from skins/lightboxcontext.py
rename to Products/Portfolio/skins/lightboxcontext.py
diff --git a/skins/lrservice.py b/Products/Portfolio/skins/lrservice.py
similarity index 100%
rename from skins/lrservice.py
rename to Products/Portfolio/skins/lrservice.py
diff --git a/skins/metadata_edit_form_macros.pt b/Products/Portfolio/skins/metadata_edit_form_macros.pt
similarity index 100%
rename from skins/metadata_edit_form_macros.pt
rename to Products/Portfolio/skins/metadata_edit_form_macros.pt
diff --git a/skins/mosaique.js b/Products/Portfolio/skins/mosaique.js
similarity index 100%
rename from skins/mosaique.js
rename to Products/Portfolio/skins/mosaique.js
diff --git a/skins/mosaique.js.metadata b/Products/Portfolio/skins/mosaique.js.metadata
similarity index 100%
rename from skins/mosaique.js.metadata
rename to Products/Portfolio/skins/mosaique.js.metadata
diff --git a/skins/my_cart.py b/Products/Portfolio/skins/my_cart.py
similarity index 100%
rename from skins/my_cart.py
rename to Products/Portfolio/skins/my_cart.py
diff --git a/skins/my_cart_template.pt b/Products/Portfolio/skins/my_cart_template.pt
similarity index 100%
rename from skins/my_cart_template.pt
rename to Products/Portfolio/skins/my_cart_template.pt
diff --git a/skins/navigateur.js b/Products/Portfolio/skins/navigateur.js
similarity index 100%
rename from skins/navigateur.js
rename to Products/Portfolio/skins/navigateur.js
diff --git a/skins/navigateur.js.metadata b/Products/Portfolio/skins/navigateur.js.metadata
similarity index 100%
rename from skins/navigateur.js.metadata
rename to Products/Portfolio/skins/navigateur.js.metadata
diff --git a/skins/next_img_btn.gif b/Products/Portfolio/skins/next_img_btn.gif
similarity index 100%
rename from skins/next_img_btn.gif
rename to Products/Portfolio/skins/next_img_btn.gif
diff --git a/skins/no_image.jpg b/Products/Portfolio/skins/no_image.jpg
similarity index 100%
rename from skins/no_image.jpg
rename to Products/Portfolio/skins/no_image.jpg
diff --git a/skins/pause.gif b/Products/Portfolio/skins/pause.gif
similarity index 100%
rename from skins/pause.gif
rename to Products/Portfolio/skins/pause.gif
diff --git a/skins/photo_download.py b/Products/Portfolio/skins/photo_download.py
similarity index 100%
rename from skins/photo_download.py
rename to Products/Portfolio/skins/photo_download.py
diff --git a/skins/photo_edit_control.py b/Products/Portfolio/skins/photo_edit_control.py
similarity index 100%
rename from skins/photo_edit_control.py
rename to Products/Portfolio/skins/photo_edit_control.py
diff --git a/skins/photo_edit_form.py b/Products/Portfolio/skins/photo_edit_form.py
similarity index 100%
rename from skins/photo_edit_form.py
rename to Products/Portfolio/skins/photo_edit_form.py
diff --git a/skins/photo_edit_template.pt b/Products/Portfolio/skins/photo_edit_template.pt
similarity index 100%
rename from skins/photo_edit_template.pt
rename to Products/Portfolio/skins/photo_edit_template.pt
diff --git a/skins/photo_film_viewer.js b/Products/Portfolio/skins/photo_film_viewer.js
similarity index 100%
rename from skins/photo_film_viewer.js
rename to Products/Portfolio/skins/photo_film_viewer.js
diff --git a/skins/photo_film_viewer.js.metadata b/Products/Portfolio/skins/photo_film_viewer.js.metadata
similarity index 100%
rename from skins/photo_film_viewer.js.metadata
rename to Products/Portfolio/skins/photo_film_viewer.js.metadata
diff --git a/skins/photo_gridthumbnail.pt b/Products/Portfolio/skins/photo_gridthumbnail.pt
similarity index 100%
rename from skins/photo_gridthumbnail.pt
rename to Products/Portfolio/skins/photo_gridthumbnail.pt
diff --git a/skins/photo_icon.gif b/Products/Portfolio/skins/photo_icon.gif
similarity index 100%
rename from skins/photo_icon.gif
rename to Products/Portfolio/skins/photo_icon.gif
diff --git a/skins/photo_info.pt b/Products/Portfolio/skins/photo_info.pt
similarity index 100%
rename from skins/photo_info.pt
rename to Products/Portfolio/skins/photo_info.pt
diff --git a/skins/photo_layout_macros.pt b/Products/Portfolio/skins/photo_layout_macros.pt
similarity index 100%
rename from skins/photo_layout_macros.pt
rename to Products/Portfolio/skins/photo_layout_macros.pt
diff --git a/skins/photo_lightbox_viewer.js b/Products/Portfolio/skins/photo_lightbox_viewer.js
similarity index 100%
rename from skins/photo_lightbox_viewer.js
rename to Products/Portfolio/skins/photo_lightbox_viewer.js
diff --git a/skins/photo_medium.pt b/Products/Portfolio/skins/photo_medium.pt
similarity index 100%
rename from skins/photo_medium.pt
rename to Products/Portfolio/skins/photo_medium.pt
diff --git a/skins/photo_metadata_edit_control.py b/Products/Portfolio/skins/photo_metadata_edit_control.py
similarity index 100%
rename from skins/photo_metadata_edit_control.py
rename to Products/Portfolio/skins/photo_metadata_edit_control.py
diff --git a/skins/photo_view.pt b/Products/Portfolio/skins/photo_view.pt
similarity index 100%
rename from skins/photo_view.pt
rename to Products/Portfolio/skins/photo_view.pt
diff --git a/skins/photo_view_ajax.py b/Products/Portfolio/skins/photo_view_ajax.py
similarity index 100%
rename from skins/photo_view_ajax.py
rename to Products/Portfolio/skins/photo_view_ajax.py
diff --git a/skins/photo_view_ajax_template.pt b/Products/Portfolio/skins/photo_view_ajax_template.pt
similarity index 100%
rename from skins/photo_view_ajax_template.pt
rename to Products/Portfolio/skins/photo_view_ajax_template.pt
diff --git a/skins/play.ai b/Products/Portfolio/skins/play.ai
similarity index 100%
rename from skins/play.ai
rename to Products/Portfolio/skins/play.ai
diff --git a/skins/play.gif b/Products/Portfolio/skins/play.gif
similarity index 100%
rename from skins/play.gif
rename to Products/Portfolio/skins/play.gif
diff --git a/skins/portfolio_edit_form.py b/Products/Portfolio/skins/portfolio_edit_form.py
similarity index 100%
rename from skins/portfolio_edit_form.py
rename to Products/Portfolio/skins/portfolio_edit_form.py
diff --git a/skins/portfolio_icon.gif b/Products/Portfolio/skins/portfolio_icon.gif
similarity index 100%
rename from skins/portfolio_icon.gif
rename to Products/Portfolio/skins/portfolio_icon.gif
diff --git a/skins/portfolio_move_photos.py b/Products/Portfolio/skins/portfolio_move_photos.py
similarity index 100%
rename from skins/portfolio_move_photos.py
rename to Products/Portfolio/skins/portfolio_move_photos.py
diff --git a/skins/portfolio_presentation_form.py b/Products/Portfolio/skins/portfolio_presentation_form.py
similarity index 100%
rename from skins/portfolio_presentation_form.py
rename to Products/Portfolio/skins/portfolio_presentation_form.py
diff --git a/skins/portfolio_presentation_template.pt b/Products/Portfolio/skins/portfolio_presentation_template.pt
similarity index 100%
rename from skins/portfolio_presentation_template.pt
rename to Products/Portfolio/skins/portfolio_presentation_template.pt
diff --git a/skins/portfolio_properties.props b/Products/Portfolio/skins/portfolio_properties.props
similarity index 100%
rename from skins/portfolio_properties.props
rename to Products/Portfolio/skins/portfolio_properties.props
diff --git a/skins/portfolio_style.css.dtml b/Products/Portfolio/skins/portfolio_style.css.dtml
similarity index 100%
rename from skins/portfolio_style.css.dtml
rename to Products/Portfolio/skins/portfolio_style.css.dtml
diff --git a/skins/portfolio_thumbnails_tail.py b/Products/Portfolio/skins/portfolio_thumbnails_tail.py
similarity index 100%
rename from skins/portfolio_thumbnails_tail.py
rename to Products/Portfolio/skins/portfolio_thumbnails_tail.py
diff --git a/skins/portfolio_thumbnails_tail_template.pt b/Products/Portfolio/skins/portfolio_thumbnails_tail_template.pt
similarity index 100%
rename from skins/portfolio_thumbnails_tail_template.pt
rename to Products/Portfolio/skins/portfolio_thumbnails_tail_template.pt
diff --git a/skins/portfolio_upload.js b/Products/Portfolio/skins/portfolio_upload.js
similarity index 100%
rename from skins/portfolio_upload.js
rename to Products/Portfolio/skins/portfolio_upload.js
diff --git a/skins/portfolio_upload.js.metadata b/Products/Portfolio/skins/portfolio_upload.js.metadata
similarity index 100%
rename from skins/portfolio_upload.js.metadata
rename to Products/Portfolio/skins/portfolio_upload.js.metadata
diff --git a/skins/portfolio_view.pt b/Products/Portfolio/skins/portfolio_view.pt
similarity index 100%
rename from skins/portfolio_view.pt
rename to Products/Portfolio/skins/portfolio_view.pt
diff --git a/skins/prev_img_btn.gif b/Products/Portfolio/skins/prev_img_btn.gif
similarity index 100%
rename from skins/prev_img_btn.gif
rename to Products/Portfolio/skins/prev_img_btn.gif
diff --git a/skins/refresh.png b/Products/Portfolio/skins/refresh.png
similarity index 100%
rename from skins/refresh.png
rename to Products/Portfolio/skins/refresh.png
diff --git a/skins/remove_to_lightbox.py b/Products/Portfolio/skins/remove_to_lightbox.py
similarity index 100%
rename from skins/remove_to_lightbox.py
rename to Products/Portfolio/skins/remove_to_lightbox.py
diff --git a/skins/remove_to_selection.py b/Products/Portfolio/skins/remove_to_selection.py
similarity index 100%
rename from skins/remove_to_selection.py
rename to Products/Portfolio/skins/remove_to_selection.py
diff --git a/skins/retractable_menu.js b/Products/Portfolio/skins/retractable_menu.js
similarity index 100%
rename from skins/retractable_menu.js
rename to Products/Portfolio/skins/retractable_menu.js
diff --git a/skins/right_film_arrow.gif b/Products/Portfolio/skins/right_film_arrow.gif
similarity index 100%
rename from skins/right_film_arrow.gif
rename to Products/Portfolio/skins/right_film_arrow.gif
diff --git a/skins/save_as_lightbox_form.py b/Products/Portfolio/skins/save_as_lightbox_form.py
similarity index 100%
rename from skins/save_as_lightbox_form.py
rename to Products/Portfolio/skins/save_as_lightbox_form.py
diff --git a/skins/save_as_lightbox_template.pt b/Products/Portfolio/skins/save_as_lightbox_template.pt
similarity index 100%
rename from skins/save_as_lightbox_template.pt
rename to Products/Portfolio/skins/save_as_lightbox_template.pt
diff --git a/skins/select_flag_btn.gif b/Products/Portfolio/skins/select_flag_btn.gif
similarity index 100%
rename from skins/select_flag_btn.gif
rename to Products/Portfolio/skins/select_flag_btn.gif
diff --git a/skins/selection_view.py b/Products/Portfolio/skins/selection_view.py
similarity index 100%
rename from skins/selection_view.py
rename to Products/Portfolio/skins/selection_view.py
diff --git a/skins/selection_view_template.pt b/Products/Portfolio/skins/selection_view_template.pt
similarity index 100%
rename from skins/selection_view_template.pt
rename to Products/Portfolio/skins/selection_view_template.pt
diff --git a/skins/selectioncontext.py b/Products/Portfolio/skins/selectioncontext.py
similarity index 100%
rename from skins/selectioncontext.py
rename to Products/Portfolio/skins/selectioncontext.py
diff --git a/skins/sell_macros.pt b/Products/Portfolio/skins/sell_macros.pt
similarity index 100%
rename from skins/sell_macros.pt
rename to Products/Portfolio/skins/sell_macros.pt
diff --git a/skins/sellbar-arrow.gif b/Products/Portfolio/skins/sellbar-arrow.gif
similarity index 100%
rename from skins/sellbar-arrow.gif
rename to Products/Portfolio/skins/sellbar-arrow.gif
diff --git a/skins/set_photo_title.py b/Products/Portfolio/skins/set_photo_title.py
similarity index 100%
rename from skins/set_photo_title.py
rename to Products/Portfolio/skins/set_photo_title.py
diff --git a/skins/shipping_set_control.py b/Products/Portfolio/skins/shipping_set_control.py
similarity index 100%
rename from skins/shipping_set_control.py
rename to Products/Portfolio/skins/shipping_set_control.py
diff --git a/skins/shipping_template.pt b/Products/Portfolio/skins/shipping_template.pt
similarity index 100%
rename from skins/shipping_template.pt
rename to Products/Portfolio/skins/shipping_template.pt
diff --git a/skins/slide-cart-btn.png b/Products/Portfolio/skins/slide-cart-btn.png
similarity index 100%
rename from skins/slide-cart-btn.png
rename to Products/Portfolio/skins/slide-cart-btn.png
diff --git a/skins/slide-cart-btn.png.metadata b/Products/Portfolio/skins/slide-cart-btn.png.metadata
similarity index 100%
rename from skins/slide-cart-btn.png.metadata
rename to Products/Portfolio/skins/slide-cart-btn.png.metadata
diff --git a/skins/slide-del-btn.png b/Products/Portfolio/skins/slide-del-btn.png
similarity index 100%
rename from skins/slide-del-btn.png
rename to Products/Portfolio/skins/slide-del-btn.png
diff --git a/skins/slide-deselect-btn.png b/Products/Portfolio/skins/slide-deselect-btn.png
similarity index 100%
rename from skins/slide-deselect-btn.png
rename to Products/Portfolio/skins/slide-deselect-btn.png
diff --git a/skins/slide-eye-closed.png b/Products/Portfolio/skins/slide-eye-closed.png
similarity index 100%
rename from skins/slide-eye-closed.png
rename to Products/Portfolio/skins/slide-eye-closed.png
diff --git a/skins/slide-eye-open-btn.png b/Products/Portfolio/skins/slide-eye-open-btn.png
similarity index 100%
rename from skins/slide-eye-open-btn.png
rename to Products/Portfolio/skins/slide-eye-open-btn.png
diff --git a/skins/slide-eye-open-btn.png.metadata b/Products/Portfolio/skins/slide-eye-open-btn.png.metadata
similarity index 100%
rename from skins/slide-eye-open-btn.png.metadata
rename to Products/Portfolio/skins/slide-eye-open-btn.png.metadata
diff --git a/skins/slide-select-btn.png b/Products/Portfolio/skins/slide-select-btn.png
similarity index 100%
rename from skins/slide-select-btn.png
rename to Products/Portfolio/skins/slide-select-btn.png
diff --git a/skins/slide-select-btn.png.metadata b/Products/Portfolio/skins/slide-select-btn.png.metadata
similarity index 100%
rename from skins/slide-select-btn.png.metadata
rename to Products/Portfolio/skins/slide-select-btn.png.metadata
diff --git a/skins/slide_show.pt b/Products/Portfolio/skins/slide_show.pt
similarity index 100%
rename from skins/slide_show.pt
rename to Products/Portfolio/skins/slide_show.pt
diff --git a/skins/slide_show.swf b/Products/Portfolio/skins/slide_show.swf
similarity index 100%
rename from skins/slide_show.swf
rename to Products/Portfolio/skins/slide_show.swf
diff --git a/skins/slide_show_btn.gif b/Products/Portfolio/skins/slide_show_btn.gif
similarity index 100%
rename from skins/slide_show_btn.gif
rename to Products/Portfolio/skins/slide_show_btn.gif
diff --git a/skins/slide_style.css b/Products/Portfolio/skins/slide_style.css
similarity index 100%
rename from skins/slide_style.css
rename to Products/Portfolio/skins/slide_style.css
diff --git a/skins/slide_style.css.metadata b/Products/Portfolio/skins/slide_style.css.metadata
similarity index 100%
rename from skins/slide_style.css.metadata
rename to Products/Portfolio/skins/slide_style.css.metadata
diff --git a/skins/slidebg_del.gif b/Products/Portfolio/skins/slidebg_del.gif
similarity index 100%
rename from skins/slidebg_del.gif
rename to Products/Portfolio/skins/slidebg_del.gif
diff --git a/skins/slidebg_desel.gif b/Products/Portfolio/skins/slidebg_desel.gif
similarity index 100%
rename from skins/slidebg_desel.gif
rename to Products/Portfolio/skins/slidebg_desel.gif
diff --git a/skins/slidebg_desel_del.gif b/Products/Portfolio/skins/slidebg_desel_del.gif
similarity index 100%
rename from skins/slidebg_desel_del.gif
rename to Products/Portfolio/skins/slidebg_desel_del.gif
diff --git a/skins/slidebg_sel.gif b/Products/Portfolio/skins/slidebg_sel.gif
similarity index 100%
rename from skins/slidebg_sel.gif
rename to Products/Portfolio/skins/slidebg_sel.gif
diff --git a/skins/slidebg_sel_del.gif b/Products/Portfolio/skins/slidebg_sel_del.gif
similarity index 100%
rename from skins/slidebg_sel_del.gif
rename to Products/Portfolio/skins/slidebg_sel_del.gif
diff --git a/skins/slider_bg.gif b/Products/Portfolio/skins/slider_bg.gif
similarity index 100%
rename from skins/slider_bg.gif
rename to Products/Portfolio/skins/slider_bg.gif
diff --git a/skins/style.css b/Products/Portfolio/skins/style.css
similarity index 100%
rename from skins/style.css
rename to Products/Portfolio/skins/style.css
diff --git a/skins/swfobject.js b/Products/Portfolio/skins/swfobject.js
similarity index 100%
rename from skins/swfobject.js
rename to Products/Portfolio/skins/swfobject.js
diff --git a/skins/thumbnail.jpg b/Products/Portfolio/skins/thumbnail.jpg
similarity index 100%
rename from skins/thumbnail.jpg
rename to Products/Portfolio/skins/thumbnail.jpg
diff --git a/skins/tiling_infos.xml.py b/Products/Portfolio/skins/tiling_infos.xml.py
similarity index 100%
rename from skins/tiling_infos.xml.py
rename to Products/Portfolio/skins/tiling_infos.xml.py
diff --git a/skins/tiling_infos_template.pt b/Products/Portfolio/skins/tiling_infos_template.pt
similarity index 100%
rename from skins/tiling_infos_template.pt
rename to Products/Portfolio/skins/tiling_infos_template.pt
diff --git a/skins/transparent.gif b/Products/Portfolio/skins/transparent.gif
similarity index 100%
rename from skins/transparent.gif
rename to Products/Portfolio/skins/transparent.gif
diff --git a/skins/trash.png b/Products/Portfolio/skins/trash.png
similarity index 100%
rename from skins/trash.png
rename to Products/Portfolio/skins/trash.png
diff --git a/skins/trash_btn.gif b/Products/Portfolio/skins/trash_btn.gif
similarity index 100%
rename from skins/trash_btn.gif
rename to Products/Portfolio/skins/trash_btn.gif
diff --git a/skins/unselect_flag_btn.gif b/Products/Portfolio/skins/unselect_flag_btn.gif
similarity index 100%
rename from skins/unselect_flag_btn.gif
rename to Products/Portfolio/skins/unselect_flag_btn.gif
diff --git a/skins/zoom_disabled.gif b/Products/Portfolio/skins/zoom_disabled.gif
similarity index 100%
rename from skins/zoom_disabled.gif
rename to Products/Portfolio/skins/zoom_disabled.gif
diff --git a/skins/zoom_in.gif b/Products/Portfolio/skins/zoom_in.gif
similarity index 100%
rename from skins/zoom_in.gif
rename to Products/Portfolio/skins/zoom_in.gif
diff --git a/skins/zoom_out.gif b/Products/Portfolio/skins/zoom_out.gif
similarity index 100%
rename from skins/zoom_out.gif
rename to Products/Portfolio/skins/zoom_out.gif
diff --git a/skins/zoom_view.pt b/Products/Portfolio/skins/zoom_view.pt
similarity index 100%
rename from skins/zoom_view.pt
rename to Products/Portfolio/skins/zoom_view.pt
diff --git a/tool.gif b/Products/Portfolio/tool.gif
similarity index 100%
rename from tool.gif
rename to Products/Portfolio/tool.gif
diff --git a/update-i18n.sh b/Products/Portfolio/update-i18n.sh
similarity index 100%
rename from update-i18n.sh
rename to Products/Portfolio/update-i18n.sh
diff --git a/utils.py b/Products/Portfolio/utils.py
similarity index 100%
rename from utils.py
rename to Products/Portfolio/utils.py
diff --git a/version.txt b/Products/Portfolio/version.txt
similarity index 100%
rename from version.txt
rename to Products/Portfolio/version.txt
diff --git a/www/manageProcessor.zpt b/Products/Portfolio/www/manageProcessor.zpt
similarity index 100%
rename from www/manageProcessor.zpt
rename to Products/Portfolio/www/manageProcessor.zpt
diff --git a/Products/__init__.py b/Products/__init__.py
new file mode 100644
index 0000000..d407605
--- /dev/null
+++ b/Products/__init__.py
@@ -0,0 +1,5 @@
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..9b8e428
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+from setuptools import setup, find_packages
+
+
+setup(name='Products.Portfolio',
+      version='3.0',
+      description='Photo management for Plinn CMS',
+      url='http://plinn.org',
+      author="Benoît Pin – MINES ParisTech – Armines",
+      author_email="benoit.pin@mines-paristech.fr",
+      license="GPL",
+      packages=find_packages(),
+      include_package_data=True,
+      namespace_packages=['Products'],
+      zip_safe=False,
+      install_requires=[] #TODO
+      )
-- 
2.20.1


From 48537985d4ab422006ad0ea6e0b4fbf1c1fe3365 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Benoi=CC=82t=20Pin?= <pin@cri.ensmp.fr>
Date: Tue, 14 Apr 2015 09:48:51 +0200
Subject: [PATCH 16/16] =?utf8?q?M=C3=A9nage,=20lint.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 Products/Portfolio/skins/photo_lightbox_viewer.js | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/Products/Portfolio/skins/photo_lightbox_viewer.js b/Products/Portfolio/skins/photo_lightbox_viewer.js
index ba3ecf1..8b19c3f 100644
--- a/Products/Portfolio/skins/photo_lightbox_viewer.js
+++ b/Products/Portfolio/skins/photo_lightbox_viewer.js
@@ -24,7 +24,7 @@ Lightbox = function(grid, toolbar, complete, container_type, orderable) {
 		addListener(window, 'scroll', function(evt){self.windowScrollToolbarlHandler(evt);});
 	}
 	addListener(window, 'scroll', function(evt){self.windowScrollGridHandler(evt);});
-	registerStartupFunction(function(){ self.windowScrollGridHandler();});
+	addListener(window, 'load', function(evt){self.windowScrollGridHandler();});
 	this.lastCBChecked = undefined;
 	this.form = undefined;
 	var parent = this.grid.parentNode;
@@ -82,9 +82,7 @@ Lightbox.prototype.windowScrollToolbarlHandler = function(evt) {
 Lightbox.prototype.windowScrollGridHandler = function(evt) {
 	if (!this.complete &&
 		!this.fetchingDisabled &&
-		getWindowScrollY() >
-			(this.lastSlide.firstElementChild || this.lastSlide.children[0]).offsetTop
-			 - getWindowHeight()) {
+		getWindowScrollY() > (this.lastSlide.firstElementChild || this.lastSlide.children[0]).offsetTop - getWindowHeight()) {
 		this.fetchingDisabled = true;
 		this.fetchTail();
 	}
-- 
2.20.1