Commit 2a85506f authored by Pere Cortes's avatar Pere Cortes Committed by Sebastien Robin

erp5_safeimage: Clean-up and view added

parent a0b14c94
from cStringIO import StringIO
from Products.ERP5.Document.Image import Image from Products.ERP5.Document.Image import Image
from Products.ZoomifyImage.ZoomifyZopeProcessor import ZoomifyZopeProcessor
from Products.ZoomifyImage.ZoomifyBase import ZoomifyBase
from zLOG import LOG,INFO,ERROR,WARNING from zLOG import LOG,INFO,ERROR,WARNING
class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor):
def __init__(self, document):
self.document = document
def createTileContainer(self, tileContainerName=None):
""" create each TileGroup """
self.document.newContent(portal_type="Image Tile Group",title=tileContainerName, id=tileContainerName,filename=tileContainerName)
return
def createDefaultViewer(self):
""" add the default Zoomify viewer to the Zoomify metadata """
pass
return
def createDataContainer(self, imageName="None"):
"""Creates nothing coz we are already in the container"""
pass
return
def saveTile(self, image, scaleNumber, column,row):
"""save the cropped region"""
tileFileName = self.getTileFileName(scaleNumber, column, row)
tileContainerName = self.getAssignedTileContainerName(tileFileName=tileFileName)
namesplit = tileFileName.split('.')
w,h = image.size
if w != 0 and h !=0:
tile_group_id = self.getAssignedTileContainerName()
tile_group=self.document[tile_group_id]
tileImageData= StringIO()
image.save(tileImageData,'JPEG',quality=self.qualitySetting)
tileImageData.seek(0)
if tile_group is None:
raise AttributeError('unable to fine tile group %r' % tile_group_id)
w = tile_group.newContent(portal_type='Image',title=namesplit[0],id=namesplit[0],file=tileImageData,filename=namesplit[0])
return
def saveXMLOutput(self):
"""save the xml file"""
my_string = StringIO()
my_string.write(self.getXMLOutput())
my_string.seek(0)
self.document.newContent(portal_type='Embedded File',id='ImageProperties.xml',file=my_string, filename='ImageProperties.xml')
return
class TileImage(Image): class TileImage(Image):
""" """
Tile Images split images in many small parts and then store informations as sub objects Tile Images split images in many small parts and then store informations as sub objects
...@@ -62,16 +8,11 @@ class TileImage(Image): ...@@ -62,16 +8,11 @@ class TileImage(Image):
def _setFile(self, *args, **kw): def _setFile(self, *args, **kw):
"""Set the file content and reset image information.""" """Set the file content and reset image information."""
if "TileGroup0" in self.objectIds(): if "TileGroup0" in self.objectIds():
self.manage_delObjects("TileGroup0") self.manage_delObjects("TileGroup0")
if "ImageProperties.xml" in self.objectIds(): if "ImageProperties.xml" in self.objectIds():
self.manage_delObjects("ImageProperties.xml") self.manage_delObjects("ImageProperties.xml")
self._update_image_info() self._update_image_info()
processor = ERP5ZoomifyZopeProcessor(self) processor = self.Image_getERP5ZoomifyProcessor(self)
processor.ZoomifyProcess(self.getId(),*args) processor.ZoomifyProcess(self.getId(),*args)
import random
import base64
from cStringIO import StringIO
from Products.ERP5.Document.Image import Image from Products.ERP5.Document.Image import Image
from Products.ZoomifyImage.ZoomifyZopeProcessor import ZoomifyZopeProcessor
from Products.ZoomifyImage.ZoomifyBase import ZoomifyBase
from zLOG import LOG,INFO,ERROR,WARNING from zLOG import LOG,INFO,ERROR,WARNING
#from Crypto.Cipher import AES
#from Crypto import Random
class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor):
def __init__(self, document):
self.document = document
self.count = 0
def createTileContainer(self, tileContainerName=None):
""" create each TileGroup """
self.document.newContent(portal_type="Image Tile Group",title=tileContainerName, id=tileContainerName,filename=tileContainerName)
return
def createDefaultViewer(self):
""" add the default Zoomify viewer to the Zoomify metadata """
pass
return
def createDataContainer(self, imageName="None"):
"""Creates nothing coz we are already in the container"""
pass
return
def saveTile(self, image, scaleNumber, column,row):
"""save the cropped region"""
tileFileName = self.getTileFileName(scaleNumber, column, row)
tileContainerName = self.getAssignedTileContainerName(tileFileName=tileFileName)
namesplit = tileFileName.split('.')
w,h = image.size
if w != 0 and h !=0:
tile_group_id = self.getAssignedTileContainerName()
tile_group=self.document[tile_group_id]
tileImageData= StringIO()
image.save(tileImageData,'JPEG',quality=self.qualitySetting)
tileImageData.seek(0)
#msg = self.encrypto(tileImageData.getvalue())
if tile_group is None:
raise AttributeError('unable to fine tile group %r' % tile_group_id)
w = tile_group.newContent(portal_type='Image',title=namesplit[0],id=namesplit[0],file=tileImageData,filename=namesplit[0])
LOG('SAVE TILE',INFO,'Title: %s' %(namesplit[0],))
self._updateTransformedFile(tile_group_id,namesplit[0])
return
def saveXMLOutput(self):
"""save the xml file"""
my_string = StringIO()
my_string.write(self.getXMLOutput())
my_string.seek(0)
self.document.newContent(portal_type='Embedded File',id='ImageProperties.xml',file=my_string, filename='ImageProperties.xml')
return
def _updateTransformedFile(self,tile_group_id,tile_title):
"""create and save the transform file"""
num = random.choice([0,1])
while num >= 0:
algorithm = random.choice(['sepia','brightness','noise','lighten','posterize','edge','none'])
if algorithm == 'lighten':
param1 = random.choice([-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.1,0.2,0.3,0.4,0.5,0.6])
param2 = 0
elif algorithm == 'posterize':
param1 = random.choice([4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])
param2 = 0
elif algorithm == 'brightness':
param1 = random.choice([-80,-60,-40,-20,20,40,60,80])
param2 = random.choice([-0.3,-0.2,-0.1,0,0.1,0.5,0.9])
else:
param1 = 0
param2 = 0
my_text = '%s %s %s %s %s %s \n' %(tile_group_id,tile_title,algorithm,param1,param2,num)
self.my_file.write(my_text)
num = num - 1
def saveTransformedFile(self):
"""add in Zope the transform file """
self.my_file.seek(0)
self.document.newContent(portal_type='Embedded File', id='TransformFile.txt',file=self.my_file,filename='TransformFile.txt')
return
# def encrypto(self,message='Attack at dawn'):
# """encrypto each thing"""
# key ='abcdefghijklmnop'
# iv = Random.new().read(AES.block_size)
# EncodeIV = lambda : base64.b64encode(iv)
# EncodeAES = lambda c, s: base64.b64encode(c.encrypt(message))
# IVcoded = EncodeIV()
# cipher = AES.new(key,AES.MODE_CFB,iv)
# msg = EncodeAES(cipher,key)
# return msg
class TileImageTransformed(Image): class TileImageTransformed(Image):
""" """
Tile Images split images in many small parts and then store informations as sub objects Tile Images split images in many small parts and then store informations as sub objects
""" """
def _setFile(self, *args, **kw): def _setFile(self, *args, **kw):
"""Set the file content and reset image information.""" """Set the file content and reset image information."""
if "TileGroup0" in self.objectIds(): if "TileGroup0" in self.objectIds():
self.manage_delObjects("TileGroup0") self.manage_delObjects("TileGroup0")
if "ImageProperties.xml" in self.objectIds(): if "ImageProperties.xml" in self.objectIds():
self.manage_delObjects("ImageProperties.xml") self.manage_delObjects("ImageProperties.xml")
self._update_image_info() self._update_image_info()
processor = ERP5ZoomifyZopeProcessor(self) processor = self.Image_getERP5ZoomifyProcessor(self,True)
processor.ZoomifyProcess(self.getId(),*args) processor.ZoomifyProcess(self.getId(),*args)
...@@ -6,6 +6,18 @@ ...@@ -6,6 +6,18 @@
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
<item>
<key> <string>__ac_roles__</string> </key>
<value>
<tuple>
<string>Manager</string>
<string>Owner</string>
<string>Anonymous</string>
<string>Authenticated</string>
<string>Associate</string>
</tuple>
</value>
</item>
<item> <item>
<key> <string>_local_properties</string> </key> <key> <string>_local_properties</string> </key>
<value> <value>
......
...@@ -51,12 +51,14 @@ ...@@ -51,12 +51,14 @@
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>import json\n <value> <string>import json\n
\n portal = context.getPortalObject()\n
context.REQUEST.response.setHeader(\'Access-Control-Allow-Origin\', \'*\')\n context.REQUEST.response.setHeader(\'Access-Control-Allow-Origin\', \'*\')\n
print portal.portal_catalog(portal_type="Image Title", src__=1)\n
#return printed\n
data = {}\n data = {}\n
data["image_list"] = []\n data["image_list"] = []\n
image_list = data["image_list"]\n image_list = data["image_list"]\n
for tile_image in context.portal_catalog(portal_type="Image Tile"):\n for tile_image in portal.portal_catalog(portal_type="Image Tile"):\n
title = tile_image.getTitle() \n title = tile_image.getTitle() \n
id = tile_image.getId()\n id = tile_image.getId()\n
image_list.append({"title":title, "id": id})\n image_list.append({"title":title, "id": id})\n
...@@ -80,6 +82,14 @@ return json.dumps(data)\n ...@@ -80,6 +82,14 @@ return json.dumps(data)\n
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>ERP5Site_getTileImageMetadataList</string> </value> <value> <string>ERP5Site_getTileImageMetadataList</string> </value>
</item> </item>
<item>
<key> <string>warnings</string> </key>
<value>
<tuple>
<string>Prints, but never reads \'printed\' variable.</string>
</tuple>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117421.77</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ICanHaz.min.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
(function(){var q=function(){function c(a){return(""+a).replace(/&(?!\\w+;)|[<>"\']/g,function(a){return k[a]||a})}var e=Object.prototype.toString;Array.isArray=Array.isArray||function(a){return"[object Array]"==e.call(a)};var i=String.prototype.trim,g;if(i)g=function(a){return null==a?"":i.call(a)};else{var h,m;/\\S/.test("\\u00a0")?(h=/^[\\s\\xA0]+/,m=/[\\s\\xA0]+$/):(h=/^\\s+/,m=/\\s+$/);g=function(a){return null==a?"":a.toString().replace(h,"").replace(m,"")}}var k={"&":"&amp;","<":"&lt;",">":"&gt;",\'"\':"&quot;",\n
"\'":"&#39;"},o={},p=function(){};p.prototype={otag:"{{",ctag:"}}",pragmas:{},buffer:[],pragmas_implemented:{"IMPLICIT-ITERATOR":!0},context:{},render:function(a,d,b,f){if(!f)this.context=d,this.buffer=[];if(this.includes("",a)){var a=this.render_pragmas(a),j=this.render_section(a,d,b);!1===j&&(j=this.render_tags(a,d,b,f));if(f)return j;this.sendLines(j)}else{if(f)return a;this.send(a)}},send:function(a){""!==a&&this.buffer.push(a)},sendLines:function(a){if(a)for(var a=a.split("\\n"),d=0;d<a.length;d++)this.send(a[d])},\n
render_pragmas:function(a){if(!this.includes("%",a))return a;var d=this,b=this.getCachedRegex("render_pragmas",function(a,d){return RegExp(a+"%([\\\\w-]+) ?([\\\\w]+=[\\\\w]+)?"+d,"g")});return a.replace(b,function(a,b,e){if(!d.pragmas_implemented[b])throw{message:"This implementation of mustache doesn\'t understand the \'"+b+"\' pragma"};d.pragmas[b]={};e&&(a=e.split("="),d.pragmas[b][a[0]]=a[1]);return""})},render_partial:function(a,d,b){a=g(a);if(!b||void 0===b[a])throw{message:"unknown_partial \'"+a+"\'"};\n
return!d||"object"!=typeof d[a]?this.render(b[a],d,b,!0):this.render(b[a],d[a],b,!0)},render_section:function(a,d,b){if(!this.includes("#",a)&&!this.includes("^",a))return!1;var f=this,j=this.getCachedRegex("render_section",function(a,b){return RegExp("^([\\\\s\\\\S]*?)"+a+"(\\\\^|\\\\#)\\\\s*(.+)\\\\s*"+b+"\\n*([\\\\s\\\\S]*?)"+a+"\\\\/\\\\s*\\\\3\\\\s*"+b+"\\\\s*([\\\\s\\\\S]*)$","g")});return a.replace(j,function(a,j,e,c,g,h){var a=j?f.render_tags(j,d,b,!0):"",h=h?f.render(h,d,b,!0):"",n,c=f.find(c,d);"^"===e?n=!c||Array.isArray(c)&&\n
0===c.length?f.render(g,d,b,!0):"":"#"===e&&(n=Array.isArray(c)?f.map(c,function(a){return f.render(g,f.create_context(a),b,!0)}).join(""):f.is_object(c)?f.render(g,f.create_context(c),b,!0):"function"==typeof c?c.call(d,g,function(a){return f.render(a,d,b,!0)}):c?f.render(g,d,b,!0):"");return a+n+h})},render_tags:function(a,d,b,f){for(var j=this,e=function(){return j.getCachedRegex("render_tags",function(a,b){return RegExp(a+"(=|!|>|&|\\\\{|%)?([^#\\\\^]+?)\\\\1?"+b+"+","g")})},g=e(),h=function(a,f,h){switch(f){case "!":return"";\n
case "=":return j.set_delimiters(h),g=e(),"";case ">":return j.render_partial(h,d,b);case "{":case "&":return j.find(h,d);default:return c(j.find(h,d))}},a=a.split("\\n"),i=0;i<a.length;i++)a[i]=a[i].replace(g,h,this),f||this.send(a[i]);if(f)return a.join("\\n")},set_delimiters:function(a){a=a.split(" ");this.otag=this.escape_regex(a[0]);this.ctag=this.escape_regex(a[1])},escape_regex:function(a){if(!arguments.callee.sRE)arguments.callee.sRE=RegExp("(\\\\/|\\\\.|\\\\*|\\\\+|\\\\?|\\\\||\\\\(|\\\\)|\\\\[|\\\\]|\\\\{|\\\\}|\\\\\\\\)",\n
"g");return a.replace(arguments.callee.sRE,"\\\\$1")},find:function(a,d){function b(a){return!1===a||0===a||a}var a=g(a),f;if(a.match(/([a-z_]+)\\./ig)){var c=this.walk_context(a,d);b(c)&&(f=c)}else b(d[a])?f=d[a]:b(this.context[a])&&(f=this.context[a]);return"function"==typeof f?f.apply(d):void 0!==f?f:""},walk_context:function(a,d){for(var b=a.split("."),f=void 0!=d[b[0]]?d:this.context,c=f[b.shift()];void 0!=c&&0<b.length;)f=c,c=c[b.shift()];return"function"==typeof c?c.apply(f):c},includes:function(a,\n
d){return-1!=d.indexOf(this.otag+a)},create_context:function(a){if(this.is_object(a))return a;var d=".";if(this.pragmas["IMPLICIT-ITERATOR"])d=this.pragmas["IMPLICIT-ITERATOR"].iterator;var b={};b[d]=a;return b},is_object:function(a){return a&&"object"==typeof a},map:function(a,d){if("function"==typeof a.map)return a.map(d);for(var b=[],c=a.length,e=0;e<c;e++)b.push(d(a[e]));return b},getCachedRegex:function(a,d){var b=o[this.otag];b||(b=o[this.otag]={});var c=b[this.ctag];c||(c=b[this.ctag]={});\n
(b=c[a])||(b=c[a]=d(this.otag,this.ctag));return b}};return{name:"mustache.js",version:"0.4.0",to_html:function(a,c,b,f){var e=new p;if(f)e.send=f;e.render(a,c||{},b);if(!f)return e.buffer.join("\\n")}}}();(function(){var c={VERSION:"0.10",templates:{},$:"undefined"!==typeof window?window.jQuery||window.Zepto||null:null,addTemplate:function(e,i){if("object"===typeof e)for(var g in e)this.addTemplate(g,e[g]);else c[e]?console.error("Invalid name: "+e+"."):c.templates[e]?console.error(\'Template "\'+e+\n
\' " exists\'):(c.templates[e]=i,c[e]=function(g,i){var g=g||{},k=q.to_html(c.templates[e],g,c.templates);return c.$&&!i?c.$(k):k})},clearAll:function(){for(var e in c.templates)delete c[e];c.templates={}},refresh:function(){c.clearAll();c.grabTemplates()},grabTemplates:function(){var e,i=document.getElementsByTagName("script"),g,h=[];for(e=0,l=i.length;e<l;e++)if((g=i[e])&&g.innerHTML&&g.id&&("text/html"===g.type||"text/x-icanhaz"===g.type))c.addTemplate(g.id,"".trim?g.innerHTML.trim():g.innerHTML.replace(/^\\s+/,\n
"").replace(/\\s+$/,"")),h.unshift(g);for(e=0,l=h.length;e<l;e++)h[e].parentNode.removeChild(h[e])}};"undefined"!==typeof require?module.exports=c:window.ich=c;"undefined"!==typeof document&&(c.$?c.$(function(){c.grabTemplates()}):document.addEventListener("DOMContentLoaded",function(){c.grabTemplates()},!0))})()})();\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>5445</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>ICanHaz.min.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_function</string> </key>
<value> <string>getERP5ZoomifyProcessor</string> </value>
</item>
<item>
<key> <string>_module</string> </key>
<value> <string>ERP5ZoomifyImage</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Image_getERP5ZoomifyProcessor</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Image_getERP5ZoomifyProcessor</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>css</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>css</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117301.19</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>bootstrap.min.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>81150</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>bootstrap.min.css</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Pdata" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}\n
audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}\n
audio:not([controls]){display:none;}\n
html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}\n
a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}\n
a:hover,a:active{outline:0;}\n
sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}\n
sup{top:-0.5em;}\n
sub{bottom:-0.25em;}\n
img{height:auto;border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;}\n
button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}\n
button,input{*overflow:visible;line-height:normal;}\n
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}\n
button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}\n
input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}\n
input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}\n
textarea{overflow:auto;vertical-align:top;}\n
.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}\n
.clearfix:after{clear:both;}\n
.hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;}\n
.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}\n
body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}\n
a{color:#0088cc;text-decoration:none;}\n
a:hover{color:#005580;text-decoration:underline;}\n
.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}\n
.row:after{clear:both;}\n
[class*="span"]{float:left;margin-left:20px;}\n
.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}\n
.span12{width:940px;}\n
.span11{width:860px;}\n
.span10{width:780px;}\n
.span9{width:700px;}\n
.span8{width:620px;}\n
.span7{width:540px;}\n
.span6{width:460px;}\n
.span5{width:380px;}\n
.span4{width:300px;}\n
.span3{width:220px;}\n
.span2{width:140px;}\n
.span1{width:60px;}\n
.offset12{margin-left:980px;}\n
.offset11{margin-left:900px;}\n
.offset10{margin-left:820px;}\n
.offset9{margin-left:740px;}\n
.offset8{margin-left:660px;}\n
.offset7{margin-left:580px;}\n
.offset6{margin-left:500px;}\n
.offset5{margin-left:420px;}\n
.offset4{margin-left:340px;}\n
.offset3{margin-left:260px;}\n
.offset2{margin-left:180px;}\n
.offset1{margin-left:100px;}\n
.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}\n
.row-fluid:after{clear:both;}\n
.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}\n
.row-fluid>[class*="span"]:first-child{margin-left:0;}\n
.row-fluid > .span12{width:99.99999998999999%;}\n
.row-fluid > .span11{width:91.489361693%;}\n
.row-fluid > .span10{width:82.97872339599999%;}\n
.row-fluid > .span9{width:74.468085099%;}\n
.row-fluid > .span8{width:65.95744680199999%;}\n
.row-fluid > .span7{width:57.446808505%;}\n
.row-fluid > .span6{width:48.93617020799999%;}\n
.row-fluid > .span5{width:40.425531911%;}\n
.row-fluid > .span4{width:31.914893614%;}\n
.row-fluid > .span3{width:23.404255317%;}\n
.row-fluid > .span2{width:14.89361702%;}\n
.row-fluid > .span1{width:6.382978723%;}\n
.container{margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}\n
.container:after{clear:both;}\n
.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}\n
.container-fluid:after{clear:both;}\n
p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}\n
.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}\n
h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}\n
h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}\n
h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}\n
h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}\n
h4,h5,h6{line-height:18px;}\n
h4{font-size:14px;}h4 small{font-size:12px;}\n
h5{font-size:12px;}\n
h6{font-size:11px;color:#999999;text-transform:uppercase;}\n
.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}\n
.page-header h1{line-height:1;}\n
ul,ol{padding:0;margin:0 0 9px 25px;}\n
ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}\n
ul{list-style:disc;}\n
ol{list-style:decimal;}\n
li{line-height:18px;}\n
ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}\n
dl{margin-bottom:18px;}\n
dt,dd{line-height:18px;}\n
dt{font-weight:bold;line-height:17px;}\n
dd{margin-left:9px;}\n
.dl-horizontal dt{float:left;clear:left;width:120px;text-align:right;}\n
.dl-horizontal dd{margin-left:130px;}\n
hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}\n
strong{font-weight:bold;}\n
em{font-style:italic;}\n
.muted{color:#999999;}\n
abbr[title]{border-bottom:1px dotted #ddd;cursor:help;}\n
abbr.initialism{font-size:90%;text-transform:uppercase;}\n
blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}\n
blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:\'\\2014 \\00A0\';}\n
blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}\n
q:before,q:after,blockquote:before,blockquote:after{content:"";}\n
address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}\n
small{font-size:100%;}\n
cite{font-style:normal;}\n
code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}\n
code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}\n
pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;}\n
pre code{padding:0;color:inherit;background-color:transparent;border:0;}\n
.pre-scrollable{max-height:340px;overflow-y:scroll;}\n
form{margin:0 0 18px;}\n
fieldset{padding:0;margin:0;border:0;}\n
legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}\n
label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}\n
input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}\n
label{display:block;margin-bottom:5px;color:#333333;}\n
input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}\n
.uneditable-textarea{width:auto;height:auto;}\n
label input,label textarea,label select{display:block;}\n
input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \\9;}\n
input[type="image"]{border:0;}\n
input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}\n
input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}\n
select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}\n
input[type="file"]{line-height:18px \\9;}\n
select{width:220px;background-color:#ffffff;}\n
select[multiple],select[size]{height:auto;}\n
input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}\n
textarea{height:auto;}\n
input[type="hidden"]{display:none;}\n
.radio,.checkbox{padding-left:18px;}\n
.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}\n
.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}\n
.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}\n
.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}\n
input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}\n
input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \\9;}\n
input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}\n
.input-mini{width:60px;}\n
.input-small{width:90px;}\n
.input-medium{width:150px;}\n
.input-large{width:210px;}\n
.input-xlarge{width:270px;}\n
.input-xxlarge{width:530px;}\n
input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}\n
input,textarea,.uneditable-input{margin-left:0;}\n
input.span12, textarea.span12, .uneditable-input.span12{width:930px;}\n
input.span11, textarea.span11, .uneditable-input.span11{width:850px;}\n
input.span10, textarea.span10, .uneditable-input.span10{width:770px;}\n
input.span9, textarea.span9, .uneditable-input.span9{width:690px;}\n
input.span8, textarea.span8, .uneditable-input.span8{width:610px;}\n
input.span7, textarea.span7, .uneditable-input.span7{width:530px;}\n
input.span6, textarea.span6, .uneditable-input.span6{width:450px;}\n
input.span5, textarea.span5, .uneditable-input.span5{width:370px;}\n
input.span4, textarea.span4, .uneditable-input.span4{width:290px;}\n
input.span3, textarea.span3, .uneditable-input.span3{width:210px;}\n
input.span2, textarea.span2, .uneditable-input.span2{width:130px;}\n
input.span1, textarea.span1, .uneditable-input.span1{width:50px;}\n
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#eeeeee;border-color:#ddd;cursor:not-allowed;}\n
.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}\n
.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}\n
.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}\n
.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}\n
.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}\n
.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}\n
.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}\n
.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}\n
.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}\n
input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}\n
.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#eeeeee;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";}\n
.form-actions:after{clear:both;}\n
.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}\n
:-moz-placeholder{color:#999999;}\n
::-webkit-input-placeholder{color:#999999;}\n
.help-block,.help-inline{color:#555555;}\n
.help-block{display:block;margin-bottom:9px;}\n
.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}\n
.input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{*margin-left:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}\n
.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}\n
.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;}\n
.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}\n
.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}\n
.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}\n
.input-append input,.input-append select .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}\n
.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}\n
.input-append .add-on,.input-append .btn{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}\n
.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}\n
.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}\n
.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}\n
.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}\n
.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;margin-bottom:0;}\n
.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}\n
.form-search label,.form-inline label{display:inline-block;}\n
.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}\n
.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}\n
.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-left:0;margin-right:3px;}\n
.control-group{margin-bottom:9px;}\n
legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}\n
.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}\n
.form-horizontal .control-group:after{clear:both;}\n
.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}\n
.form-horizontal .controls{margin-left:160px;*display:inline-block;*margin-left:0;*padding-left:20px;}\n
.form-horizontal .help-block{margin-top:9px;margin-bottom:0;}\n
.form-horizontal .form-actions{padding-left:160px;}\n
table{max-width:100%;border-collapse:collapse;border-spacing:0;background-color:transparent;}\n
.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}\n
.table th{font-weight:bold;}\n
.table thead th{vertical-align:bottom;}\n
.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}\n
.table tbody+tbody{border-top:2px solid #dddddd;}\n
.table-condensed th,.table-condensed td{padding:4px 5px;}\n
.table-bordered{border:1px solid #dddddd;border-left:0;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}\n
.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}\n
.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}\n
.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}\n
.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}\n
.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}\n
.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}\n
.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}\n
table .span1{float:none;width:44px;margin-left:0;}\n
table .span2{float:none;width:124px;margin-left:0;}\n
table .span3{float:none;width:204px;margin-left:0;}\n
table .span4{float:none;width:284px;margin-left:0;}\n
table .span5{float:none;width:364px;margin-left:0;}\n
table .span6{float:none;width:444px;margin-left:0;}\n
table .span7{float:none;width:524px;margin-left:0;}\n
table .span8{float:none;width:604px;margin-left:0;}\n
table .span9{float:none;width:684px;margin-left:0;}\n
table .span10{float:none;width:764px;margin-left:0;}\n
table .span11{float:none;width:844px;margin-left:0;}\n
table .span12{float:none;width:924px;margin-left:0;}\n
table .span13{float:none;width:1004px;margin-left:0;}\n
table .span14{float:none;width:1084px;margin-left:0;}\n
table .span15{float:none;width:1164px;margin-left:0;}\n
table .span16{float:none;width:1244px;margin-left:0;}\n
table .span17{float:none;width:1324px;margin-left:0;}\n
table .span18{float:none;width:1404px;margin-left:0;}\n
table .span19{float:none;width:1484px;margin-left:0;}\n
table .span20{float:none;width:1564px;margin-left:0;}\n
table .span21{float:none;width:1644px;margin-left:0;}\n
table .span22{float:none;width:1724px;margin-left:0;}\n
table .span23{float:none;width:1804px;margin-left:0;}\n
table .span24{float:none;width:1884px;margin-left:0;}\n
[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}\n
.icon-white{background-image:url("../img/glyphicons-halflings-white.png");}\n
.icon-glass{background-position:0 0;}\n
.icon-music{background-position:-24px 0;}\n
.icon-search{background-position:-48px 0;}\n
.icon-envelope{background-position:-72px 0;}\n
.icon-heart{background-position:-96px 0;}\n
.icon-star{background-position:-120px 0;}\n
.icon-star-empty{background-position:-144px 0;}\n
.icon-user{background-position:-168px 0;}\n
.icon-film{background-position:-192px 0;}\n
.icon-th-large{background-position:-216px 0;}\n
.icon-th{background-position:-240px 0;}\n
.icon-th-list{background-position:-264px 0;}\n
.icon-ok{background-position:-288px 0;}\n
.icon-remove{background-position:-312px 0;}\n
.icon-zoom-in{background-position:-336px 0;}\n
.icon-zoom-out{background-position:-360px 0;}\n
.icon-off{background-position:-384px 0;}\n
.icon-signal{background-position:-408px 0;}\n
.icon-cog{background-position:-432px 0;}\n
.icon-trash{background-position:-456px 0;}\n
.icon-home{background-position:0 -24px;}\n
.icon-file{background-position:-24px -24px;}\n
.icon-time{background-position:-48px -24px;}\n
.icon-road{background-position:-72px -24px;}\n
.icon-download-alt{background-position:-96px -24px;}\n
.icon-download{background-position:-120px -24px;}\n
.icon-upload{background-position:-144px -24px;}\n
.icon-inbox{background-position:-168px -24px;}\n
.icon-play-circle{background-position:-192px -24px;}\n
.icon-repeat{background-position:-216px -24px;}\n
.icon-refresh{background-position:-240px -24px;}\n
.icon-list-alt{background-position:-264px -24px;}\n
.icon-lock{background-position:-287px -24px;}\n
.icon-flag{background-position:-312px -24px;}\n
.icon-headphones{background-position:-336px -24px;}\n
.icon-volume-off{background-position:-360px -24px;}\n
.icon-volume-down{background-position:-384px -24px;}\n
.icon-volume-up{background-position:-408px -24px;}\n
.icon-qrcode{background-position:-432px -24px;}\n
.icon-barcode{background-position:-456px -24px;}\n
.icon-tag{background-position:0 -48px;}\n
.icon-tags{background-position:-25px -48px;}\n
.icon-book{background-position:-48px -48px;}\n
.icon-bookmark{background-position:-72px -48px;}\n
.icon-print{background-position:-96px -48px;}\n
.icon-camera{background-position:-120px -48px;}\n
.icon-font{background-position:-144px -48px;}\n
.icon-bold{background-position:-167px -48px;}\n
.icon-italic{background-position:-192px -48px;}\n
.icon-text-height{background-position:-216px -48px;}\n
.icon-text-width{background-position:-240px -48px;}\n
.icon-align-left{background-position:-264px -48px;}\n
.icon-align-center{background-position:-288px -48px;}\n
.icon-align-right{background-position:-312px -48px;}\n
.icon-align-justify{background-position:-336px -48px;}\n
.icon-list{background-position:-360px -48px;}\n
.icon-indent-left{background-position:-384px -48px;}\n
.icon-indent-right{background-position:-408px -48px;}\n
.icon-facetime-video{background-position:-432px -48px;}\n
.icon-picture{background-position:-456px -48px;}\n
.icon-pencil{background-position:0 -72px;}\n
.icon-map-marker{background-position:-24px -72px;}\n
.icon-adjust{background-position:-48px -72px;}\n
.icon-tint{background-position:-72px -72px;}\n
.icon-edit{background-position:-96px -72px;}\n
.icon-share{background-position:-120px -72px;}\n
.icon-check{background-position:-144px -72px;}\n
.icon-move{background-position:-168px -72px;}\n
.icon-step-backward{background-position:-192px -72px;}\n
.icon-fast-backward{background-position:-216px -72px;}\n
.icon-backward{background-position:-240px -72px;}\n
.icon-play{background-position:-264px -72px;}\n
.icon-pause{background-position:-288px -72px;}\n
.icon-stop{background-position:-312px -72px;}\n
.icon-forward{background-position:-336px -72px;}\n
.icon-fast-forward{background-position:-360px -72px;}\n
.icon-step-forward{background-position:-384px -72px;}\n
.icon-eject{background-position:-408px -72px;}\n
.icon-chevron-left{background-position:-432px -72px;}\n
.icon-chevron-right{background-position:-456px -72px;}\n
.icon-plus-sign{background-position:0 -96px;}\n
.icon-minus-sign{background-position:-24px -96px;}\n
.icon-remove-sign{background-position:-48px -96px;}\n
.icon-ok-sign{background-position:-72px -96px;}\n
.icon-question-sign{background-position:-96px -96px;}\n
.icon-info-sign{background-position:-120px -96px;}\n
.icon-screenshot{background-position:-144px -96px;}\n
.icon-remove-circle{background-position:-168px -96px;}\n
.icon-ok-circle{background-position:-192px -96px;}\n
.icon-ban-circle{background-position:-216px -96px;}\n
.icon-arrow-left{background-position:-240px -96px;}\n
.icon-arrow-right{background-position:-264px -96px;}\n
.icon-arrow-up{background-position:-289px -96px;}\n
.icon-arrow-down{background-position:-312px -96px;}\n
.icon-share-alt{background-position:-336px -96px;}\n
.icon-resize-full{background-position:-360px -96px;}\n
.icon-resize-small{background-position:-384px -96px;}\n
.icon-plus{background-position:-408px -96px;}\n
.icon-minus{background-position:-433px -96px;}\n
.icon-asterisk{background-position:-456px -96px;}\n
.icon-exclamation-sign{background-position:0 -120px;}\n
.icon-gift{background-position:-24px -120px;}\n
.icon-leaf{background-position:-48px -120px;}\n
.icon-fire{background-position:-72px -120px;}\n
.icon-eye-open{background-position:-96px -120px;}\n
.icon-eye-close{background-position:-120px -120px;}\n
.icon-warning-sign{background-position:-144px -120px;}\n
.icon-plane{background-position:-168px -120px;}\n
.icon-calendar{background-position:-192px -120px;}\n
.icon-random{background-position:-216px -120px;}\n
.icon-comment{background-position:-240px -120px;}\n
.icon-magnet{background-position:-264px -120px;}\n
.icon-chevron-up{background-position:-288px -120px;}\n
.icon-chevron-down{background-position:-313px -119px;}\n
.icon-retweet{background-position:-336px -120px;}\n
.icon-shopping-cart{background-position:-360px -120px;}\n
.icon-folder-close{background-position:-384px -120px;}\n
.icon-folder-open{background-position:-408px -120px;}\n
.icon-resize-vertical{background-position:-432px -119px;}\n
.icon-resize-horizontal{background-position:-456px -118px;}\n
.dropdown{position:relative;}\n
.dropdown-toggle{*margin-bottom:-3px;}\n
.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}\n
.caret{display:inline-block;width:0;height:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"";}\n
.dropdown .caret{margin-top:8px;margin-left:2px;}\n
.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}\n
.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.pull-right{right:0;left:auto;}\n
.dropdown-menu .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}\n
.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;}\n
.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}\n
.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}\n
.dropdown.open .dropdown-menu{display:block;}\n
.pull-right .dropdown-menu{left:auto;right:0;}\n
.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\\2191";}\n
.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}\n
.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}\n
.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}\n
.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}\n
.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}\n
.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}\n
.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}\n
.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}\n
.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#ffffff\', endColorstr=\'#e6e6e6\', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;}\n
.btn:active,.btn.active{background-color:#cccccc \\9;}\n
.btn:first-child{*margin-left:0;}\n
.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}\n
.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}\n
.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \\9;outline:0;}\n
.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}\n
.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}\n
.btn-large [class^="icon-"]{margin-top:1px;}\n
.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}\n
.btn-small [class^="icon-"]{margin-top:-1px;}\n
.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}\n
.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}\n
.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}\n
.btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#0088cc\', endColorstr=\'#0055cc\', GradientType=0);border-color:#0055cc #0055cc #003580;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0055cc;}\n
.btn-primary:active,.btn-primary.active{background-color:#004099 \\9;}\n
.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#fbb450\', endColorstr=\'#f89406\', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}\n
.btn-warning:active,.btn-warning.active{background-color:#c67605 \\9;}\n
.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#ee5f5b\', endColorstr=\'#bd362f\', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}\n
.btn-danger:active,.btn-danger.active{background-color:#942a25 \\9;}\n
.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#62c462\', endColorstr=\'#51a351\', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}\n
.btn-success:active,.btn-success.active{background-color:#408140 \\9;}\n
.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#5bc0de\', endColorstr=\'#2f96b4\', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}\n
.btn-info:active,.btn-info.active{background-color:#24748c \\9;}\n
.btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#555555\', endColorstr=\'#222222\', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;}\n
.btn-inverse:active,.btn-inverse.active{background-color:#080808 \\9;}\n
button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}\n
button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}\n
button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}\n
button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}\n
.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}\n
.btn-group:after{clear:both;}\n
.btn-group:first-child{*margin-left:0;}\n
.btn-group+.btn-group{margin-left:5px;}\n
.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}\n
.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}\n
.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}\n
.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}\n
.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}\n
.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}\n
.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}\n
.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}\n
.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:3px;*padding-bottom:3px;}\n
.btn-group .btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:1px;*padding-bottom:1px;}\n
.btn-group .btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;}\n
.btn-group .btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;}\n
.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}\n
.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}\n
.btn .caret{margin-top:7px;margin-left:0;}\n
.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}\n
.btn-mini .caret{margin-top:5px;}\n
.btn-small .caret{margin-top:6px;}\n
.btn-large .caret{margin-top:6px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}\n
.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}\n
.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;}\n
.alert-heading{color:inherit;}\n
.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}\n
.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}\n
.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}\n
.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}\n
.alert-block{padding-top:14px;padding-bottom:14px;}\n
.alert-block>p,.alert-block>ul{margin-bottom:0;}\n
.alert-block p+p{margin-top:5px;}\n
.nav{margin-left:0;margin-bottom:18px;list-style:none;}\n
.nav>li>a{display:block;}\n
.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}\n
.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}\n
.nav li+.nav-header{margin-top:9px;}\n
.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}\n
.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}\n
.nav-list>li>a{padding:3px 15px;}\n
.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}\n
.nav-list [class^="icon-"]{margin-right:2px;}\n
.nav-list .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}\n
.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}\n
.nav-tabs:after,.nav-pills:after{clear:both;}\n
.nav-tabs>li,.nav-pills>li{float:left;}\n
.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}\n
.nav-tabs{border-bottom:1px solid #ddd;}\n
.nav-tabs>li{margin-bottom:-1px;}\n
.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}\n
.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}\n
.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}\n
.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;}\n
.nav-stacked>li{float:none;}\n
.nav-stacked>li>a{margin-right:0;}\n
.nav-tabs.nav-stacked{border-bottom:0;}\n
.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}\n
.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}\n
.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}\n
.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}\n
.nav-pills.nav-stacked>li>a{margin-bottom:3px;}\n
.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}\n
.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}\n
.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}\n
.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;}\n
.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;}\n
.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333;}\n
.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}\n
.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}\n
.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}\n
.tabs-stacked .open>a:hover{border-color:#999999;}\n
.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}\n
.tabbable:after{clear:both;}\n
.tab-content{display:table;width:100%;}\n
.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}\n
.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}\n
.tab-content>.active,.pill-content>.active{display:block;}\n
.tabs-below .nav-tabs{border-top:1px solid #ddd;}\n
.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}\n
.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}\n
.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}\n
.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}\n
.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}\n
.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}\n
.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}\n
.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}\n
.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}\n
.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}\n
.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}\n
.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}\n
.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}\n
.navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;}\n
.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#333333\', endColorstr=\'#222222\', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}\n
.navbar .container{width:auto;}\n
.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#333333\', endColorstr=\'#222222\', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}\n
.btn-navbar:active,.btn-navbar.active{background-color:#080808 \\9;}\n
.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}\n
.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}\n
.nav-collapse.collapse{height:auto;}\n
.navbar{color:#999999;}.navbar .brand:hover{text-decoration:none;}\n
.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}\n
.navbar .navbar-text{margin-bottom:0;line-height:40px;}\n
.navbar .btn,.navbar .btn-group{margin-top:5px;}\n
.navbar .btn-group .btn{margin-top:0;}\n
.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}\n
.navbar-form:after{clear:both;}\n
.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}\n
.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;}\n
.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}\n
.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}\n
.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#cccccc;}\n
.navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}\n
.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}\n
.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}\n
.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}\n
.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}\n
.navbar-fixed-top{top:0;}\n
.navbar-fixed-bottom{bottom:0;}\n
.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}\n
.navbar .nav.pull-right{float:right;}\n
.navbar .nav>li{display:block;float:left;}\n
.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}\n
.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}\n
.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;}\n
.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}\n
.navbar .nav.pull-right{margin-left:10px;margin-right:0;}\n
.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:\'\';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}\n
.navbar .dropdown-menu:after{content:\'\';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}\n
.navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}\n
.navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}\n
.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}\n
.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}\n
.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}\n
.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}\n
.navbar .nav.pull-right .dropdown-menu,.navbar .nav .dropdown-menu.pull-right{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before,.navbar .nav .dropdown-menu.pull-right:before{left:auto;right:12px;}\n
.navbar .nav.pull-right .dropdown-menu:after,.navbar .nav .dropdown-menu.pull-right:after{left:auto;right:13px;}\n
.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#ffffff\', endColorstr=\'#f5f5f5\', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}\n
.breadcrumb .divider{padding:0 5px;color:#999999;}\n
.breadcrumb .active a{color:#333333;}\n
.pagination{height:36px;margin:18px 0;}\n
.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}\n
.pagination li{display:inline;}\n
.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}\n
.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}\n
.pagination .active a{color:#999999;cursor:default;}\n
.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}\n
.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}\n
.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}\n
.pagination-centered{text-align:center;}\n
.pagination-right{text-align:right;}\n
.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}\n
.pager:after{clear:both;}\n
.pager li{display:inline;}\n
.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}\n
.pager a:hover{text-decoration:none;background-color:#f5f5f5;}\n
.pager .next a{float:right;}\n
.pager .previous a{float:left;}\n
.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}\n
.modal-open .dropdown-menu{z-index:2050;}\n
.modal-open .dropdown.open{*z-index:2050;}\n
.modal-open .popover{z-index:2060;}\n
.modal-open .tooltip{z-index:2070;}\n
.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}\n
.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}\n
.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}\n
.modal.fade.in{top:50%;}\n
.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}\n
.modal-body{overflow-y:auto;max-height:400px;padding:15px;}\n
.modal-form{margin-bottom:0;}\n
.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}\n
.modal-footer:after{clear:both;}\n
.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}\n
.modal-footer .btn-group .btn+.btn{margin-left:-1px;}\n
.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}\n
.tooltip.top{margin-top:-2px;}\n
.tooltip.right{margin-left:2px;}\n
.tooltip.bottom{margin-top:2px;}\n
.tooltip.left{margin-left:-2px;}\n
.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}\n
.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}\n
.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}\n
.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}\n
.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}\n
.tooltip-arrow{position:absolute;width:0;height:0;}\n
.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}\n
.popover.right{margin-left:5px;}\n
.popover.bottom{margin-top:5px;}\n
.popover.left{margin-left:-5px;}\n
.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}\n
.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}\n
.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}\n
.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}\n
.popover .arrow{position:absolute;width:0;height:0;}\n
.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}\n
.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}\n
.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}\n
.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}\n
.thumbnails:after{clear:both;}\n
.thumbnails>li{float:left;margin:0 0 18px 20px;}\n
.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}\n
a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}\n
.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}\n
.thumbnail .caption{padding:9px;}\n
.label{padding:1px 4px 2px;font-size:10.998px;font-weight:bold;line-height:13px;color:#ffffff;vertical-align:middle;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}\n
.label:hover{color:#ffffff;text-decoration:none;}\n
.label-important{background-color:#b94a48;}\n
.label-important:hover{background-color:#953b39;}\n
.label-warning{background-color:#f89406;}\n
.label-warning:hover{background-color:#c67605;}\n
.label-success{background-color:#468847;}\n
.label-success:hover{background-color:#356635;}\n
.label-info{background-color:#3a87ad;}\n
.label-info:hover{background-color:#2d6987;}\n
.label-inverse{background-color:#333333;}\n
.label-inverse:hover{background-color:#1a1a1a;}\n
.badge{padding:1px 9px 2px;font-size:12.025px;font-weight:bold;white-space:nowrap;color:#ffffff;background-color:#999999;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}\n
.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}\n
.badge-error{background-color:#b94a48;}\n
.badge-error:hover{background-color:#953b39;}\n
.badge-warning{background-color:#f89406;}\n
.badge-warning:hover{background-color:#c67605;}\n
.badge-success{background-color:#468847;}\n
.badge-success:hover{background-color:#356635;}\n
.badge-info{background-color:#3a87ad;}\n
.badge-info:hover{background-color:#2d6987;}\n
.badge-inverse{background-color:#333333;}\n
.badge-inverse:hover{background-color:#1a1a1a;}\n
@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#f5f5f5\', endColorstr=\'#f9f9f9\', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}\n
.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#149bdf\', endColorstr=\'#0480be\', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}\n
.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}\n
.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}\n
.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#ee5f5b\', endColorstr=\'#c43c35\', GradientType=0);}\n
.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}\n
.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#62c462\', endColorstr=\'#57a957\', GradientType=0);}\n
.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}\n
.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#5bc0de\', endColorstr=\'#339bb9\', GradientType=0);}\n
.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}\n
.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\'#fbb450\', endColorstr=\'#f89406\', GradientType=0);}\n
.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}\n
.accordion{margin-bottom:18px;}\n
.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}\n
.accordion-heading{border-bottom:0;}\n
.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}\n
.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}\n
.carousel{position:relative;margin-bottom:18px;line-height:1;}\n
.carousel-inner{overflow:hidden;width:100%;position:relative;}\n
.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}\n
.carousel .item>img{display:block;line-height:1;}\n
.carousel .active,.carousel .next,.carousel .prev{display:block;}\n
.carousel .active{left:0;}\n
.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}\n
.carousel .next{left:100%;}\n
.carousel .prev{left:-100%;}\n
.carousel .next.left,.carousel .prev.right{left:0;}\n
.carousel .active.left{left:-100%;}\n
.carousel .active.right{left:100%;}\n
.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}\n
.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}\n
.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}\n
.carousel-caption h4,.carousel-caption p{color:#ffffff;}\n
.hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}\n
.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;}\n
.pull-right{float:right;}\n
.pull-left{float:left;}\n
.hide{display:none;}\n
.show{display:block;}\n
.invisible{visibility:hidden;}\n
]]></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117191.83</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>default_style.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>div.olMap\n
{\n
\tz-index:0;\n
\tcursor:default;\n
\tmargin:0!important;\n
\tpadding:0!important;\n
}\n
\n
div.olMapViewport\n
{\n
\ttext-align:left;\n
}\n
\n
.olLayerGoogleCopyright\n
{\n
\tleft:2px;\n
\tbottom:2px;\n
}\n
\n
.olLayerGoogleV3.olLayerGoogleCopyright\n
{\n
\tright:auto!important;\n
}\n
\n
.olLayerGooglePoweredBy\n
{\n
\tleft:2px;\n
\tbottom:15px;\n
}\n
\n
.olLayerGoogleV3.olLayerGooglePoweredBy\n
{\n
\tbottom:15px!important;\n
}\n
\n
.olControlAttribution\n
{\n
\tfont-size:smaller;\n
\tright:3px;\n
\tbottom:4.5em;\n
\tposition:absolute;\n
\tdisplay:block;\n
}\n
\n
.olControlScale\n
{\n
\tright:3px;\n
\tbottom:3em;\n
\tdisplay:block;\n
\tposition:absolute;\n
\tfont-size:smaller;\n
}\n
\n
.olControlScaleLine\n
{\n
\tdisplay:block;\n
\tposition:absolute;\n
\tleft:10px;\n
\tbottom:15px;\n
\tfont-size:xx-small;\n
}\n
\n
.olControlScaleLineBottom\n
{\n
\tborder:solid 2px #000;\n
\tborder-bottom:none;\n
\tmargin-top:-2px;\n
\ttext-align:center;\n
}\n
\n
.olControlScaleLineTop\n
{\n
\tborder:solid 2px #000;\n
\tborder-top:none;\n
\ttext-align:center;\n
}\n
\n
.olControlPermalink\n
{\n
\tright:3px;\n
\tbottom:1.5em;\n
\tdisplay:block;\n
\tposition:absolute;\n
\tfont-size:smaller;\n
}\n
\n
div.olControlMousePosition\n
{\n
\tbottom:0;\n
\tright:3px;\n
\tdisplay:block;\n
\tposition:absolute;\n
\tfont-family:Arial;\n
\tfont-size:smaller;\n
}\n
\n
.olControlOverviewMapContainer\n
{\n
\tposition:absolute;\n
\tbottom:0;\n
\tright:0;\n
}\n
\n
.olControlOverviewMapElement\n
{\n
\tbackground-color:#00008B;\n
\t-moz-border-radius:1em 0 0;\n
\tpadding:10px 18px 10px 10px;\n
}\n
\n
.olControlOverviewMapMinimizeButton,.olControlOverviewMapMaximizeButton\n
{\n
\theight:18px;\n
\twidth:18px;\n
\tright:0;\n
\tbottom:80px;\n
\tcursor:pointer;\n
}\n
\n
.olControlOverviewMapExtentRectangle\n
{\n
\toverflow:hidden;\n
\tbackground-image:url(img/blank.gif);\n
\tcursor:move;\n
\tborder:2px dotted red;\n
}\n
\n
.olControlOverviewMapRectReplacement\n
{\n
\toverflow:hidden;\n
\tcursor:move;\n
\tbackground-image:url(img/overview_replacement.gif);\n
\tbackground-repeat:no-repeat;\n
\tbackground-position:center;\n
}\n
\n
.olLayerGeoRSSDescription\n
{\n
\tfloat:left;\n
\twidth:100%;\n
\toverflow:auto;\n
\tfont-size:1em;\n
}\n
\n
.olLayerGeoRSSClose\n
{\n
\tfloat:right;\n
\tcolor:gray;\n
\tfont-size:1.2em;\n
\tmargin-right:6px;\n
\tfont-family:sans-serif;\n
}\n
\n
.olLayerGeoRSSTitle\n
{\n
\tfloat:left;\n
\tfont-size:1.2em;\n
}\n
\n
.olControlNavigationHistory\n
{\n
\tbackground-image:url(img/navigation_history.png);\n
\tbackground-repeat:no-repeat;\n
\twidth:24px;\n
\theight:24px;\n
}\n
\n
.olControlNavigationHistoryPreviousItemActive\n
{\n
\tbackground-position:0 0;\n
}\n
\n
.olControlNavigationHistoryPreviousItemInactive\n
{\n
\tbackground-position:0 -24px;\n
}\n
\n
.olControlNavigationHistoryNextItemActive\n
{\n
\tbackground-position:-24px 0;\n
}\n
\n
.olControlNavigationHistoryNextItemInactive\n
{\n
\tbackground-position:-24px -24px;\n
}\n
\n
div.olControlSaveFeaturesItemActive\n
{\n
\tbackground-image:url(img/save_features_on.png);\n
\tbackground-repeat:no-repeat;\n
\tbackground-position:0 1px;\n
}\n
\n
div.olControlSaveFeaturesItemInactive\n
{\n
\tbackground-image:url(img/save_features_off.png);\n
\tbackground-repeat:no-repeat;\n
\tbackground-position:0 1px;\n
}\n
\n
.olHandlerBoxZoomBox\n
{\n
\tborder:2px solid red;\n
\tposition:absolute;\n
\tbackground-color:#FFF;\n
\topacity:.5;\n
\tfont-size:1px;\n
\tfilter:alpha(opacity=50);\n
}\n
\n
.olHandlerBoxSelectFeature\n
{\n
\tborder:2px solid blue;\n
\tposition:absolute;\n
\tbackground-color:#FFF;\n
\topacity:.5;\n
\tfont-size:1px;\n
\tfilter:alpha(opacity=50);\n
}\n
\n
.olControlPanPanel\n
{\n
\ttop:10px;\n
\tleft:5px;\n
}\n
\n
.olControlPanPanel div\n
{\n
\tbackground-image:url(img/pan-panel.png);\n
\theight:18px;\n
\twidth:18px;\n
\tcursor:pointer;\n
\tposition:absolute;\n
}\n
\n
.olControlPanPanel .olControlPanNorthItemInactive\n
{\n
\ttop:0;\n
\tleft:9px;\n
\tbackground-position:0 0;\n
}\n
\n
.olControlPanPanel .olControlPanSouthItemInactive\n
{\n
\ttop:36px;\n
\tleft:9px;\n
\tbackground-position:18px 0;\n
}\n
\n
.olControlPanPanel .olControlPanWestItemInactive\n
{\n
\tposition:absolute;\n
\ttop:18px;\n
\tleft:0;\n
\tbackground-position:0 18px;\n
}\n
\n
.olControlPanPanel .olControlPanEastItemInactive\n
{\n
\ttop:18px;\n
\tleft:18px;\n
\tbackground-position:18px 18px;\n
}\n
\n
.olControlZoomPanel\n
{\n
\ttop:71px;\n
\tleft:14px;\n
}\n
\n
.olControlZoomPanel div\n
{\n
\tbackground-image:url(img/zoom-panel.png);\n
\tposition:absolute;\n
\theight:18px;\n
\twidth:18px;\n
\tcursor:pointer;\n
}\n
\n
.olControlZoomPanel .olControlZoomInItemInactive\n
{\n
\ttop:0;\n
\tleft:0;\n
\tbackground-position:0 0;\n
}\n
\n
.olControlZoomPanel .olControlZoomToMaxExtentItemInactive\n
{\n
\ttop:18px;\n
\tleft:0;\n
\tbackground-position:0 -18px;\n
}\n
\n
.olControlZoomPanel .olControlZoomOutItemInactive\n
{\n
\ttop:36px;\n
\tleft:0;\n
\tbackground-position:0 18px;\n
}\n
\n
.olControlPanZoomBar div\n
{\n
\tfont-size:1px;\n
}\n
\n
.olPopupCloseBox\n
{\n
\tbackground:url(img/close.gif) no-repeat;\n
\tcursor:pointer;\n
}\n
\n
.olImageLoadError\n
{\n
\tbackground-color:#FFC0CB;\n
\topacity:.5;\n
\tfilter:alpha(opacity=50);\n
}\n
\n
.olCursorWait\n
{\n
\tcursor:wait;\n
}\n
\n
.olDrawBox\n
{\n
\tcursor:crosshair;\n
}\n
\n
.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown\n
{\n
\tcursor:0;\n
}\n
\n
.olControlLayerSwitcher\n
{\n
\tposition:absolute;\n
\ttop:25px;\n
\tright:0;\n
\twidth:20em;\n
\tfont-family:sans-serif;\n
\tfont-weight:700;\n
\tmargin-top:3px;\n
\tmargin-left:3px;\n
\tmargin-bottom:3px;\n
\tfont-size:smaller;\n
\tcolor:#FFF;\n
\tbackground-color:transparent;\n
}\n
\n
.olControlLayerSwitcher .layersDiv\n
{\n
\tbackground-color:#00008B;\n
\tpadding:5px 10px;\n
}\n
\n
.olControlLayerSwitcher .layersDiv .baseLbl,.olControlLayerSwitcher .layersDiv .dataLbl\n
{\n
\tmargin-top:3px;\n
\tmargin-left:3px;\n
\tmargin-bottom:3px;\n
}\n
\n
.olControlLayerSwitcher .layersDiv .baseLayersDiv,.olControlLayerSwitcher .layersDiv .dataLayersDiv\n
{\n
\tpadding-left:10px;\n
}\n
\n
.olControlLayerSwitcher .maximizeDiv,.olControlLayerSwitcher .minimizeDiv\n
{\n
\twidth:18px;\n
\theight:18px;\n
\ttop:5px;\n
\tright:0;\n
\tcursor:pointer;\n
}\n
\n
.olBingAttribution\n
{\n
\tcolor:#DDD;\n
}\n
\n
span.olGoogleAttribution a\n
{\n
\tcolor:#77C;\n
}\n
\n
.olControlNavToolbar,.olControlEditingToolbar\n
{\n
\tmargin:5px 5px 0 0;\n
}\n
\n
.olControlNavToolbar div,.olControlEditingToolbar div\n
{\n
\tbackground-image:url(img/editing_tool_bar.png);\n
\tbackground-repeat:no-repeat;\n
\twidth:24px;\n
\theight:22px;\n
\tcursor:pointer;\n
\tmargin:0 0 5px 5px;\n
}\n
\n
.olControlEditingToolbar\n
{\n
\tright:0;\n
\ttop:0;\n
}\n
\n
.olControlNavToolbar\n
{\n
\ttop:295px;\n
\tleft:9px;\n
}\n
\n
.olControlEditingToolbar div\n
{\n
\tfloat:right;\n
}\n
\n
.olControlNavToolbar .olControlNavigationItemInactive,.olControlEditingToolbar .olControlNavigationItemInactive\n
{\n
\tbackground-position:-103px -1px;\n
}\n
\n
.olControlNavToolbar .olControlNavigationItemActive,.olControlEditingToolbar .olControlNavigationItemActive\n
{\n
\tbackground-position:-103px -24px;\n
}\n
\n
.olControlNavToolbar .olControlZoomBoxItemInactive\n
{\n
\tbackground-position:-128px -1px;\n
}\n
\n
.olControlNavToolbar .olControlZoomBoxItemActive\n
{\n
\tbackground-position:-128px -24px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePointItemInactive\n
{\n
\tbackground-position:-77px -1px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePointItemActive\n
{\n
\tbackground-position:-77px -24px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePathItemInactive\n
{\n
\tbackground-position:-51px -1px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePathItemActive\n
{\n
\tbackground-position:-51px -24px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive\n
{\n
\tbackground-position:-26px -1px;\n
}\n
\n
.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive\n
{\n
\tbackground-position:-26px -24px;\n
}\n
\n
div.olControlZoom\n
{\n
\tposition:absolute;\n
\ttop:8px;\n
\tleft:8px;\n
\tbackground:rgba(255,255,255,0.4);\n
\tborder-radius:4px;\n
\tpadding:2px;\n
}\n
\n
div.olControlZoom a\n
{\n
\tdisplay:block;\n
\tcolor:#FFF;\n
\tfont-size:18px;\n
\tfont-family:\'Lucida Grande\', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;\n
\tfont-weight:700;\n
\ttext-decoration:none;\n
\ttext-align:center;\n
\theight:22px;\n
\twidth:22px;\n
\tline-height:19px;\n
\tbackground:rgba(0,60,136,0.5);\n
\tfilter:alpha(opacity=80);\n
\tmargin:1px;\n
\tpadding:0;\n
}\n
\n
div.olControlZoom a:hover\n
{\n
\tbackground:rgba(0,60,136,0.7);\n
\tfilter:alpha(opacity=100);\n
}\n
\n
a.olControlZoomIn\n
{\n
\tborder-radius:4px 4px 0 0;\n
}\n
\n
a.olControlZoomOut\n
{\n
\tborder-radius:0 0 4px 4px;\n
}\n
\n
.olLayerGrid .olTileImage\n
{\n
\t-webkit-transition:opacity .2s linear;\n
\t-moz-transition:opacity .2s linear;\n
\t-o-transition:opacity .2s linear;\n
\ttransition:opacity .2s linear;\n
}\n
\n
div.olLayerDiv,.olControlNoSelect\n
{\n
\t-khtml-user-select:none;\n
\t-moz-user-select:none;\n
}\n
\n
.olPopupContent,.olFramedCloudPopupContent\n
{\n
\toverflow:auto;\n
\tpadding:5px;\n
}\n
\n
.olDragDown,.olControlDragFeatureOver\n
{\n
\tcursor:move;\n
}\n
\n
.olBingAttribution.road,.olGoogleAttribution\n
{\n
\tcolor:#333;\n
}\n
\n
.olGoogleAttribution.hybrid,.olGoogleAttribution.satellite,span.olGoogleAttribution.hybrid a,span.olGoogleAttribution.satellite a\n
{\n
\tcolor:#EEE;\n
}\n
\n
@media only screen and max-width 600px {\n
\tdiv.olControlZoom a:hover\n
\t{\n
\t\tbackground:rgba(0,60,136,0.5);\n
\t}\n
}</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>8334</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>default_style.css</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117202.45</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>style.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/**\n
CSS Reset\n
* From Blueprint reset.css\n
* http://blueprintcss.googlecode.com\n
*/\n
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}\n
body {line-height:1.5;}\n
table {border-collapse:separate;border-spacing:0;}\n
caption, th, td {text-align:left;font-weight:normal;}\n
table, td, th {vertical-align:middle;}\n
blockquote:before, blockquote:after, q:before, q:after {content:"";}\n
blockquote, q {quotes:"" "";}\n
a img {border:none;}\n
/**\n
* Basic Typography\n
*/\n
body {\n
font-family: "Lucida Grande", Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;\n
font-size: 80%;\n
color: #222;\n
background: #fff;\n
margin: 1em 1.5em;\n
}\n
pre, code {\n
margin: 1.5em 0;\n
white-space: pre;\n
}\n
pre, code {\n
font: 1em \'andale mono\', \'lucida console\', monospace;\n
line-height:1.5;\n
}\n
a[href] {\n
color: #436976;\n
background-color: transparent;\n
}\n
h1, h2, h3, h4, h5, h6 {\n
color: #003a6b;\n
background-color: transparent;\n
font: 100% \'Lucida Grande\', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;\n
margin: 0;\n
padding-top: 0.5em;\n
}\n
h1 {\n
font-size: 130%;\n
margin-bottom: 0.5em;\n
border-bottom: 1px solid #fcb100;\n
}\n
h2 {\n
font-size: 120%;\n
margin-bottom: 0.5em;\n
border-bottom: 1px solid #aaa;\n
}\n
h3 {\n
font-size: 110%;\n
margin-bottom: 0.5em;\n
text-decoration: underline;\n
}\n
h4 {\n
font-size: 100%;\n
font-weight: bold;\n
}\n
h5 {\n
font-size: 100%;\n
font-weight: bold;\n
}\n
h6 {\n
font-size: 80%;\n
font-weight: bold;\n
}\n
/**\n
* Map Examples Specific\n
*/\n
.smallmap {\n
/*width: 512px;\n
height: 256px;*/\n
width: 800px;\n
height: 500px;\n
border: 1px solid #ccc;\n
}\n
#tags {\n
display: none;\n
}\n
</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1809</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>style.css</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">\n
<title>SafeImage</title>\n
<link href="css/bootstrap.min.css" rel="stylesheet"/>\n
<link rel="stylesheet" href="css/default_style.css" type="text/css">\n
<link rel="stylesheet" href="css/style.css" type="text/css">\n
</head>\n
<body>\n
<div class="navbar">\n
<div class="navbar-inner">\n
<div class="container-fluid">\n
<div class="row-fluid">\n
<div class="span10">\n
<ul class="nav">\n
<li><a href="#">Dashboard</a></li>\n
<li><a href="#about">About</a></li>\n
<li><a href="#contact">Contact</a></li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
<div class="container-fluid">\n
<div class="row-fluid">\n
<div class="span3">\n
<div class="well">\n
<ul class="nav nav-list">\n
<li class="nav-header">Images</li>\n
</ul>\n
</div>\n
</div>\n
<section class="span9" id="main">\n
<!--Body content-->\n
</section>\n
</div>\n
</div>\n
<script type="text/javascript" src="js/template.js"></script>\n
<script type="text/javascript" src="jquery/core/jquery.js"></script>\n
<script type="text/javascript" src="urlHandler.js"></script>\n
<script type="text/javascript" src="ICanHaz.min.js"></script>\n
<script type="text/javascript" src="openlayers/OpenLayers.js"></script>\n
<script type="text/javascript" src="js/CanvasImage.js"></script>\n
<script type="text/javascript" src="js/ERP5_OpenLayers.js"></script>\n
<script type="text/javascript" src="js/form.js"></script>\n
<script type="text/javascript" src="js/safeimage.js"></script>\n
<script type="text/javascript" src="js/pixastic.js"></script>\n
</body>\n
</html>
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <unicode>utf-8</unicode> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>js</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54116840.51</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>CanvasImage.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD\n
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the\n
* full text of the license. */\n
\n
\n
/**\n
* @requires OpenLayers/Tile.js\n
*/\n
\n
/**\n
* Class: OpenLayers.Tile.CanvasImage\n
* Instances of OpenLayers.Tile.CanvasImage are used to manage the image tiles\n
* used by various layers. Create a new image tile with the\n
* <OpenLayers.Tile.CanvasImage> constructor.\n
*\n
* Inherits from:\n
* - <OpenLayers.Tile>\n
*/\n
OpenLayers.Tile.CanvasImage = OpenLayers.Class(OpenLayers.Tile, {\n
\n
/** \n
* Property: url\n
* {String} The URL of the image being requested. No default. Filled in by\n
* layer.getURL() function. \n
*/\n
url: null,\n
\n
/** \n
* Property: canvasType\n
* {OpenLayers.Layer.Grid.ONECANVASPERLAYER|\n
* OpenLayers.Layer.Grid.ONECANVASPERTILE} One canvas element per layer or per tile?\n
*/ \n
canvasType: null,\n
\n
/**\n
* APIProperty: crossOriginKeyword\n
* The value of the crossorigin keyword to use when loading images. This is\n
* only relevant when using <getCanvasContext> for tiles from remote\n
* origins and should be set to either \'anonymous\' or \'use-credentials\'\n
* for servers that send Access-Control-Allow-Origin headers with their\n
* tiles.\n
*/\n
crossOriginKeyword: null,\n
/**\n
* APIProperty: crossOriginKeyword\n
* The value of the crossorigin keyword to use when loading images. This is\n
* only relevant when using <getCanvasContext> for tiles from remote\n
* origins and should be set to either \'anonymous\' or \'use-credentials\'\n
* for servers that send Access-Control-Allow-Origin headers with their\n
* tiles.\n
*/\n
crossOriginKeyword: null,\n
\n
\n
/**\n
* Property: frame\n
* {DOMElement} The canvas element is appended to the frame. Any gutter on\n
* the canvas will be hidden behind the frame. \n
*/ \n
frame: null,\n
\n
/**\n
* Property: isLoading\n
* {Boolean} Indicates if the tile is currently waiting on a loading image. \n
*/ \n
isLoading: false,\n
\n
/** \n
* Property: canvas\n
* {DOMElement} The canvas element on which the image is drawn.\n
*/\n
canvas: null,\n
\n
/** \n
* Property: canvasImageData\n
* {ImageData} The ImageData object for the canvas.\n
*/\n
canvasImageData: null,\n
\n
/** \n
* Property: lastImage\n
* {Image} The last requested image object. This property is used to make sure\n
* that only the recent image is drawn.\n
*/\n
lastImage: null,\n
\n
/** \n
* Property: lastBounds\n
* {<OpenLayers.Bounds>} The bounds of the last requested image, needed for \n
* VirtualCanvasImage.displayImage().\n
*/\n
lastBounds: null,\n
\n
/**\n
* Property: isBackBuffer\n
* {Boolean} Is this tile a back buffer tile?\n
*/\n
isBackBuffer: false,\n
\n
/**\n
* Property: backBufferTile\n
* {<OpenLayers.Tile>} A clone of the tile used to create transition\n
* effects when the tile is moved or changes resolution.\n
*/\n
backBufferTile: null,\n
\n
/**\n
*Property. transforms\n
*JSON file where the transforms are written\n
*\n
*/\n
transforms: null,\n
\n
/** \n
*Property partialTile\n
*/\n
partialTile: null,\n
\n
/**\n
*Propperty partialId\n
*/\n
\n
partialId: null,\n
\n
/**\n
*Property partialAlgorithm\n
*/\n
partialAlgorithm: null,\n
\n
\n
/**\n
*Property partialParam1\n
*/\n
partialParam1: null,\n
\n
/**\n
*Property partialParam2\n
*/\n
partialParam2: null,\n
\n
/**\n
*Property partialNum\n
*/\n
partialNum: 0,\n
\n
/** TBD 3.0 - reorder the parameters to the init function to remove \n
* URL. the getUrl() function on the layer gets called on \n
* each draw(), so no need to specify it here.\n
* \n
* Constructor: OpenLayers.Tile.Image\n
* Constructor for a new <OpenLayers.Tile.Image> instance.\n
* \n
* Parameters:\n
* layer - {<OpenLayers.Layer>} layer that the tile will go in.\n
* position - {<OpenLayers.Pixel>}\n
* bounds - {<OpenLayers.Bounds>}\n
* url - {<String>} Deprecated. Remove me in 3.0.\n
* size - {<OpenLayers.Size>}\n
* canvasType - {<OpenLayers.Layer.Grid.ONECANVASPERLAYER|OpenLayers.Layer.Grid.ONECANVASPERTILE>}\n
*/ \n
initialize: function(layer, position, bounds, url, size,transforms, canvasType) {\n
OpenLayers.Tile.prototype.initialize.apply(this, arguments);\n
this.url = url; //deprecated remove me\n
this.canvasType = canvasType;\n
this.frame = document.createElement(\'div\'); \n
this.frame.style.overflow = \'hidden\'; \n
this.frame.style.position = \'absolute\'; \n
this.transforms = transforms; \n
this.events.addEventType("reprojectionProgress");\n
this.events.addEventType("filterProgress");\n
},\n
\n
/** \n
* APIMethod: destroy\n
* nullify references to prevent circular references and memory leaks\n
*/\n
destroy: function() {\n
if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) {\n
this.layer.div.removeChild(this.frame);\n
}\n
this.frame = null;\n
this.lastImage = null;\n
this.canvas = null;\n
this.canvasContext = null;\n
// clean up the backBufferTile if it exists\n
if (this.backBufferTile) {\n
this.backBufferTile.destroy();\n
this.backBufferTile = null;\n
this.layer.events.unregister("loadend", this, this.hideBackBuffer);\n
} \n
OpenLayers.Tile.prototype.destroy.apply(this, arguments);\n
},\n
\n
/**\n
* Method: clone\n
*\n
* Parameters:\n
* obj - {<OpenLayers.Tile.Image>} The tile to be cloned\n
*\n
* Returns:\n
* {<OpenLayers.Tile.Image>} An exact clone of this <OpenLayers.Tile.Image>\n
*/\n
clone: function (obj) {\n
if (obj == null) {\n
obj = new OpenLayers.Tile.CanvasImage(this.layer, \n
this.position, \n
this.bounds, \n
this.url, \n
this.size,\n
this.canvasType); \n
} \n
\n
//pick up properties from superclass\n
obj = OpenLayers.Tile.prototype.clone.apply(this, [obj]);\n
\n
// a new canvas element should be created for the clone\n
obj.canvas = null;\n
\n
return obj;\n
},\n
\n
/**\n
* Method: draw\n
* Check that a tile should be drawn, and draw it. Starts a\n
* transition if the layer requests one.\n
* \n
* Returns:\n
* {Boolean} Always returns true.\n
*/\n
draw: function() {\n
if (this.layer != this.layer.map.baseLayer && this.layer.reproject) {\n
this.bounds = this.getBoundsFromBaseLayer(this.position);\n
}\n
var drawTile = OpenLayers.Tile.prototype.draw.apply(this, arguments);\n
\n
if (this.layer.usesTransition()) {\n
this.startTransition(drawTile);\n
}\n
\n
if (!drawTile) {\n
return;\n
}\n
\n
if (this.isLoading) {\n
// if we\'re already loading, send \'reload\' instead of \'loadstart\'.\n
this.events.triggerEvent("reload"); \n
} else {\n
this.isLoading = true;\n
this.events.triggerEvent("loadstart");\n
}\n
return this.renderTile(); \n
},\n
\n
/**\n
* Method: renderTile\n
* Creates the canvas element and sets the URL.\n
* \n
* Returns:\n
* {Boolean} Always returns true.\n
*/\n
renderTile: function() {\n
if (this.canvas === null) {\n
this.initCanvas();\n
} \n
\n
if (this.layer.async) {\n
// Asyncronous image requests call the asynchronous getURL method\n
// on the layer to fetch an image that covers \'this.bounds\', in the scope of\n
// \'this\', setting the \'url\' property of the layer itself, and running\n
// the callback \'positionFrame\' when the image request returns.\n
this.layer.getURLasync(this.bounds, this, "url", this.positionImage);\n
} else {\n
// syncronous image requests get the url and position the frame immediately,\n
// and don\'t wait for an image request to come back.\n
\n
// todo: use different image url for retry, see Util.OpenLayers.Util.onImageLoadError\n
\n
// // needed for changing to a different server for onload error\n
// if (this.layer.url instanceof Array) {\n
// this.imgDiv.urls = this.layer.url.slice();\n
// }\n
this.url = this.layer.getURL(this.bounds);\n
\n
// position the frame immediately\n
this.positionImage(); \n
}\n
\n
return true;\n
},\n
\n
/**\n
* Method: initCanvas\n
* Creates the canvas element and appends it to the tile\'s frame.\n
*/\n
initCanvas: function() {\n
var offset = this.layer.imageOffset;\n
var size = this.layer.getImageSize(this.bounds);\n
\n
// set the opacity on the tile\'s frame\n
if(this.layer.opacity != null) {\n
OpenLayers.Util.modifyDOMElement(this.frame, null, null, null,\n
null, null, null, \n
this.layer.opacity);\n
}\n
\n
this.canvas = document.createElement("canvas");\n
this.canvasContext = this.canvas.getContext(\'2d\'); \n
this.canvas.width = this.size.w;\n
this.canvas.height = this.size.h;\n
this.frame.appendChild(this.canvas);\n
\n
var id = OpenLayers.Util.createUniqueID("OpenLayersCanvas");\n
OpenLayers.Util.modifyDOMElement(this.canvas, id, offset, size, "relative", null, null, true);\n
\n
this.layer.div.appendChild(this.frame); \n
},\n
\n
/**\n
* Method: positionImage\n
* Sets the position and size of the tile\'s frame and\n
* canvas element.\n
*/\n
positionImage: function() {\n
// if the this layer doesn\'t exist at the point the image is\n
// returned, do not attempt to use it for size computation\n
if(this.layer == null) {\n
return;\n
} \n
\n
// position the frame \n
OpenLayers.Util.modifyDOMElement(this.frame, \n
null, this.position, this.size); \n
\n
// and then update the canvas size // todo: yes? \n
var size = this.layer.getImageSize(this.bounds); // difference between this.size and size? \n
OpenLayers.Util.modifyDOMElement(this.canvas, null, null, size); \n
\n
this.createImage();\n
},\n
\n
/**\n
* Method: createImage\n
* Creates the image and starts loading it.\n
*/\n
createImage: function() {\n
// first cancel loading the last image\n
if (this.lastImage !== null && !this.lastImage.complete) {\n
// note that this doesn\'t cancel loading for WebKit, see https://bugs.webkit.org/show_bug.cgi?id=35377\n
this.lastImage.src = \'\';\n
}\n
\n
var image = new Image(); \n
this.lastImage = image;\n
this.lastBounds = this.bounds.clone();\n
var context = { \n
image: image,\n
tile: this,\n
viewRequestID: this.layer.map.viewRequestID,\n
data: null,\n
bounds: this.bounds.clone() // todo: do we still need the bounds? guess no\n
//urls: this.layer.url.slice() // todo: for retries?\n
}; \n
\n
var onLoadFunctionProxy = function() {\n
this.tile.onLoadFunction(this); \n
};\n
\n
var onErrorFunctionProxy = function() {\n
this.tile.onErrorFunction(this);\n
};\n
\n
var can = document.createElement("canvas");\n
\n
var process = false;\n
var that = this;\n
\n
//onLoadFunctionProxy;\n
image.onerror = OpenLayers.Function.bind(onErrorFunctionProxy, context);\n
image.crossOrigin = ""; \n
image.src = this.url;\n
this.getId();\n
image.onload = OpenLayers.Function.bind(onLoadFunctionProxy,context);\n
},\n
\n
/**\n
Method: getId\n
* Used to catch the tile-group and tileid from JSON file\n
*/\n
\n
getId: function(){\n
aux = this.url.split(\'/\');\n
jpg = aux[7].split(\'.\');\n
this.partialTile = aux[6];\n
this.partialId = jpg[0];\n
},\n
\n
/**\n
* Method: onLoadFunction\n
* Called when an image successfully finished loading. Draws the\n
* image on the canvas.\n
* \n
* Parameters:\n
* context - {<Object>} The context from the onload event.\n
*/\n
onLoadFunction: function(context) {\n
if ((this.layer === null) ||\n
(context.viewRequestID !== this.layer.map.viewRequestID) ||\n
(context.image !== this.lastImage)) {\n
return;\n
} \n
var image = context.image;\n
var data = context.data;\n
\n
if (this.layer.projection.getCode() != this.layer.map.getProjection()) {\n
// reproject image\n
var sourceCRS = this.layer.projection;\n
var targetCRS = this.layer.map.projection;\n
var sourceBounds = this.layer.getReprojectedBounds(this.bounds);\n
var targetBounds = this.bounds;\n
var sourceSize = new OpenLayers.Size(image.width, image.height);\n
var targetSize = this.layer.getImageSize(this.bounds);\n
image = this.reproject(image, sourceCRS, sourceBounds, sourceSize, \n
targetCRS, targetBounds, targetSize); \n
} else {\n
this.displayImage(image);\n
}\n
},\n
\n
/**\n
* Method: displayImage\n
* Takes care of resizing the canvas and then draws the \n
* canvas.\n
* \n
* Parameters:\n
* image - {Image/Canvas} The image to display\n
*/\n
displayImage: function(image) {\n
if (this.layer.canvasFilter && !image.filtered) {\n
// if a filter is set, apply the filter first and\n
// then use the result\n
this.filter(image);\n
return;\n
} \n
\n
// reset canvas (for transparent tiles)\n
var size = this.layer.getImageSize(this.bounds);\n
this.canvas.width = size.w;\n
this.canvas.height = size.h;\n
\n
// when using a backbuffer, force the original tile on top\n
var bringToTop = (this.backBufferTile !== null);\n
\n
// draw the image on the canvas\n
this.drawImage(image, null, bringToTop);\n
this.canvasImageData = null;\n
\n
if (this.backBufferTile) {\n
this.setBackBuffer(image);\n
} \n
this.isLoading = false; \n
this.events.triggerEvent("loadend"); \n
},\n
\n
/**\n
* Method: drawImage\n
* Draws the image on the canvas and scales the image\n
* if required.\n
* \n
* Parameters:\n
* image - {<Image>} The image to draw\n
* size - {<OpenLayers.Size>} The target size of the image\n
* brintToTop - {<Boolean>} Should the tile\'s frame be forced to be on top?\n
*/\n
drawImage: function(image, size, bringToTop) {\n
\n
/* canvas_clean created to avoid canvas "dirty" issue */\n
try{\n
var canvas_clean = document.createElement(\'canvas\'); \n
}catch(ex){\n
console.log("Canvas NOT SUPPORTED");\n
}\n
canvas_clean.width = image.width;\n
canvas_clean.height = image.height;\n
this.canvas.width = image.width;\n
this.canvas.height = image.height;\n
ctx = canvas_clean.getContext("2d"); \n
ctx.drawImage(image,0,0,image.width,image.height);\n
try{ \n
data= ctx.getImageData(0,0,image.width,image.height);\n
}catch(ex){\n
console.log(ex);\n
} \n
/* variable repeat is used to assure that differents algorithms could be \n
applied in the same tile. In the future should be modified.*/\n
var repeat = 0;\n
this.findParams(repeat);\n
x = this.applyAlgorithm(data,image.width,image.height);\n
while(this.partialNum > 0){\n
repeat = 1;\n
this.partialNum = this.partialNum-1;\n
this.findParams(repeat);\n
x = this.applyAlgorithm(x,image.width,image.height);\n
repeat--;\n
}\n
\n
try {\n
if (size !== null) {\n
this.canvasContext.putImageData(x,image.width,image.height);\n
}else {\n
this.canvasContext.putImageData(x, 0, 0);\n
}\n
if (bringToTop) {\n
this.layer.div.removeChild(this.frame);\n
this.layer.div.appendChild(this.frame);\n
}\n
this.display();\n
} \n
catch (exc) {\n
console.log(\'drawImage failed: \' + ((image) ? image.src : image)); // todo\n
this.clear();\n
} \n
},\n
\n
/**\n
* Method: findParams\n
Get the parameters from JSON \n
transform file. \n
*/\n
findParams: function(repeat){\n
var length = this.transforms.length;\n
var again = repeat;\n
\n
for(i=0; i<length;i++){\n
if(again == 0){\n
if((this.transforms[i]["tileid"] === this.partialId) && \n
(this.transforms[i]["tilegroup"] === this.partialTile)){\n
this.partialAlgorithm =this.transforms[i]["algorithm"];\n
this.partialParam1 = this.transforms[i]["param1"];\n
this.partialParam2 = this.transforms[i]["param2"];\n
this.partialNum = this.transforms[i]["num"];\n
break;\n
}\n
}else{\n
if((this.transforms[i]["tileid"] === this.partialId) && \n
(this.transforms[i]["tilegroup"] === this.partialTile)){\n
if(this.transforms[i]["num"] === this.partialNum){\n
this.partialAlgorithm =this.transforms[i]["algorithm"];\n
this.partialParam1 = this.transforms[i]["param1"];\n
this.partialParam2 = this.transforms[i]["param2"];\n
break;\n
} \n
}\n
}\n
}\n
}, \n
\n
/**\n
*Method: applyAlgorithm\n
Called to process the data\n
*/\n
applyAlgorithm: function(data,width,height){\n
switch(this.partialAlgorithm){\n
case \'sepia\':\n
return sepia(data,width,height);\n
case \'brightness\':\n
return brightness(data,width,height,this.partialParam1,this.partialParam2);\n
case \'noise\':\n
return noise(data,width,height);\n
case \'posterize\':\n
return posterize(data,width,height,this.partialParam1);\n
case \'edge\':\n
return edges(data,width,height);\n
case \'lighten\':\n
return lighten(data,width,height,this.partialParam1);\n
default:\n
return data;\n
} \n
},\n
\n
/**\n
* Method: onErrorFunction\n
* Called when an image finished loading, but not successfully. \n
* \n
* Parameters:\n
* context - {<Object>} The context from the onload event.\n
*/ \n
onErrorFunction: function(context) {\n
if (context.image !== this.lastImage) {\n
/* Do not trigger \'loadend\' when a new image was request\n
* for this tile, because then \'reload\' was triggered instead\n
* of \'loadstart\'.\n
* If we would trigger \'loadend\' now, Grid would get confused about\n
* its \'numLoadingTiles\'.\n
*/\n
return;\n
}\n
\t\n
// retry? with different url? \n
console.log(this.id + \' onErrorFunction: \' + context.image.src); // todo\n
this.events.triggerEvent("loadend");\n
},\n
\n
/** \n
* Method: clear\n
* Clear the tile of any bounds/position-related data so that it can \n
* be reused in a new location. Called in <OpenLayers.Tile.draw()>.\n
*/\n
clear: function() {\n
// to be implemented by subclasses\n
if (this.frame !== null) {\n
this.frame.style.display = \'none\';\n
}\n
},\n
\n
/** \n
* Method: display\n
* Display the tile.\n
*/\n
display: function() {\n
// to be implemented by subclasses\n
if (this.frame !== null) {\n
this.frame.style.display = \'\';\n
}\n
},\n
\n
/** \n
* Method: show\n
* Show the tile. Called in <OpenLayers.Tile.showTile()>.\n
*/\n
show: function() {},\n
\n
/** \n
* Method: hide\n
* Hide the tile. To be implemented by subclasses (but never called).\n
*/\n
hide: function() { },\n
\n
/**\n
* Method: startTransition\n
* Creates a backbuffer tile (if it does not exist already)\n
* and then displays this tile. \n
* \n
* Parameters:\n
* drawTile - {<Boolean>} Should the tile be drawn?\n
*/\n
startTransition: function(drawTile) {\n
if (drawTile) {\n
//we use a clone of this tile to create a double buffer for visual\n
//continuity. The backBufferTile is used to create transition\n
//effects while the tile in the grid is repositioned and redrawn\n
if (!this.backBufferTile) {\n
this.createBackBufferTile();\n
}\n
// run any transition effects\n
this.showBackBufferTile();\n
} else {\n
// if we aren\'t going to draw the tile, then the backBuffer should\n
// be hidden too!\n
if (this.backBufferTile) {\n
this.backBufferTile.clear();\n
}\n
} \n
},\n
\n
/**\n
* Method: createBackBufferTile\n
* Create a backbuffer tile from the current tile.\n
*/\n
createBackBufferTile: function() {\n
this.backBufferTile = this.clone();\n
\n
this.backBufferTile.clear();\n
this.backBufferTile.isBackBuffer = true;\n
this.backBufferTile.initCanvas();\n
\n
// clear transition back buffer tile only after all tiles in\n
// this layer have loaded to avoid visual glitches\n
this.layer.events.register("loadend", this, this.hideBackBuffer); \n
},\n
\n
/**\n
* Method: setBackBuffer\n
* Stores the loaded image in the backbuffer tile,\n
* so that it can be used for the next request.\n
* \n
* Parameters:\n
* image - {<Image>} The image to use as backbuffer\n
*/\n
setBackBuffer: function(image) {\n
if (this.backBufferTile) {\n
// store the image, its position, resolution and bounds\n
this.backBufferTile.lastImage = image;\n
this.backBufferTile.position = this.position;\n
this.backBufferTile.bounds = this.bounds;\n
this.backBufferTile.size = this.size;\n
this.backBufferTile.imageSize = this.layer.getImageSize(this.bounds) || this.size;\n
this.backBufferTile.imageOffset = this.layer.imageOffset;\n
this.backBufferTile.resolution = this.layer.getResolution();\n
} \n
},\n
\n
/**\n
* Method: hideBackBuffer\n
*/\n
hideBackBuffer: function() {\n
if (this.backBufferTile) {\n
this.backBufferTile.clear();\n
} \n
},\n
\n
/**\n
* Method: showBackBufferTile\n
* Displays the backbuffer tile. Renders the image of \n
* the last request on the backbuffer canvas, scales the \n
* image to the currrent zoom-level and displays at the canvas \n
* at its new position.\n
*/\n
showBackBufferTile: function() {\n
// backBufferTile has to be valid and ready to use\n
if (!this.backBufferTile || !this.backBufferTile.lastImage || \n
(this.backBufferTile.lastImage.src === \'\')) {\n
return;\n
}\n
\n
if (!this.backBufferTile.canvas) {\n
this.backBufferTile.initCanvas();\n
}\n
\n
// calculate the ratio of change between the current resolution of the\n
// backBufferTile and the layer. If several animations happen in a\n
// row, then the backBufferTile will scale itself appropriately for\n
// each request.\n
var ratio = 1;\n
if (this.backBufferTile.resolution) {\n
ratio = this.backBufferTile.resolution / this.layer.getResolution();\n
}\n
\n
// if the resolution is not the same as it was last time (i.e. we are\n
// zooming), then we need to adjust the backBuffer tile\n
if (this.backBufferTile.resolution &&\n
(this.backBufferTile.resolution !== this.layer.getResolution())) {\n
if (this.layer.transitionEffect == \'resize\') {\n
var mapExtent = this.layer.map.getExtent()\n
var withinMapExtent = (mapExtent && this.backBufferTile.bounds.intersectsBounds(mapExtent, false));\n
\n
if (withinMapExtent) {\n
// In this case, we can just immediately resize the \n
// backBufferTile.\n
var size = new OpenLayers.Size(this.backBufferTile.size.w * ratio, this.backBufferTile.size.h * ratio);\n
\n
this.backBufferTile.setFramePosition(size);\n
\n
var imageSize = this.backBufferTile.imageSize;\n
imageSize = new OpenLayers.Size(imageSize.w * ratio, imageSize.h * ratio);\n
var imageOffset = this.backBufferTile.imageOffset;\n
if (imageOffset) {\n
imageOffset = new OpenLayers.Pixel(imageOffset.x * ratio, imageOffset.y * ratio);\n
}\n
\n
if (!this.isTooBigCanvas(imageSize)) {\n
// set canvas size\n
this.backBufferTile.setCanvasSize(imageSize, imageOffset);\n
\n
var ctx = this.backBufferTile.canvasContext;\n
if (ctx.mozImageSmoothingEnabled) {\n
/* For Firefox images will be smoothed when they are drawn scaled. Smoothing \n
* creates a semi-transparent border, which looks like a white line. Since\n
* Firefox 3.6 smoothing can be turned off.\n
*/\n
ctx.mozImageSmoothingEnabled = false;\n
}\n
this.backBufferTile.drawImage(this.backBufferTile.lastImage, imageSize, true);\n
}\n
}\n
}\n
} else {\n
// otherwise, if the resolution has not changed (when panning), display\n
// the backbuffer tile at the new position\n
if (this.layer.singleTile) {\n
this.backBufferTile.setFramePosition(this.size);\n
this.backBufferTile.setCanvasSize(this.size, null);\n
this.backBufferTile.drawImage(this.backBufferTile.lastImage, this.size, true);\n
} else {\n
this.backBufferTile.clear();\n
}\n
} \n
},\n
\n
/**\n
* Method: setFramePosition\n
* Sets the frame\'s position and size.\n
* \n
* Parameters:\n
* size - {<OpenLayers.Size>} The target size of the frame\n
*/\n
setFramePosition: function(size) {\n
var upperLeft = new OpenLayers.LonLat(this.bounds.left, this.bounds.top);\n
var px = this.layer.map.getLayerPxFromLonLat(upperLeft);\n
OpenLayers.Util.modifyDOMElement(this.frame, null, px, size);\n
},\n
\n
/**\n
* Method: setCanvasSize\n
* Sets the canvas\' size.\n
* \n
* Parameters:\n
* size - {<OpenLayers.Size>} The target size of the canvas element\n
* imageOffset - {<OpenLayers.Pixel>} Offset\n
*/\n
setCanvasSize: function(size, imageOffset) {\n
OpenLayers.Util.modifyDOMElement(this.canvas, null, imageOffset, size);\n
this.canvas.width = size.w;\n
this.canvas.height = size.h;\n
},\n
\n
/** \n
* Method: isTooBigCanvas\n
* Used to avoid that the backbuffer canvas gets too big when zooming in very fast.\n
* Otherwise drawing the canvas would take too long and lots of memory would be\n
* required. \n
*/\n
isTooBigCanvas: function(size) {\n
return size.w > 5000; \n
},\n
\n
/**\n
* Method: getPixelData\n
* Returns the ARGB values of the pixel at the given position. The\n
* returned object has the attributes \'a\', \'r\', \'g\' and \'b\'.\n
* \n
* Parameters:\n
* x - {int} x coordinate on the canvas \n
* y - {int} y coordinate on the canvas\n
* \n
* Returns:\n
* {Object}\n
*/\n
getPixelData: function(x, y) {\n
if (this.cancas === null || \n
x >= this.canvas.width || y >= this.canvas.height) {\n
return null;\n
}\n
if (this.canvasContext !== null) {\n
if (this.canvasImageData === null) {\n
this.canvasImageData = this.canvasContext.getImageData(0, 0, \n
this.canvas.width, this.canvas.height);\n
}\n
return OpenLayers.Tile.CanvasImage.getPixelDataFromImageData(this.canvasImageData, x, y);\n
}\n
return null;\n
},\n
\n
/**\n
* Method: filter\n
* Applies a canvas filter to the image. If \'layer.canvasAsync\'\n
* is set, the filter is applied in a web worker.\n
* \n
* Parameters:\n
* image - {Image}\n
*/ \n
filter: function(image) {\n
if (!this.layer.canvasAsync || !this.layer.canvasFilter.supportsAsync()) {\n
// don\'t use a web worker, apply the filter in the main script\n
var filteredImage = this.layer.canvasFilter.process(image);\n
// mark the image as filtered\n
filteredImage.filtered = true;\n
this.displayImage(filteredImage);\n
} else {\n
// apply the filter in a web worker\n
// called when the filter was applied\n
var handlerDone = function(resultCanvas) {\n
if (this.tile.lastImage === this.image) {\n
resultCanvas.filtered = true;\n
this.tile.displayImage(resultCanvas); \n
}\n
}; \n
// called when the web worker reports its progress\n
var handlerProgress = function(progress) {\n
if (this.tile.lastImage !== this.image) {\n
// only report progress, if the tile is not used\n
// for requesting a new image\n
return;\n
}\n
var event = {\n
progress: progress,\n
tile: this.tile\n
};\n
this.tile.events.triggerEvent("filterProgress", event);\n
};\n
\n
// called in case of an error\n
var handlerError = function(error) {\n
this.error = error;\n
this.tile.onErrorFunction(this);\n
};\n
\n
var context = {\n
tile: this,\n
// use lastImage instead of image,\n
// because image may have been reprojected\n
image: this.lastImage \n
};\n
\n
// start the web worker\n
this.layer.canvasFilter.processAsync(\n
image,\n
OpenLayers.Function.bind(handlerDone, context),\n
OpenLayers.Function.bind(handlerProgress, context),\n
OpenLayers.Function.bind(handlerError, context)\n
);\n
} \n
},\n
\n
/**\n
* Method: reproject\n
* Calls gdalwarp-js to reproject the image.\n
* \n
* Parameters:\n
* image - {Image}\n
* sourceCRS - {<OpenLayers.Projection>}\n
* sourceBounds - {<OpenLayers.Bounds>} \n
* sourceSize - {<OpenLayers.Size>} \n
* targetCRS - {<OpenLayers.Projection>} \n
* targetBounds - {<OpenLayers.Bounds>} \n
* targetSize - {<OpenLayers.Size>} \n
* \n
* Returns:\n
* {Canvas}\n
*/\n
reproject: function(image, sourceCRS, sourceBounds, sourceSize, \n
targetCRS, targetBounds, targetSize) {\n
\n
var warper = new GDALWarp(image, sourceCRS.proj, sourceBounds, sourceSize, \n
targetCRS.proj, targetBounds, targetSize);\n
\n
if (!this.layer.canvasAsync) {\n
this.displayImage(warper.reproject());\n
} else {\n
var handlerDone = function(resultCanvas) {\n
if (this.tile.lastImage === this.image) {\n
this.tile.displayImage(resultCanvas); \n
}\n
}; \n
\n
var handlerProgress = function(progress) {\n
if (this.tile.lastImage !== this.image) {\n
// only report progress, if the tile has not\n
// requested a new image\n
return;\n
}\n
\n
var event = {\n
progress: progress,\n
tile: this.tile\n
};\n
this.tile.events.triggerEvent("reprojectionProgress", event);\n
};\n
\n
var handlerError = function(error) {\n
this.error = error;\n
this.tile.onErrorFunction(this);\n
};\n
\n
var context = {\n
tile: this,\n
image: image \n
};\n
\n
if (this.layer.proj4JSPath === null || \n
this.layer.gdalwarpWebWorkerPath === null) {\n
OpenLayers.Console.warn("Trying to reproject layer \'" + this.layer.name + "\' but" + \n
"either the path to Proj4JS or to the gdalwarp-js web worker script is not set!"); \n
return; \n
}\n
\n
warper.reprojectAsync(\n
this.layer.proj4JSPath,\n
OpenLayers.Function.bind(handlerDone, context),\n
OpenLayers.Function.bind(handlerProgress, context),\n
OpenLayers.Function.bind(handlerError, context),\n
this.layer.proj4JSDefinitions,\n
this.layer.gdalwarpWebWorkerPath);\n
} \n
},\n
\n
CLASS_NAME: "OpenLayers.Tile.CanvasImage"\n
}\n
);\n
\n
/**\n
* Method: getPixelDataFromImageData\n
* Returns the ARGB values of the pixel at the given position. The\n
* returned object has the attributes \'a\', \'r\', \'g\' and \'b\'.\n
* \n
* Parameters:\n
* imageData - {ImageData} the ImageData object\n
* x - {int} x coordinate on the canvas \n
* y - {int} y coordinate on the canvas\n
* \n
* Returns:\n
* {Object}\n
*/\n
OpenLayers.Tile.CanvasImage.getPixelDataFromImageData = function(imageData, x, y) {\n
return {\n
r: OpenLayers.Tile.CanvasImage.getPixelValue(imageData, x, y, 0),\n
g: OpenLayers.Tile.CanvasImage.getPixelValue(imageData, x, y, 1),\n
b: OpenLayers.Tile.CanvasImage.getPixelValue(imageData, x, y, 2),\n
a: OpenLayers.Tile.CanvasImage.getPixelValue(imageData, x, y, 3)\n
}; \n
};\n
\n
/**\n
* Method: getPixelValue\n
* Returns the red, green, blue or alpha value\n
* for the pixel at the given position.\n
* \n
* Parameters:\n
* imageData - {ImageData} the ImageData object\n
* x - {int} x coordinate on the canvas \n
* y - {int} y coordinate on the canvas\n
* argb - 0-3 (0: Red, 1: Green, 2: Blue, 3: Alpha)\n
* \n
* Returns:\n
* {int} 0-255\n
*/\n
OpenLayers.Tile.CanvasImage.getPixelValue = function(imageData, x, y, argb) {\n
return imageData.data[((y*(imageData.width*4)) + (x*4)) + argb]; \n
};\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>35775</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>CanvasImage.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54116980.28</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ERP5_OpenLayers.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
function overwrite(C, o) {\n
if(typeof o.initialize === "function" &&\n
C === C.prototype.initialize) {\n
// OL 2.11\n
\n
var proto = C.prototype;\n
var staticProps = OpenLayers.Util.extend({}, C);\n
\n
C = o.initialize;\n
\n
C.prototype = proto;\n
OpenLayers.Util.extend(C, staticProps);\n
}\n
OpenLayers.Util.extend(C.prototype, o);\n
return C;\n
}\n
\n
\n
OpenLayers.Layer.Grid = overwrite(OpenLayers.Layer.Grid, {\n
\n
tileClass: OpenLayers.Tile.CanvasImage,\n
\n
useCanvas: null,\n
\n
canvas: null,\n
\n
canvasImageData: null,\n
\n
backBufferCanvas: null,\n
\n
lastResolution: null,\n
\n
lastCanvasPosition: null,\n
\n
redrawCanvas: false,\n
\n
/**\n
* APIProperty: canvasFilter\n
* {OpenLayers.Tile.CanvasFilter} Only used for ONECANVASPERLAYER and ONECANVASPERTILE. Can be\n
* used to manipulate the pixel data of an image (for example to adjust the\n
* brightness of a tile).\n
*/\n
canvasFilter: null,\n
\n
/**\n
* APIProperty: canvasAsync\n
* {Boolean} If set to true, the canvas filter and the reprojection (for WMS layers)\n
* will be executed in a web worker. Only supported in Chrome 6+.\n
*/\n
canvasAsync: false,\n
\n
initialize: function(name, url, params, options) {\n
OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, \n
arguments);\n
this.grid = [];\n
this.tileQueue = [];\n
if(!this.useCanvas){\n
if (this.removeBackBufferDelay === null) {\n
this.removeBackBufferDelay = this.singleTile ? 0 : 2500;\n
}\n
\n
if (this.className === null) {\n
this.className = this.singleTile ? \'olLayerGridSingleTile\' :\n
\'olLayerGrid\';\n
}\n
\n
if (!OpenLayers.Animation.isNative) {\n
this.deferMoveGriddedTiles = OpenLayers.Function.bind(function() {\n
this.moveGriddedTiles(true);\n
this.moveTimerId = null;\n
}, this);\n
}\n
}else{\n
if (this.usesOneCanvasPerLayer()) {\n
this.canvas = document.createElement("canvas");\n
this.canvas.id = "Canvas_" + this.id;\n
this.canvas.style.top = 0;\n
this.canvas.style.left = 0;\n
this.canvas.style.position = "absolute";\n
this.div.appendChild(this.canvas);\n
}\n
}\n
},\n
\n
moveTo:function(bounds, zoomChanged, dragging) {\n
\n
OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);\n
\n
bounds = bounds || this.map.getExtent();\n
\n
if(this.useCanvas){\n
var forceReTile = !this.grid.length || zoomChanged ||\n
(this.usesOneCanvasPerLayer() && !dragging);\n
\n
// total bounds of the tiles\n
var tilesBounds = this.getTilesBounds();\n
}\n
\n
if (bounds != null) {\n
\n
// if grid is empty or zoom has changed, we *must* re-tile\n
if(!this.usesCanvas){ \n
var forceReTile = !this.grid.length || zoomChanged;\n
}else{\n
var forceReTile = !this.grid.length || zoomChanged ||\n
(this.usesOneCanvasPerLayer() && !dragging);\n
}\n
// total bounds of the tiles\n
var tilesBounds = this.getTilesBounds();\n
\n
\n
// total bounds of the tiles\n
var tilesBounds = this.getTilesBounds(); \n
\n
// the new map resolution\n
var resolution = this.map.getResolution();\n
\n
// the server-supported resolution for the new map resolution\n
var serverResolution = this.getServerResolution(resolution);\n
\n
if (this.singleTile) {\n
\n
// We want to redraw whenever even the slightest part of the \n
// current bounds is not contained by our tile.\n
// (thus, we do not specify partial -- its default is false)\n
\n
if ( forceReTile ||\n
(!dragging && !tilesBounds.containsBounds(bounds))) {\n
\n
// In single tile mode with no transition effect, we insert\n
// a non-scaled backbuffer when the layer is moved. But if\n
// a zoom occurs right after a move, i.e. before the new\n
// image is received, we need to remove the backbuffer, or\n
// an ill-positioned image will be visible during the zoom\n
// transition.\n
\n
if(zoomChanged && this.transitionEffect !== \'resize\') {\n
this.removeBackBuffer();\n
}\n
\n
if(!zoomChanged || this.transitionEffect === \'resize\') {\n
this.applyBackBuffer(serverResolution);\n
}\n
\n
this.initSingleTile(bounds);\n
}\n
} else {\n
\n
// if the bounds have changed such that they are not even \n
// *partially* contained by our tiles (e.g. when user has \n
// programmatically panned to the other side of the earth on\n
// zoom level 18), then moveGriddedTiles could potentially have\n
// to run through thousands of cycles, so we want to reTile\n
// instead (thus, partial true). \n
forceReTile = forceReTile ||\n
!tilesBounds.intersectsBounds(bounds, {\n
worldBounds: this.map.baseLayer.wrapDateLine &&\n
this.map.getMaxExtent()\n
});\n
\n
if(resolution !== serverResolution) {\n
bounds = this.map.calculateBounds(null, serverResolution);\n
if(forceReTile) {\n
// stretch the layer div\n
var scale = serverResolution / resolution;\n
this.transformDiv(scale);\n
}\n
} else {\n
// reset the layer width, height, left, top, to deal with\n
// the case where the layer was previously transformed\n
this.div.style.width = \'100%\';\n
this.div.style.height = \'100%\';\n
this.div.style.left = \'0%\';\n
this.div.style.top = \'0%\';\n
}\n
\n
if(forceReTile) {\n
if(zoomChanged && this.transitionEffect === \'resize\') {\n
this.applyBackBuffer(serverResolution);\n
}\n
this.initGriddedTiles(bounds);\n
} else {\n
this.moveGriddedTiles();\n
}\n
}\n
}\n
},\n
\n
\n
/**** Specific functions for Canvas ****/\n
\n
/**\n
* Method: drawCanvasTile\n
* Called when a image finished loading, draws the image\n
* on the canvas element.\n
* \n
* Parameters:\n
* image - {<Image>} The tile to draw\n
* bounds - {<OpenLayers.Bounds>} The bounds of the tile.\n
*/\n
drawCanvasTile: function(image, bounds) {\n
if (this.dragging) {\n
return;\n
}\n
\n
// if this is the first tile of a render request, move canvas back to \n
// original position and reset background\n
this.resetCanvas();\n
\n
var upperLeft = new OpenLayers.LonLat(bounds.left, bounds.top);\n
var px = this.getLayerPxFromLonLat(upperLeft);\n
\n
var ctx = this.canvas.getContext(\'2d\');\n
try {\n
ctx.drawImage(image, px.x, px.y);\n
this.canvasImageData = null;\n
} catch (exc) {\n
console.log(\'drawImage failed: \' + image.src); // todo\n
}\n
},\n
\n
/**\n
* Method: resetCanvas\n
* Moves the canvas element back to its original position and \n
* resets the drawing surface.\n
*/\n
resetCanvas: function() {\n
if (this.redrawCanvas) {\n
this.redrawCanvas = false;\n
\n
// because the layerContainerDiv has shifted position (for non canvas layers), reposition the canvas.\n
this.canvas.style.left = -parseInt(this.map.layerContainerDiv.style.left) + "px";\n
this.canvas.style.top = -parseInt(this.map.layerContainerDiv.style.top) + "px";\n
\n
// clear canvas by reseting the size\n
// broken in Chrome 6.0.458.1:\n
// http://code.google.com/p/chromium/issues/detail?id=49151\n
this.canvas.width = this.map.viewPortDiv.clientWidth;\n
this.canvas.height = this.map.viewPortDiv.clientHeight;\n
\n
if (this.usesTransition() && this.usesOneCanvasPerLayer()) {\n
// store the current resolution and canvas position for transition\n
this.lastResolution = this.map.getResolution();\n
var canvasPosition = new OpenLayers.Pixel(this.canvas.style.left, this.canvas.style.top);\n
this.lastCanvasPosition = this.map.getLonLatFromLayerPx(canvasPosition);\n
}\n
}\n
},\n
\n
/**\n
* Method: startTransition\n
* Start the transition: create a copy of the \n
* canvas element, scale the copy and then draw the copy \n
* back on the original canvas.\n
* \n
* Parameters:\n
* zoomChanged - {<Boolean>}\n
* dragging - {<Boolean>}\n
*/\n
startTransition: function(zoomChanged, dragging) {\n
if (!zoomChanged || dragging ||\n
(this.lastResolution === null) || (this.lastCanvasPosition === null)) {\n
return;\n
}\n
\n
var ratio = this.lastResolution / this.map.getResolution();\n
var px = this.getLayerPxFromLonLat(this.lastCanvasPosition);\n
\n
// create a scaled copy of the canvas\n
if (this.backBufferCanvas == null) {\n
this.backBufferCanvas = document.createElement(\'canvas\');\n
this.backBufferCanvas.style.display = \'none\';\n
}\n
\n
this.backBufferCanvas.width = this.canvas.width * ratio;\n
this.backBufferCanvas.height = this.canvas.height * ratio;\n
\n
var zoomcontext = this.backBufferCanvas.getContext(\'2d\');\n
zoomcontext.scale(ratio, ratio);\n
zoomcontext.drawImage(this.canvas, 0, 0);\n
\n
// and then draw this copy on the original canvas \n
this.resetCanvas();\n
\n
var ctx = this.canvas.getContext(\'2d\');\n
ctx.drawImage(this.backBufferCanvas, px.x, px.y);\n
},\n
\n
/**\n
* Method: getLayerPxFromLonLat\n
* A wrapper for the <OpenLayers.Map.getLayerPxFromLonLat()> method,\n
* which takes into account that the canvas element has a fixed size and \n
* it always moved back to the original position.\n
* \n
* Parameters:\n
* lonlat - {<OpenLayers.LonLat>}\n
*\n
* Returns:\n
* {<OpenLayers.Pixel>} \n
*/\n
getLayerPxFromLonLat: function(lonlat) {\n
if (this.usesOneCanvasPerLayer()) {\n
var viewPortPx = this.map.getPixelFromLonLat(lonlat);\n
return viewPortPx;\n
} else {\n
return this.map.getLayerPxFromLonLat(lonlat);\n
}\n
},\n
\n
/**\n
* Method: getLayerPxFromLonLat\n
* A wrapper for the <OpenLayers.Map.getViewPortPxFromLayerPx()> method.\n
* \n
* Parameters:\n
* layerPx - {<OpenLayers.Pixel>}\n
* \n
* Returns:\n
* {<OpenLayers.Pixel>}\n
*/\n
getViewPortPxFromLayerPx: function(layerPx) {\n
if (this.usesOneCanvasPerLayer()) {\n
return layerPx;\n
} else {\n
return this.map.getViewPortPxFromLayerPx(layerPx);\n
}\n
},\n
\n
/**\n
* Method: usesTransition\n
* \n
* Returns:\n
* {<Boolean>} True, if the layer uses a supported transition effect.\n
*/\n
usesTransition: function() {\n
return true;\n
//return (OpenLayers.Util.indexOf(this.SUPPORTED_TRANSITIONS, this.transitionEffect) != -1);\n
},\n
\n
/**\n
* Method: usesOneCanvasPerLayer\n
* \n
* Returns:\n
* {<Boolean>} True, if the layer renders its tile on a single canvas element.\n
*/\n
usesOneCanvasPerLayer: function() {\n
return (this.useCanvas === OpenLayers.Layer.Grid.ONECANVASPERLAYER);\n
},\n
\n
/**\n
* Method: getPixelDataForViewPortPx\n
* Returns the ARGB values of the pixel at the given view-port position. \n
* The returned object has the attributes \'a\', \'r\', \'g\' and \'b\'.\n
* \n
* Parameters:\n
* viewPortPx - {<OpenLayers.Pixel>}\n
* \n
* Returns:\n
* {Object}\n
*/\n
getPixelDataForViewPortPx: function(viewPortPx) {\n
if (!this.grid.length || this.grid.length === 0) {\n
return null;\n
}\n
if (this.usesOneCanvasPerLayer()) {\n
// for ONECANVASPERLAYER we can directly use the view-port pixels\n
var x = viewPortPx.x;\n
var y = viewPortPx.y;\n
\n
if (this.cancas === null ||\n
x < 0 || x >= this.canvas.width ||\n
y < 0 || y >= this.canvas.height) {\n
return null;\n
}\n
\n
if (this.canvasImageData === null) {\n
var canvasContext = this.canvas.getContext(\'2d\');\n
this.canvasImageData = canvasContext.getImageData(0, 0,\n
this.canvas.width, this.canvas.height);\n
}\n
\n
return OpenLayers.Tile.CanvasImage.getPixelDataFromImageData(this.canvasImageData, x, y);\n
/* for ONECANVASPERTILE we first have to find out the tile\n
* which contains the view-port pixel\n
*/\n
\n
// translate the viewPort coordinates to layer coordinates\n
var layerPx = this.map.getLayerPxFromViewPortPx(viewPortPx);\n
\n
// and then calculate the grid position relative to the layer container\n
var upperLeftTile = this.grid[0][0];\n
var gridPx = new OpenLayers.Pixel(layerPx.x - upperLeftTile.position.x, layerPx.y - upperLeftTile.position.y);\n
\n
// get the tile which covers the pixel\n
var tileX = Math.floor(gridPx.x / this.tileSize.w);\n
var tileY = Math.floor(gridPx.y / this.tileSize.h);\n
\n
if (tileX >= 0 && tileX < this.grid[0].length &&\n
tileY >= 0 &&\n
tileY < this.grid.length) {\n
\n
var tile = this.grid[tileY][tileX];\n
\n
// calculate the position of the pixel on the canvas\n
var canvasX = gridPx.x - (tileX * this.tileSize.w);\n
var canvasY = gridPx.y - (tileY * this.tileSize.h);\n
\n
return tile.getPixelData(canvasX, canvasY);\n
}\n
}\n
\n
return null;\n
},\n
\n
});\n
\n
/**\n
* Constant: NOCANVAS\n
* {Integer} Constant used to mark that a layer should not be rendered\n
* on a canvas element.\n
*/\n
OpenLayers.Layer.Grid.NOCANVAS = 1;\n
/**\n
* Constant: ONECANVASPERLAYER\n
* {Integer} Constant used to render the layer on a single canvas element.\n
*/\n
OpenLayers.Layer.Grid.ONECANVASPERLAYER = 2;\n
/**\n
* Constant: ONECANVASPERTILE\n
* {Integer} Constant used to render every tile in its own canvas element.\n
*/\n
OpenLayers.Layer.Grid.ONECANVASPERTILE = 4;\n
\n
OpenLayers.Layer.Zoomify = overwrite(OpenLayers.Layer.Zoomify,{\n
initialize: function(name, url,transforms, size, options) {\n
// initilize the Zoomify pyramid for given size\n
this.initializeZoomify(size);\n
this.transforms = transforms;\n
OpenLayers.Layer.Grid.prototype.initialize.apply(this, [\n
name, url, size, {}, options\n
]);\n
},\n
\n
getURL: function (bounds) {\n
bounds = this.adjustBounds(bounds);\n
var res = this.map.getResolution();\n
var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));\n
var y = Math.round((this.tileOrigin.lat - bounds.top) / (res * this.tileSize.h));\n
var z = this.map.getZoom();\n
var tileIndex = x + y * this.tierSizeInTiles[z].w + this.tileCountUpToTier[z];\n
var path = "TileGroup" + Math.floor( (tileIndex) / 256 ) +\n
"/" + z + "-" + x + "-" + y + "/Base_download";\n
var url = this.url;\n
if (OpenLayers.Util.isArray(url)) {\n
url = this.selectUrl(path, url);\n
}\n
return url + path;\n
},\n
\n
\n
addTile: function(bounds,position) {\n
return new OpenLayers.Tile.CanvasImage(this,position,bounds,null,this.tileSize,this.transforms,OpenLayers.Tile.CanvasImage.ONECANVASPERTILE);\n
}\n
\n
});\n
\n
OpenLayers.Tile = overwrite(OpenLayers.Tile,{\n
clone: function (obj) {\n
if (obj == null) {\n
obj = new OpenLayers.Tile(this.layer,\n
this.position,\n
this.bounds,\n
this.url,\n
this.size);\n
}\n
// catch any randomly tagged-on properties\n
OpenLayers.Util.applyDefaults(obj, this);\n
return obj;\n
}\n
});\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>16835</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>ERP5_OpenLayers.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117138.4</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>form.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\n
* NEXEDI\n
*/\n
(function($) {\n
\n
$.getJSON(\n
\'http://localhost:12001/erp5/portal_skins/erp5_safeimage/ERP5Site_getTileImageTransformMetadataList\', \n
function(data){\n
for (var i = 0; i < data["image_list"].length; i ++ ) {\n
\n
\t\tvar aux1= "<li><a href=#image/";\n
\t\tvar aux2= "><i class=icon-star></i>";\n
\t\tvar aux3= "</a></li>";\n
$(\'.nav-header\').append(aux1+data["image_list"][i]["id"]+aux2+data["image_list"][i]["title"]+aux3) \n
\t \n
};\n
});\n
\n
var routes = {\n
"/image/:id" : "displayData",\n
"image/:id" : "displayData",\n
}\n
\n
var router = function(e, d){\n
var $this = $(this);\n
$.each(routes, function(pattern, callback){\n
pattern = pattern.replace(/:\\w+/g, \'([^\\/]+)\');\n
var regex = new RegExp(\'^\' + pattern + \'$\');\n
var result = regex.exec(d);\n
if (result) {\n
result.shift();\n
methods[callback].apply($this, result);\n
}\n
});\n
}\n
\n
var methods = {\n
init: function() {\n
// Initialize in this context\n
var $this = $(this);\n
// Bind to urlChange event\n
return this.each(function(){\n
$.subscribe("urlChange", function(e, d){\n
router.call($this, e, d);\n
});\n
});\n
},\n
\n
displayData: function(id){\n
var zoomify_url, zoomify_width, zoomify_height = null;\n
zoomify_url = "http://localhost:12001/erp5/image_module/" + id + "/";\n
//XXX look at the xml definition inside image folder\n
var zoomify_data = $.getJSON(\n
\t\t\t\t"http://localhost:12001/erp5/image_module/" + id + "/TileImage_getMetadataAsJSON",\n
\t\t\t\tfunction(data){\n
\t\t\t\t\twidth=data["sizes"][0]["width"];\n
\t\t\t\t\theight=data["sizes"][0]["height"];\n
\t\t\t\t transforms(width,height);\t\t\t\t\t\t\t\n
\t\t\t\t }\n
\n
\t\t\t);\n
\n
\t$(this).form(\'render\', \'image\', {\'image_id\': id});\n
\n
\n
var transforms = function(width,height){\n
$.getJSON(\n
\'http://localhost:12001/erp5/image_module/\'+id+\'/TileImageTransformed_getTransform\',\n
function(data){\n
pass(width,height,data);\n
}\n
);\n
}\n
\n
\tvar pass = function(zoomify_width,zoomify_height,data){\n
\t\t\t\n
\t\t\t\t$(function() {\n
\t\n
\t\t\t SafeImage.loadOpenLayerZoomedImage(zoomify_width,zoomify_height, zoomify_url,data);\n
\t\t\t\t });\n
\t};\n
\n
},\n
\n
render: function(template, data){\n
\t $(this).html(ich[template](data, true));\n
}\n
\n
};\n
\n
$.fn.form = function(method){\n
if ( methods[method] ) {\n
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));\n
} else if ( typeof method === \'object\' || ! method ) {\n
return methods.init.apply( this, arguments );\n
} else {\n
$.error( \'Method \' + method + \' does not exist on jQuery.form\' );\n
}\n
};\n
})(jQuery);\n
\n
$("#main").form();\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2900</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>form.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54116913.81</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>pixastic.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
var sepia = function (dataI,width,height){\n
\n
var imagedata = dataI; \n
var data = imagedata.data;\n
var w = width;\n
var h = height;\n
var w4 = w*4;\n
var y = h;\n
var mode = 1;\n
\n
\n
/*for(i=0;i<10000000000;i++){\n
5555*55555554;\n
i++\n
};*/ \n
\n
do {\n
var offsetY = (y-1)*w4;\n
var x = w;\n
\n
do {\n
var offset = offsetY + (x-1)*4;\n
\n
if (mode) {\n
\n
// a bit faster, but not as good\n
\n
var d = data[offset] * 0.299 + data[offset+1] * 0.587 + data[offset+2] * 0.114;\n
var r = (d + 39);\n
var g = (d + 14);\n
var b = (d - 36);\n
} else {\n
// Microsoft\n
var or = data[offset];\n
var og = data[offset+1];\n
var ob = data[offset+2];\n
var r = (or * 0.393 + og * 0.769 + ob * 0.189);\n
var g = (or * 0.349 + og * 0.686 + ob * 0.168);\n
var b = (or * 0.272 + og * 0.534 + ob * 0.131);\n
}\n
\n
if (r < 0) r = 0; if (r > 255) r = 255;\n
if (g < 0) g = 0; if (g > 255) g = 255;\n
if (b < 0) b = 0; if (b > 255) b = 255;\n
\n
data[offset] = r;\n
data[offset+1] = g;\n
data[offset+2] = b;\n
\n
} while (--x);\n
} while (--y);\n
imagedata.data = data;\n
return imagedata;\n
};\n
\n
\n
var lighten = function(dataI,width,height,param) {\n
var imagedata = dataI;\n
var data = imagedata.data;\n
var w = width;\n
var h = height;\n
var amount = parseFloat(param) || 0;\n
var mode = 1;\n
\t\tamount = Math.max(-1, Math.min(1, amount));\n
\n
\t\tif (mode) {\n
\n
\t\t\tvar p = w * h;\n
\n
\t\t\tvar pix = p*4, pix1 = pix + 1, pix2 = pix + 2;\n
\t\t\tvar mul = amount + 1;\n
\n
\t\t\twhile (p--) {\n
\t\t\t\tif ((data[pix-=4] = data[pix] * mul) > 255)\n
\t\t\t\t\tdata[pix] = 255;\n
\n
\t\t\t\tif ((data[pix1-=4] = data[pix1] * mul) > 255)\n
\t\t\t\t\tdata[pix1] = 255;\n
\n
\t\t\t\tif ((data[pix2-=4] = data[pix2] * mul) > 255)\n
\t\t\t\t\tdata[pix2] = 255;\n
\n
\t\t\t}\n
\n
\n
\t\t} else {\n
\t\t\t/*var img = params.image;\n
\t\t\tif (amount < 0) {\n
\t\t\t\timg.style.filter += " light()";\n
\t\t\t\timg.filters[img.filters.length-1].addAmbient(\n
\t\t\t\t\t255,255,255,\n
\t\t\t\t\t100 * -amount\n
\t\t\t\t);\n
\t\t\t} else if (amount > 0) {\n
\t\t\t\timg.style.filter += " light()";\n
\t\t\t\timg.filters[img.filters.length-1].addAmbient(\n
\t\t\t\t\t255,255,255,\n
\t\t\t\t\t100\n
\t\t\t\t);\n
\t\t\t\timg.filters[img.filters.length-1].addAmbient(\n
\t\t\t\t\t255,255,255,\n
\t\t\t\t\t100 * amount\n
\t\t\t\t);*/\n
console.log("Internet Explorer is crap");\n
\t\t\t}\n
\t\t\n
\t\n
\t\timagedata.data = data; \n
return imagedata;\n
\t\n
};\n
\n
\n
var brightness = function(dataI,width,height,param1,param2) {\n
\n
var imagedata = dataI;\n
var data = imagedata.data;\n
var w = width;\n
var h = height;\n
var brightness = parseInt(param1,10) || 0;\n
\t\tvar contrast = parseFloat(param2)||0;\n
\t\t//var legacy = !!(params.options.legacy && params.options.legacy != "false");\n
var mode = 1;\n
\tbrightness = Math.min(150,Math.max(-150,brightness));\n
\t\t\n
\t\t//var brightMul = 1 + Math.min(150,Math.max(-150,brightness)) / 150;\n
\t contrast = Math.max(0,contrast+1);\n
\n
\t\tif (mode) {\n
\t\t\tvar p = w*h;\n
\t\t\tvar pix = p*4, pix1, pix2;\n
\n
\t\t\tvar mul, add;\n
\t\t\tif (contrast != 1) {\n
\t\t\t\t\tmul = contrast;\n
\t\t\t\t\tadd = (brightness - 128) * contrast + 128;\n
\t\t\t} else { // this if-then is not necessary anymore, is it?\n
\t\t\t\t\tmul = 1;\n
\t\t\t\t\tadd = brightness;\n
\t\t\t}\n
\t\t\tvar r, g, b;\n
\t\t\twhile (p--) {\n
\t\t\t\tif ((r = data[pix-=4] * mul + add) > 255 )\n
\t\t\t\t\tdata[pix] = 255;\n
\t\t\t\telse if (r < 0)\n
\t\t\t\t\tdata[pix] = 0;\n
\t\t\t\telse\n
\t\t\t\t\tdata[pix] = r;\n
\n
\t\t\t\tif ((g = data[pix1=pix+1] * mul + add) > 255 ) \n
\t\t\t\t\tdata[pix1] = 255;\n
\t\t\t\telse if (g < 0)\n
\t\t\t\t\tdata[pix1] = 0;\n
\t\t\t\telse\n
\t\t\t\t\tdata[pix1] = g;\n
\n
\t\t\t\tif ((b = data[pix2=pix+2] * mul + add) > 255 ) \n
\t\t\t\t\tdata[pix2] = 255;\n
\t\t\t\telse if (b < 0)\n
\t\t\t\t\tdata[pix2] = 0;\n
\t\t\t\telse\n
\t\t\t\t\tdata[pix2] = b;\n
\t\t\t}\n
\t\t}\n
\t\n
imagedata.data = data;\n
return imagedata;\n
\t\n
};\n
\n
\n
var posterize = function(dataI,width,height,param1) {\n
\n
var imagedata = dataI;\n
var data = imagedata.data;\n
var w = width;\n
var h = height;\n
\t\tvar numLevels = 256;\n
var mode = 1;\n
var aux = param1;\n
\n
\t\tif (typeof aux != "undefined")\n
\t\t\tnumLevels = parseInt(aux,10)||1;\n
\n
\t\tif (mode) {\n
\n
\t\t\tnumLevels = Math.max(2,Math.min(256,numLevels));\n
\t\n
\t\t\tvar numAreas = 256 / numLevels;\n
\t\t\tvar numValues = 256 / (numLevels-1);\n
\n
\t\t\tvar w4 = w*4;\n
\t\t\tvar y = h;\n
\t\t\tdo {\n
\t\t\t\tvar offsetY = (y-1)*w4;\n
\t\t\t\tvar x = w;\n
\t\t\t\tdo {\n
\t\t\t\t\tvar offset = offsetY + (x-1)*4;\n
\n
\t\t\t\t\tvar r = numValues * ((data[offset] / numAreas)>>0);\n
\t\t\t\t\tvar g = numValues * ((data[offset+1] / numAreas)>>0);\n
\t\t\t\t\tvar b = numValues * ((data[offset+2] / numAreas)>>0);\n
\n
\t\t\t\t\tif (r > 255) r = 255;\n
\t\t\t\t\tif (g > 255) g = 255;\n
\t\t\t\t\tif (b > 255) b = 255;\n
\n
\t\t\t\t\tdata[offset] = r;\n
\t\t\t\t\tdata[offset+1] = g;\n
\t\t\t\t\tdata[offset+2] = b;\n
\n
\t\t\t\t} while (--x);\n
\t\t\t} while (--y);\n
\t\t}\n
\t imagedata.data;\n
\treturn imagedata;\n
};\n
\n
\n
var noise = function(dataI,width,height) {\n
\n
var imagedata = dataI;\n
var data = imagedata.data;\n
var w = width;\n
var h = height;\n
var mode = 1;\n
\t\tvar w4 = w*4;\n
\t\tvar y = h;\n
\n
\n
\t\t\tdo {\n
\t\t\t\tvar offsetY = (y-1)*w4;\n
\n
\t\t\t\tvar nextY = (y == h) ? y - 1 : y;\n
\t\t\t\tvar prevY = (y == 1) ? 0 : y-2;\n
\n
\t\t\t\tvar offsetYPrev = prevY*w*4;\n
\t\t\t\tvar offsetYNext = nextY*w*4;\n
\n
\t\t\t\tvar x = w;\n
\t\t\t\tdo {\n
\t\t\t\t\tvar offset = offsetY + (x*4-4);\n
\n
\t\t\t\t\tvar offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4;\n
\t\t\t\t\tvar offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4;\n
\n
\t\t\t\t\tvar minR, maxR, minG, maxG, minB, maxB;\n
\n
\t\t\t\t\tminR = maxR = data[offsetPrev];\n
\t\t\t\t\tvar r1 = data[offset-4], r2 = data[offset+4], r3 = data[offsetNext];\n
\t\t\t\t\tif (r1 < minR) minR = r1;\n
\t\t\t\t\tif (r2 < minR) minR = r2;\n
\t\t\t\t\tif (r3 < minR) minR = r3;\n
\t\t\t\t\tif (r1 > maxR) maxR = r1;\n
\t\t\t\t\tif (r2 > maxR) maxR = r2;\n
\t\t\t\t\tif (r3 > maxR) maxR = r3;\n
\n
\t\t\t\t\tminG = maxG = data[offsetPrev+1];\n
\t\t\t\t\tvar g1 = data[offset-3], g2 = data[offset+5], g3 = data[offsetNext+1];\n
\t\t\t\t\tif (g1 < minG) minG = g1;\n
\t\t\t\t\tif (g2 < minG) minG = g2;\n
\t\t\t\t\tif (g3 < minG) minG = g3;\n
\t\t\t\t\tif (g1 > maxG) maxG = g1;\n
\t\t\t\t\tif (g2 > maxG) maxG = g2;\n
\t\t\t\t\tif (g3 > maxG) maxG = g3;\n
\n
\t\t\t\t\tminB = maxB = data[offsetPrev+2];\n
\t\t\t\t\tvar b1 = data[offset-2], b2 = data[offset+6], b3 = data[offsetNext+2];\n
\t\t\t\t\tif (b1 < minB) minB = b1;\n
\t\t\t\t\tif (b2 < minB) minB = b2;\n
\t\t\t\t\tif (b3 < minB) minB = b3;\n
\t\t\t\t\tif (b1 > maxB) maxB = b1;\n
\t\t\t\t\tif (b2 > maxB) maxB = b2;\n
\t\t\t\t\tif (b3 > maxB) maxB = b3;\n
\n
\t\t\t\t\tif (data[offset] > maxR) {\n
\t\t\t\t\t\tdata[offset] = maxR;\n
\t\t\t\t\t} else if (data[offset] < minR) {\n
\t\t\t\t\t\tdata[offset] = minR;\n
\t\t\t\t\t}\n
\t\t\t\t\tif (data[offset+1] > maxG) {\n
\t\t\t\t\t\tdata[offset+1] = maxG;\n
\t\t\t\t\t} else if (data[offset+1] < minG) {\n
\t\t\t\t\t\tdata[offset+1] = minG;\n
\t\t\t\t\t}\n
\t\t\t\t\tif (data[offset+2] > maxB) {\n
\t\t\t\t\t\tdata[offset+2] = maxB;\n
\t\t\t\t\t} else if (data[offset+2] < minB) {\n
\t\t\t\t\t\tdata[offset+2] = minB;\n
\t\t\t\t\t}\n
\n
\t\t\t\t} while (--x);\n
\t\t\t} while (--y);\n
\n
imagedata.data = data;\n
\t\treturn imagedata;\n
\n
}\n
\n
var edges = function(dataI,width,height) {\n
var imagedata = dataI;\n
var data = imagedata.data;\n
var dataCopy = data;\n
var w = width;\n
var h = height;\n
var mono = false;\n
var invert = false;\n
var mode = 1;\n
\n
\t\tvar c = -1/8;\n
\t\tvar kernel = [\n
\t\t\t\t[c, \tc, \tc],\n
\t\t\t\t[c, \t1, \tc],\n
\t\t\t\t[c, \tc, \tc]\n
\t\t];\n
\n
\t\tweight = 1/c;\n
\n
\t\tvar w4 = w*4;\n
\t\tvar y = h;\n
\t\t\tdo {\n
\t\t\t\tvar offsetY = (y-1)*w4;\n
\n
\t\t\t\tvar nextY = (y == h) ? y - 1 : y;\n
\t\t\t\tvar prevY = (y == 1) ? 0 : y-2;\n
\n
\t\t\t\tvar offsetYPrev = prevY*w*4;\n
\t\t\t\tvar offsetYNext = nextY*w*4;\n
\n
\t\t\t\tvar x = w;\n
\t\t\t\tdo {\n
\t\t\t\t\tvar offset = offsetY + (x*4-4);\n
\n
\t\t\t\t\tvar offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4;\n
\t\t\t\t\tvar offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4;\n
\t\n
\t\t\t\t\tvar r = ((dataCopy[offsetPrev-4]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev+4]\n
\t\t\t\t\t\t+ dataCopy[offset-4]\n
\t\t\t\t\t\t+ dataCopy[offset+4]\n
\t\t\t\t\t\t+ dataCopy[offsetNext-4]\n
\t\t\t\t\t\t+ dataCopy[offsetNext]\n
\t\t\t\t\t\t+ dataCopy[offsetNext+4]) * c\n
\t\t\t\t\t\t+ dataCopy[offset]\n
\t\t\t\t\t\t) \n
\t\t\t\t\t\t* weight;\n
\t\n
\t\t\t\t\tvar g = ((dataCopy[offsetPrev-3]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev+1]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev+5]\n
\t\t\t\t\t\t+ dataCopy[offset-3]\n
\t\t\t\t\t\t+ dataCopy[offset+5]\n
\t\t\t\t\t\t+ dataCopy[offsetNext-3]\n
\t\t\t\t\t\t+ dataCopy[offsetNext+1]\n
\t\t\t\t\t\t+ dataCopy[offsetNext+5]) * c\n
\t\t\t\t\t\t+ dataCopy[offset+1])\n
\t\t\t\t\t\t* weight;\n
\t\n
\t\t\t\t\tvar b = ((dataCopy[offsetPrev-2]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev+2]\n
\t\t\t\t\t\t+ dataCopy[offsetPrev+6]\n
\t\t\t\t\t\t+ dataCopy[offset-2]\n
\t\t\t\t\t\t+ dataCopy[offset+6]\n
\t\t\t\t\t\t+ dataCopy[offsetNext-2]\n
\t\t\t\t\t\t+ dataCopy[offsetNext+2]\n
\t\t\t\t\t\t+ dataCopy[offsetNext+6]) * c\n
\t\t\t\t\t\t+ dataCopy[offset+2])\n
\t\t\t\t\t\t* weight;\n
\n
\t\t\t\t\tif (mono) {\n
\t\t\t\t\t\tvar brightness = (r*0.3 + g*0.59 + b*0.11)||0;\n
\t\t\t\t\t\tif (invert) brightness = 255 - brightness;\n
\t\t\t\t\t\tif (brightness < 0 ) brightness = 0;\n
\t\t\t\t\t\tif (brightness > 255 ) brightness = 255;\n
\t\t\t\t\t\tr = g = b = brightness;\n
\t\t\t\t\t} else {\n
\t\t\t\t\t\tif (invert) {\n
\t\t\t\t\t\t\tr = 255 - r;\n
\t\t\t\t\t\t\tg = 255 - g;\n
\t\t\t\t\t\t\tb = 255 - b;\n
\t\t\t\t\t\t}\n
\t\t\t\t\t\tif (r < 0 ) r = 0;\n
\t\t\t\t\t\tif (g < 0 ) g = 0;\n
\t\t\t\t\t\tif (b < 0 ) b = 0;\n
\t\t\t\t\t\tif (r > 255 ) r = 255;\n
\t\t\t\t\t\tif (g > 255 ) g = 255;\n
\t\t\t\t\t\tif (b > 255 ) b = 255;\n
\t\t\t\t\t}\n
\n
\t\t\t\t\tdata[offset] = r;\n
\t\t\t\t\tdata[offset+1] = g;\n
\t\t\t\t\tdata[offset+2] = b;\n
\n
\t\t\t\t} while (--x);\n
\t\t\t} while (--y);\n
imagedata.data = data;\n
\t\treturn imagedata;\n
};\n
\n
\n
self.addEventListener("message", function(e){\n
var data = e.data;\n
var result = edges(data.image,data.width,data.height);\n
self.postMessage(result);\n
},false);\n
\n
\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>9185</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>pixastic.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54116947.11</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>safeimage.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>var SafeImage = (function() {\n
\n
var that = {};\n
\n
that.loadOpenLayerZoomedImage= function(zoomify_width,\n
zoomify_height, zoomify_url,data){\n
if (that.map !== undefined){\n
that.map.destroy();\n
}\n
/* First we initialize the zoomify pyramid (to get number of tiers) */\n
that.zoomify = new OpenLayers.Layer.Zoomify( "Zoomify", zoomify_url,data,\n
new OpenLayers.Size(zoomify_width, zoomify_height ) );\n
\n
/* Map with raster coordinates (pixels) from Zoomify image */\n
var options = {\n
maxExtent: new OpenLayers.Bounds(0, 0, zoomify_width, zoomify_height),\n
maxResolution: Math.pow(2, that.zoomify.numberOfTiers-1 ),\n
numZoomLevels: that.zoomify.numberOfTiers,\n
units: \'pixels\',\n
size: new OpenLayers.Size(3000,2000)\n
};\n
\n
that.map = new OpenLayers.Map("map", options);\n
that.map.addLayer(that.zoomify);\n
\n
that.map.setBaseLayer(that.zoomify);\n
that.map.zoomToMaxExtent();\n
};\n
return that\n
}());\n
</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1009</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>safeimage.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117152.04</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>template.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
(function(){\n
document.write("<script id=\'image\' type=\'text/html\'>");\n
document.write("{{! Service page template }}");\n
document.write("<article>");\n
document.write("{{ image_id }}");\n
document.write("<div id=\'map\' class=\'smallmap\'></div>");\n
document.write("</article>");\n
document.write("</script>");\n
document.domain = "localhost";\n
})();\n
\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>350</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>template.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>openlayers</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>openlayers</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts54117433.53</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>urlHandler.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\n
* NEXEDI\n
* Author: Thomas Lechauve\n
* Date: 4/18/12\n
*/\n
\n
\n
// Hash parser utility\n
$.parseHash = function(hashTag) {\n
\tvar tokenized = $.extractAuth(hashTag);\n
\tif (tokenized) {\n
\t\t$.publish(\'auth\', tokenized);\n
\t}\n
\tvar splitted = hashTag.substr(1).split(\'/\');\n
\treturn {\n
\t\troute : splitted[0],\n
\t\tid : splitted[1],\n
\t\tmethod : splitted[2]\n
\t}\n
};\n
\n
$.extractAuth = function (hashTag) {\n
\tvar del = hashTag.indexOf(\'&\');\n
\tif (del != -1) {\n
\t\tvar splitted = hashTag.substring(del+1).split(\'&\');\n
\t\tvar result = {};\n
\t\tfor (p in splitted) {\n
\t\t\tvar s = splitted[p].split(\'=\');\n
\t\t\tresult[s[0]] = s[1];\n
\t\t}\n
\t\treturn result;\n
\t}\n
\treturn false;\n
};\n
\n
$.genHash = function(url) {\n
\tif (\'id\' in url) {\n
\t\turl[\'id\'] = \'/\' + url[\'id\'];\n
\t}\n
\tif (\'method\' in url) {\n
\t\turl[\'method\'] = \'/\' + url[\'method\'];\n
\t}\n
\treturn \'/\' + url[\'route\'] + (url[\'id\'] || \'\') + (url[\'method\'] || \'\');\n
};\n
\n
/* Pub / Sub Pattern\n
\tWARNING\n
\tWhat\'s happening when we destroy a DOM object subscribed ?\n
*/\n
var o = $({});\n
$.subscribe = function() {\n
\to.on.apply(o, arguments);\n
};\n
$.unsubscribe = function() {\n
\to.off.apply(o, arguments);\n
};\n
$.publish = function() {\n
\to.trigger.apply(o, arguments);\n
};\n
\n
// Event Handlers\n
$.hashHandler = function(){ $.publish("urlChange", window.location.hash.substr(1)); };\n
$.redirectHandler = function(event, url){ window.location.hash = $.genHash(url); };\n
\n
// redirections manager\n
$.redirect = function(url){ $.publish(\'redirect\', url); };\n
$.subscribe(\'redirect\', $.redirectHandler)\n
\n
$(window).bind(\'hashchange\', $.hashHandler);\n
$(window).bind(\'load\', $.hashHandler);\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1543</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>urlHandler.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
2 3
\ No newline at end of file \ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment