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.ZoomifyImage.ZoomifyZopeProcessor import ZoomifyZopeProcessor
from Products.ZoomifyImage.ZoomifyBase import ZoomifyBase
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):
"""
Tile Images split images in many small parts and then store informations as sub objects
......@@ -62,16 +8,11 @@ class TileImage(Image):
def _setFile(self, *args, **kw):
"""Set the file content and reset image information."""
if "TileGroup0" in self.objectIds():
self.manage_delObjects("TileGroup0")
if "ImageProperties.xml" in self.objectIds():
self.manage_delObjects("ImageProperties.xml")
self._update_image_info()
processor = ERP5ZoomifyZopeProcessor(self)
processor = self.Image_getERP5ZoomifyProcessor(self)
processor.ZoomifyProcess(self.getId(),*args)
import random
import base64
from cStringIO import StringIO
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 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):
"""
Tile Images split images in many small parts and then store informations as sub objects
"""
def _setFile(self, *args, **kw):
"""Set the file content and reset image information."""
if "TileGroup0" in self.objectIds():
self.manage_delObjects("TileGroup0")
if "ImageProperties.xml" in self.objectIds():
self.manage_delObjects("ImageProperties.xml")
self._update_image_info()
processor = ERP5ZoomifyZopeProcessor(self)
processor = self.Image_getERP5ZoomifyProcessor(self,True)
processor.ZoomifyProcess(self.getId(),*args)
......@@ -6,6 +6,18 @@
</pickle>
<pickle>
<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>
<key> <string>_local_properties</string> </key>
<value>
......
......@@ -51,12 +51,14 @@
<item>
<key> <string>_body</string> </key>
<value> <string>import json\n
\n
portal = context.getPortalObject()\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["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
id = tile_image.getId()\n
image_list.append({"title":title, "id": id})\n
......@@ -80,6 +82,14 @@ return json.dumps(data)\n
<key> <string>id</string> </key>
<value> <string>ERP5Site_getTileImageMetadataList</string> </value>
</item>
<item>
<key> <string>warnings</string> </key>
<value>
<tuple>
<string>Prints, but never reads \'printed\' variable.</string>
</tuple>
</value>
</item>
</dictionary>
</pickle>
</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
\ No newline at end of file
3
\ 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