From fce5643a848cbbeefb52fa6592eaf6d288ea685f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Wed, 5 Aug 2015 08:27:54 -0400 Subject: [PATCH 001/232] grunt modules --- .gitignore | 4 +- Gruntfile.js | 195 ++++++++++++++++++++++++++------------------------- package.json | 3 +- 3 files changed, 106 insertions(+), 96 deletions(-) diff --git a/.gitignore b/.gitignore index d6306512..398e3660 100644 --- a/.gitignore +++ b/.gitignore @@ -9,10 +9,12 @@ librairie/ config/config.php services/config.php +modules/ +modules.json node_modules/ npm-debug.log doc/interfaces/navigateur/ .vagrant -puppet/externalmodules \ No newline at end of file +puppet/externalmodules diff --git a/Gruntfile.js b/Gruntfile.js index f5084896..9520795f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -14,7 +14,7 @@ module.exports = function (grunt) { beforeconcat: ['interfaces/navigateur/public/js/app/*.js', 'interfaces/navigateur/public/js/app/**/*.js'], afterconcat: ['interfaces/navigateur/public/js/main-build.js'], basic: ['interfaces/navigateur/public/js/app/*.js'], - options: { + options: { undef: true, curly: true, freeze: true, @@ -38,9 +38,9 @@ module.exports = function (grunt) { } } }, - "jsbeautifier" : { - files : ["interfaces/navigateur/public/js/app/*.js"], - options : { + "jsbeautifier": { + files: ["interfaces/navigateur/public/js/app/*.js"], + options: { } }, // concat: { @@ -61,11 +61,11 @@ module.exports = function (grunt) { options: { sourceMap: true, banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + - '<%= grunt.template.today("yyyy-mm-dd") %> */', + '<%= grunt.template.today("yyyy-mm-dd") %> */', compress: { drop_console: true, global_defs: { - "DEBUG": false + "DEBUG": false }, dead_code: true } @@ -73,19 +73,19 @@ module.exports = function (grunt) { LayerTreeBuilder: { files: { '<%= dirs.LayerTreeBuilder %>/LayerTreeBuilder-build.js': - grunt.file.readJSON('interfaces/navigateur/build/LayerTreeBuilder.json') + grunt.file.readJSON('interfaces/navigateur/build/LayerTreeBuilder.json') } }, WMSBrowser: { files: { '<%= dirs.WMSBrowser %>/WMSBrowser-build.js': - grunt.file.readJSON('interfaces/navigateur/build/WMSBrowser.json') + grunt.file.readJSON('interfaces/navigateur/build/WMSBrowser.json') } }, GeoExt: { files: { '<%= dirs.GeoExt %>/GeoExt-build.js': - grunt.file.readJSON('interfaces/navigateur/build/GeoExt.json') + grunt.file.readJSON('interfaces/navigateur/build/GeoExt.json') } }, GeoExtDebug: { @@ -97,7 +97,7 @@ module.exports = function (grunt) { }, files: { '<%= dirs.GeoExt %>/GeoExt-build-debug.js': - grunt.file.readJSON('interfaces/navigateur/build/GeoExt.json') + grunt.file.readJSON('interfaces/navigateur/build/GeoExt.json') } } // OpenLayers: { @@ -148,7 +148,7 @@ module.exports = function (grunt) { if (Object.keys(duplicates).length > 0) { grunt.log.subhead('Duplicates found in requirejs build:'); for (var key in duplicates) { - grunt.log.error(duplicates[key] + ": " + key); + grunt.log.error(duplicates[key] + ": " + key); } return done(new Error('r.js built duplicate modules, please check the excludes option.')); } else { @@ -160,39 +160,39 @@ module.exports = function (grunt) { } } }, - bower: { - dev: { - dest: 'libs2', - options: { - packageSpecific: { - jquery: { - dest: 'libs2/jquery/jquery-1.10.2/', - files: ["jquery*.js"] - }, - openlayers: { - dest: "libs2/OpenLayers/OpenLayers-2-13-1/", - keepExpandedHierarchy: true, - //files: ["**"] - }, - "jquery-ui": { - dest: 'libs2/jquery/jquery-ui-1-11.2/', - //keepExpandedHierarchy: true, - files: ["jquery-ui*.js"] - }, - "devbridge-autocomplete": { - dest: 'libs2/jquery/extension/autocomplete/', - keepExpandedHierarchy: false, - files: ["**/jquery.autocomplete*.js"] - }, - extjs: { - dest: 'libs2/extjs/ext-3.4.0/', + bower: { + dev: { + dest: 'libs2', + options: { + packageSpecific: { + jquery: { + dest: 'libs2/jquery/jquery-1.10.2/', + files: ["jquery*.js"] + }, + openlayers: { + dest: "libs2/OpenLayers/OpenLayers-2-13-1/", + keepExpandedHierarchy: true, + //files: ["**"] + }, + "jquery-ui": { + dest: 'libs2/jquery/jquery-ui-1-11.2/', + //keepExpandedHierarchy: true, + files: ["jquery-ui*.js"] + }, + "devbridge-autocomplete": { + dest: 'libs2/jquery/extension/autocomplete/', + keepExpandedHierarchy: false, + files: ["**/jquery.autocomplete*.js"] + }, + extjs: { + dest: 'libs2/extjs/ext-3.4.0/', keepExpandedHierarchy: true, files: ["*", "welcome/**", "src/**", "resources/**", "pkgs/**", "adapter/**"] - } - } - } - }, - }, + } + } + } + }, + }, chmod: { options: { mode: '770' @@ -207,17 +207,17 @@ module.exports = function (grunt) { src: ['interfaces/navigateur/app/cache/*', 'pilotage/app/cache/*'] } }, - shell: { - bowerinstall: { - command: function(){ - return 'bower install'; - } - }, - bowerupdate: { - command: function(){ - return 'bower update'; - } - }, + shell: { + bowerinstall: { + command: function () { + return 'bower install'; + } + }, + bowerupdate: { + command: function () { + return 'bower update'; + } + }, buildOpenLayers: { command: [ 'cd <%= dirs.librairies %>/openlayers/build/', @@ -226,43 +226,44 @@ module.exports = function (grunt) { ].join('&&') }, qUnit: { - command: function(){ - return "phantomjs interfaces/navigateur/public/testUnit/run-qunit.js <%= pkg.urlTestUnit %> | \ + command: function () { + return "phantomjs interfaces/navigateur/public/testUnit/run-qunit.js <%= pkg.urlTestUnit %> | \ grep 'failures=\"0\"'"; - }, - options: { - execOptions:{ - timeout: 30000 - }, - callback: function log(err, stdout, stderr, cb) { - if(!stdout){ - grunt.log.subhead('Tests échecs'); - if(err && err.signal === "SIGTERM"){ - grunt.log.error("timeout"); - } else { - grunt.log.error("Dans package.json, veillez définir 'urlTestUnit'"); - } - return cb(new Error('Tests échecs')); - } - var patternT = /tests=\"[0-9]*\"/; - var matchT = patternT.exec(stdout); - var tests = matchT[0].substring(7, matchT[0].length-1); - var patternE = /failures=\"[0-9]*\"/; - var matchE = patternE.exec(stdout); - var echecs = matchE[0].substring(10, matchE[0].length-1); - if(echecs > 0){ - grunt.log.subhead('Tests échecs'); - grunt.log.error(echecs + " échecs sur " + tests + " tests"); - return cb(new Error('Tests échecs')); - } - grunt.log.success(tests + " Tests réussis !"); - cb(); - } - } + }, + options: { + execOptions: { + timeout: 30000 + }, + callback: function log(err, stdout, stderr, cb) { + if (!stdout) { + grunt.log.subhead('Tests échecs'); + if (err && err.signal === "SIGTERM") { + grunt.log.error("timeout"); + } else { + grunt.log.error("Dans package.json, veillez définir 'urlTestUnit'"); + } + return cb(new Error('Tests échecs')); + } + var patternT = /tests=\"[0-9]*\"/; + var matchT = patternT.exec(stdout); + var tests = matchT[0].substring(7, matchT[0].length - 1); + var patternE = /failures=\"[0-9]*\"/; + var matchE = patternE.exec(stdout); + var echecs = matchE[0].substring(10, matchE[0].length - 1); + if (echecs > 0) { + grunt.log.subhead('Tests échecs'); + grunt.log.error(echecs + " échecs sur " + tests + " tests"); + return cb(new Error('Tests échecs')); + } + grunt.log.success(tests + " Tests réussis !"); + cb(); + } + } } - }, + }, clean: { - cache: ['interfaces/navigateur/app/cache/*', 'pilotage/app/cache/*'] + cache: ['interfaces/navigateur/app/cache/*', 'pilotage/app/cache/*'], + modules: ['modules/*'] }, watch: { scripts: { @@ -276,26 +277,28 @@ module.exports = function (grunt) { notify: { task_name: { options: { - // Task-specific options go here. + // Task-specific options go here. } }, watch: { options: { - title: 'Tâches complètées', // optional + title: 'Tâches complètées', // optional message: 'Toutes les tâches ont étés complètées avec succès', //required } } }, - jsdoc : { - dist : { + jsdoc: { + dist: { src: ['interfaces/navigateur/public/js/app/*.js', 'interfaces/navigateur/public/js/app/**/*.js'], options: { destination: 'doc/interfaces/navigateur/', - template : "node_modules/grunt-jsdoc/node_modules/ink-docstrap/template", - configure : "node_modules/grunt-jsdoc/node_modules/ink-docstrap/template/jsdoc.conf.json" + template: "node_modules/grunt-jsdoc/node_modules/ink-docstrap/template", + configure: "node_modules/grunt-jsdoc/node_modules/ink-docstrap/template/jsdoc.conf.json" } } - } + }, + gitclone: grunt.file.readJSON('modules.json'), + gitpull: grunt.file.readJSON('modules.json') }); //grunt.loadNpmTasks('grunt-contrib-concat'); @@ -311,6 +314,7 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-jsdoc'); grunt.loadNpmTasks("grunt-jsbeautifier"); + grunt.loadNpmTasks('grunt-git'); //grunt.loadNpmTasks('grunt-contrib-watch'); //grunt.notify @@ -330,6 +334,9 @@ module.exports = function (grunt) { grunt.registerTask('telechargerLibs', ['shell:bowerinstall']); grunt.registerTask('doc', ['jsdoc']); grunt.registerTask('qUnit', ['shell:qUnit']); + grunt.registerTask('cloneModules', ['gitclone']); + grunt.registerTask('pullModules', ['gitpull']); + grunt.registerTask('cleanModules', ['clean:modules']); //jsbeautifier et //jshint grunt.task.run('notify_hooks'); diff --git a/package.json b/package.json index dd9bc024..6f4c88f0 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,15 @@ "urlTestUnit": "", "devDependencies": { "grunt": "^0.4.5", - "grunt-cli" : "^0.1.13", "grunt-bower": "^0.19.0", "grunt-chmod": "^1.0.3", + "grunt-cli": "^0.1.13", "grunt-contrib-clean": "^0.6.0", "grunt-contrib-jshint": "^0.11.2", "grunt-contrib-requirejs": "^0.4.4", "grunt-contrib-uglify": "^0.9.1", "grunt-contrib-watch": "^0.6.1", + "grunt-git": "^0.3.5", "grunt-jsbeautifier": "^0.2.10", "grunt-jsdoc": "^0.6.7", "grunt-notify": "^0.4.1", From 7749e82f4a8e68fc59a848de836dba0b05a02084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Wed, 5 Aug 2015 08:40:01 -0400 Subject: [PATCH 002/232] remove tests --- edition/app/index.php | 7 +- tests/js/yslow.js | 5 - tests/phpUnit/phpunit.phar | 72846 ----------------------------------- tests/readme.md | 41 - tests/selenium/README.md | 13 - 5 files changed, 6 insertions(+), 72906 deletions(-) delete mode 100644 tests/js/yslow.js delete mode 100644 tests/phpUnit/phpunit.phar delete mode 100644 tests/readme.md delete mode 100644 tests/selenium/README.md diff --git a/edition/app/index.php b/edition/app/index.php index 4011bbc5..307da44e 100644 --- a/edition/app/index.php +++ b/edition/app/index.php @@ -160,11 +160,16 @@ function describeFeatureType($data){ $geometry = json_decode($data["geometry"]); } + $fkId = null; + if(isset($data["fk"])) { + $fkId = $data["fk"]; + } + $featureTypes = array(); foreach($services as $srv){ $featureType = array( 'name' => $srv->getName(), - 'featureType' => $srv->getFields($geometry, $data["fk"]), + 'featureType' => $srv->getFields($geometry, $fkId), 'type' => $srv->getGeometryType() ); $featureTypes[] = $featureType; diff --git a/tests/js/yslow.js b/tests/js/yslow.js deleted file mode 100644 index 085f374c..00000000 --- a/tests/js/yslow.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Copyright (c) 2012, Yahoo! Inc. All rights reserved. - * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. - */ -var i,arg,page,urlCount,viewport,webpage=require("webpage"),args=phantom.args,len=args.length,urls=[],yslowArgs={info:"all",format:"json",ruleset:"ydefault",beacon:false,ua:false,viewport:false,headers:false,console:0,threshold:80,cdns:""},unaryArgs={help:false,version:false,dict:false,verbose:false},argsAlias={i:"info",f:"format",r:"ruleset",h:"help",V:"version",d:"dict",u:"ua",vp:"viewport",c:"console",b:"beacon",v:"verbose",t:"threshold",ch:"headers"};for(i=0;i specify the information to display/log (basic|grade|stats|comps|all) [all]"," -f, --format specify the output results format (json|xml|plain|tap|junit) [json]"," -r, --ruleset specify the YSlow performance ruleset to be used (ydefault|yslow1|yblog) [ydefault]"," -b, --beacon specify an URL to log the results"," -d, --dict include dictionary of results fields"," -v, --verbose output beacon response information"," -t, --threshold for test formats, the threshold to test scores ([0-100]|[A-F]|{JSON}) [80]",' e.g.: -t B or -t 75 or -t \'{"overall": "B", "ycdn": "F", "yexpires": 85}\'',' -u, --ua "" specify the user agent string sent to server when the page requests resources'," -vp, --viewport specify page viewport size WxY, where W = width and H = height [400x300]",' -ch, --headers specify custom request headers, e.g.: -ch \'{"Cookie": "foo=bar"}\''," -c, --console output page console messages (0: none, 1: message, 2: message + line + source) [0]",' --cdns "" specify comma separated list of additional CDNs',""," Examples:",""," phantomjs "+phantom.scriptName+" http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -f xml www.yahoo.com www.cnn.com www.nytimes.com"," phantomjs "+phantom.scriptName+' --info all --format plain --ua "MSIE 9.0" http://yslow.org'," phantomjs "+phantom.scriptName+" -i basic --rulseset yslow1 -d http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -b http://www.showslow.com/beacon/yslow/ -v yslow.org"," phantomjs --load-plugins=yes "+phantom.scriptName+" -vp 800x600 http://www.yahoo.com"," phantomjs "+phantom.scriptName+" -i grade -f tap -t 85 http://yslow.org",""].join("\n"));phantom.exit()}yslowArgs.dict=unaryArgs.dict;yslowArgs.verbose=unaryArgs.verbose;urls.forEach(function(a){var c=webpage.create();c.resources={};c.settings.webSecurityEnabled=false;c.onResourceRequested=function(d){c.resources[d.url]={request:d}};c.onResourceReceived=function(d){var e,f=c.resources[d.url].response;if(!f){c.resources[d.url].response=d}else{for(e in d){if(d.hasOwnProperty(e)){f[e]=d[e]}}}};yslowArgs.console=parseInt(yslowArgs.console,10)||0;if(yslowArgs.console){if(yslowArgs.console===1){c.onConsoleMessage=function(d){console.log(d)};c.onError=function(d){console.error(d)}}else{c.onConsoleMessage=function(f,d,e){console.log(JSON.stringify({message:f,lineNumber:d,source:e},null,4))};c.onError=function(e,d){console.error(JSON.stringify({message:e,stacktrace:d}))}}}else{c.onError=function(){}}if(yslowArgs.ua){c.settings.userAgent=yslowArgs.ua}if(yslowArgs.viewport){viewport=yslowArgs.viewport.toLowerCase();c.viewportSize={width:parseInt(viewport.slice(0,viewport.indexOf("x")),10)||c.viewportSize.width,height:parseInt(viewport.slice(viewport.indexOf("x")+1),10)||c.viewportSize.height}}if(yslowArgs.headers){try{c.customHeaders=JSON.parse(yslowArgs.headers)}catch(b){console.log("Invalid custom headers: "+b)}}c.startTime=new Date();c.open(a,function(m){var g,l,o,p,n,d,k,j,f=0,e=c.startTime,h=c.resources;if(m!=="success"){console.log("FAIL to load "+d)}else{n=new Date()-e;for(d in h){if(h.hasOwnProperty(d)){k=h[d].response;if(k){k.time=new Date(k.time)-e}}}g=function(){if(typeof YSLOW==="undefined"){YSLOW={}}YSLOW.DEBUG=true;YSLOW.registerRule=function(q){YSLOW.controller.addRule(q)};YSLOW.registerRuleset=function(q){YSLOW.controller.addRuleset(q)};YSLOW.registerRenderer=function(q){YSLOW.controller.addRenderer(q)};YSLOW.registerTool=function(q){YSLOW.Tools.addCustomTool(q)};YSLOW.addEventListener=function(r,s,q){YSLOW.util.event.addListener(r,s,q)};YSLOW.removeEventListener=function(q,r){return YSLOW.util.event.removeListener(q,r)};YSLOW.Error=function(q,r){this.name=q;this.message=r};YSLOW.Error.prototype={toString:function(){return this.name+"\n"+this.message}};YSLOW.version="3.1.8";YSLOW.ComponentSet=function(q,r){this.root_node=q;this.components=[];this.outstanding_net_request=0;this.component_info=[];this.onloadTimestamp=r;this.nextID=1;this.notified_fetch_done=false};YSLOW.ComponentSet.prototype={clear:function(){this.components=[];this.component_info=[];this.cleared=true;if(this.outstanding_net_request>0){YSLOW.util.dump("YSLOW.ComponentSet.Clearing component set before all net requests finish.")}},addComponent:function(t,u,r,w){var q,v,s;if(!t){if(!this.empty_url){this.empty_url=[]}this.empty_url[u]=(this.empty_url[u]||0)+1}if(t&&u){if(!YSLOW.ComponentSet.isValidProtocol(t)||!YSLOW.ComponentSet.isValidURL(t)){return q}t=YSLOW.util.makeAbsoluteUrl(t,r);t=YSLOW.util.escapeHtml(t);v=typeof this.component_info[t]!=="undefined";s=u==="doc";if(!v||s){this.component_info[t]={state:"NONE",count:v?this.component_info[t].count:0};q=new YSLOW.Component(t,u,this,w);if(q){q.id=this.nextID+=1;this.components[this.components.length]=q;if(!this.doc_comp&&s){this.doc_comp=q}if(this.component_info[t].state==="NONE"){this.component_info[t].state="REQUESTED";this.outstanding_net_request+=1}}else{this.component_info[t].state="ERROR";YSLOW.util.event.fire("componentFetchError")}}this.component_info[t].count+=1}return q},addComponentNoDuplicate:function(r,s,q){if(r&&s){r=YSLOW.util.escapeHtml(r);r=YSLOW.util.makeAbsoluteUrl(r,q);if(this.component_info[r]===undefined){return this.addComponent(r,s,q)}}},getComponentsByType:function(D,A,u){var w,v,B,s,E,y,r,x=this.components,C=this.component_info,q=[],z={};if(typeof A==="undefined"){A=!(YSLOW.util.Preference.getPref("excludeAfterOnload",true))}if(typeof u==="undefined"){u=!(YSLOW.util.Preference.getPref("excludeBeaconsFromLint",true))}if(typeof D==="string"){z[D]=1}else{for(w=0,B=D.length;w0){w=u.substr(0,r);for(t=0;t0){w.expires=new Date(w.headers.expires)}}if(w.type==="image"&&!s){if(typeof Image!==B){u=new Image()}else{u=document.createElement("img")}if(w.body.length){y="data:"+w.headers["content-type"]+";base64,"+YSLOW.util.base64Encode(w.body);z=1}else{y=w.url}u.onerror=function(){u.onerror=t;if(z){u.src=w.url}};u.onload=function(){u.onload=t;if(u&&u.width&&u.height){if(w.object_prop){w.object_prop.actual_width=u.width;w.object_prop.actual_height=u.height}else{w.object_prop={width:u.width,height:u.height,actual_width:u.width,actual_height:u.height}}if(u.width<2&&u.height<2){w.is_beacon=true}}};u.src=y}};YSLOW.Component.prototype.hasOldModifiedDate=function(){var q=Number(new Date()),r=this.headers["last-modified"];if(typeof r!=="undefined"){return((q-Number(new Date(r)))>(24*60*60*1000))}return false};YSLOW.Component.prototype.hasFarFutureExpiresOrMaxAge=function(){var t,r=Number(new Date()),s=YSLOW.util.Preference.getPref("minFutureExpiresSeconds",2*24*60*60),q=s*1000;if(typeof this.expires==="object"){t=Number(this.expires);if((t-r)>q){return true}}return false};YSLOW.Component.prototype.getEtag=function(){return this.headers.etag||""};YSLOW.Component.prototype.getMaxAge=function(){var r,s,q,t=this.headers["cache-control"];if(t){r=t.indexOf("max-age");if(r>-1){s=parseInt(t.substring(r+8),10);if(s>0){q=YSLOW.util.maxAgeToDate(s)}}}return q};YSLOW.Component.prototype.getSetCookieSize=function(){var s,q,r=0;if(this.headers&&this.headers["set-cookie"]){s=this.headers["set-cookie"].split("\n");if(s.length>0){for(q=0;q0){s=this.cookie.split("\n");if(s.length>0){for(q=0;qq.parent.onloadTimestamp;q.populateProperties(false,true);q.get_info_state="DONE";q.parent.onComponentGetInfoStateChange({comp:q,state:"DONE"})};if(s.request&&s.response){r(s.request,s.response)}};YSLOW.controller={rules:{},rulesets:{},onloadTimestamp:null,renderers:{},default_ruleset_id:"ydefault",run_pending:0,init:function(){var r,q,t,s;YSLOW.util.event.addListener("onload",function(u){this.onloadTimestamp=u.time;YSLOW.util.setTimer(function(){YSLOW.controller.run_pending_event()})},this);YSLOW.util.event.addListener("onUnload",function(u){this.run_pending=0;this.onloadTimestamp=null},this);r=YSLOW.util.Preference.getPrefList("customRuleset.",undefined);if(r&&r.length>0){for(q=0;q0){t=JSON.parse(s,null);t.custom=true;this.addRuleset(t)}}}this.default_ruleset_id=YSLOW.util.Preference.getPref("defaultRuleset","ydefault");this.loadRulePreference()},run:function(t,u,r){var v,q,s=t.document;if(!s||!s.location||s.location.href.indexOf("about:")===0||"undefined"===typeof s.location.hostname){if(!r){q="Please enter a valid website address before running YSlow.";YSLOW.ysview.openDialog(YSLOW.ysview.panel_doc,389,150,q,"","Ok")}return}if(!u.PAGE.loaded){this.run_pending={win:t,yscontext:u};return}YSLOW.util.event.fire("peelStart",undefined);v=YSLOW.peeler.peel(s,this.onloadTimestamp);u.component_set=v;YSLOW.util.event.fire("peelComplete",{component_set:v});v.notifyPeelDone()},run_pending_event:function(){if(this.run_pending){this.run(this.run_pending.win,this.run_pending.yscontext,false);this.run_pending=0}},lint:function(H,s,q){var t,x,F,w,y,z,G,E=[],C=[],D=0,B=0,u=this,v=u.rulesets,A=u.default_ruleset_id;if(q){E=v[q]}else{if(A&&v[A]){E=v[A]}else{for(F in v){if(v.hasOwnProperty(F)&&v[F]){E=v[F];break}}}}x=E.rules;for(F in x){if(x.hasOwnProperty(F)&&x[F]&&this.rules.hasOwnProperty(F)){try{t=this.rules[F];w=YSLOW.util.merge(t.config,x[F]);y=t.lint(H,s.component_set,w);z=(E.weights?E.weights[F]:undefined);if(z!==undefined){z=parseInt(z,10)}if(z===undefined||z<0||z>100){if(v.ydefault.weights[F]){z=v.ydefault.weights[F]}else{z=5}}y.weight=z;if(y.score!==undefined){if(typeof y.score!=="number"){G=parseInt(y.score,10);if(!isNaN(G)){y.score=G}}if(typeof y.score==="number"){B+=y.weight;if(!YSLOW.util.Preference.getPref("allowNegativeScore",false)){if(y.score<0){y.score=0}if(typeof y.score!=="number"){y.score=-1}}if(y.score!==0){D+=y.score*(typeof y.weight!=="undefined"?y.weight:1)}}}y.name=t.name;y.category=t.category;y.rule_id=F;C[C.length]=y}catch(r){YSLOW.util.dump("YSLOW.controller.lint: "+F,r);YSLOW.util.event.fire("lintError",{rule:F,message:r})}}}s.PAGE.overallScore=D/(B>0?B:1);s.result_set=new YSLOW.ResultSet(C,s.PAGE.overallScore,E);s.result_set.url=s.component_set.doc_comp.url;YSLOW.util.event.fire("lintResultReady",{yslowContext:s});return s.result_set},runTool:function(D,A,r){var G,w,C,v,y,q,B,t,F,E,x,z=YSLOW.Tools.getTool(D);try{if(typeof z==="object"){G=z.run(A.document,A.component_set,r);if(z.print_output){w="";if(typeof G==="object"){w=G.html}else{if(typeof G==="string"){w=G}}C=YSLOW.util.getNewDoc();x=C.body||C.documentElement;x.innerHTML=w;v=C.getElementsByTagName("head")[0];if(typeof G.css==="undefined"){q="chrome://yslow/content/yslow/tool.css";B=new XMLHttpRequest();B.open("GET",q,false);B.send(null);y=B.responseText}else{y=G.css}if(typeof y==="string"){t=C.createElement("style");t.setAttribute("type","text/css");t.appendChild(C.createTextNode(y));v.appendChild(t)}if(typeof G.js!=="undefined"){F=C.createElement("script");F.setAttribute("type","text/javascript");F.appendChild(C.createTextNode(G.js));v.appendChild(F)}if(typeof G.plot_component!=="undefined"&&G.plot_component===true){YSLOW.renderer.plotComponents(C,A)}}}else{E=D+" is not a tool.";YSLOW.util.dump(E);YSLOW.util.event.fire("toolError",{tool_id:D,message:E})}}catch(u){YSLOW.util.dump("YSLOW.controller.runTool: "+D,u);YSLOW.util.event.fire("toolError",{tool_id:D,message:u})}},render:function(u,q,t){var s=this.renderers[u],r="";if(s.supports[q]!==undefined&&s.supports[q]===1){switch(q){case"components":r=s.componentsView(t.comps,t.total_size);break;case"reportcard":r=s.reportcardView(t.result_set);break;case"stats":r=s.statsView(t.stats);break;case"tools":r=s.toolsView(t.tools);break;case"rulesetEdit":r=s.rulesetEditView(t.rulesets);break}}return r},getRenderer:function(q){return this.renderers[q]},addRule:function(s){var q,r,t=["id","name","config","info","lint"];if(YSLOW.doc.rules&&YSLOW.doc.rules[s.id]){r=YSLOW.doc.rules[s.id];if(r.name){s.name=r.name}if(r.info){s.info=r.info}}for(q=0;q0&&r){r.config.howfar=q}}};YSLOW.util={merge:function(r,q){var s,t={};for(s in r){if(r.hasOwnProperty(s)){t[s]=r[s]}}for(s in q){if(q.hasOwnProperty(s)){t[s]=q[s]}}return t},dump:function(){var q;if(!YSLOW.DEBUG){return}q=Array.prototype.slice.apply(arguments);q=q&&q.length===1?q[0]:q;try{if(typeof Firebug!=="undefined"&&Firebug.Console&&Firebug.Console.log){Firebug.Console.log(q)}else{if(typeof Components!=="undefined"&&Components.classes&&Components.interfaces){Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage(JSON.stringify(q,null,2))}}}catch(s){try{console.log(q)}catch(r){}}},filter:function(t,u,r){var s,q=r?[]:{};for(s in t){if(t.hasOwnProperty(s)&&u(s,t[s])){q[r?q.length:s]=t[s]}}return q},expires_month:{Jan:1,Feb:2,Mar:3,Apr:4,May:5,Jun:6,Jul:7,Aug:8,Sep:9,Oct:10,Nov:11,Dec:12},prettyExpiresDate:function(q){var r;if(Object.prototype.toString.call(q)==="[object Date]"&&q.toString()!=="Invalid Date"&&!isNaN(q)){r=q.getMonth()+1;return q.getFullYear()+"/"+r+"/"+q.getDate()}else{if(!q){return"no expires"}}return"invalid date object"},maxAgeToDate:function(r){var q=new Date();q=q.getTime()+parseInt(r,10)*1000;return new Date(q)},plural:function(s,t){var r,q=s,u={are:["are","is"],s:["s",""],"do":["do","does"],num:[t,t]};for(r in u){if(u.hasOwnProperty(r)){q=q.replace(new RegExp("%"+r+"%","gm"),(t===1)?u[r][1]:u[r][0])}}return q},countExpressions:function(s){var q=0,r;r=s.indexOf("expression(");while(r!==-1){q+=1;r=s.indexOf("expression(",r+1)}return q},countAlphaImageLoaderFilter:function(v){var t,u,s,w,r=0,x=0,q={};t=v.indexOf("filter:");while(t!==-1){s=false;if(t>0&&v.charAt(t-1)==="_"){s=true}u=v.indexOf(";",t+7);if(u!==-1){w=v.substring(t+7,u);if(w.indexOf("AlphaImageLoader")!==-1){if(s){x+=1}else{r+=1}}}t=v.indexOf("filter:",t+1)}if(x>0){q.hackFilter=x}if(r>0){q.filter=r}return q},getHostname:function(r){var q=r.split("/")[2];return(q&&q.split(":")[0])||""},getUniqueDomains:function(w,u){var t,r,v,q={},s=[];for(t=0,r=w.length;t0.2){return false}return true},isETagGood:function(q){var s=/^[0-9a-f]+:([1-9a-f]|[0-9a-f]{2,})$/,r=/^[0-9a-f]+\-[0-9a-f]+\-[0-9a-f]+$/;if(!q){return true}q=q.replace(/^["']|["'][\s\S]*$/g,"");return !(r.test(q)||s.test(q))},getComponentType:function(q){var r="unknown";if(q&&typeof q==="string"){if(q==="text/html"||q==="text/plain"){r="doc"}else{if(q==="text/css"){r="css"}else{if(/javascript/.test(q)){r="js"}else{if(/flash/.test(q)){r="flash"}else{if(/image/.test(q)){r="image"}else{if(/font/.test(q)){r="font"}}}}}}}return r},base64Encode:function(v){var u,t,s,x,r="",w=0,q=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"];for(u=0;u>2];r+=q[((t&3)<<4)|((s&240)>>4)];if(w>0){r+="="}else{r+=q[((s&15)<<2)|((x&192)>>6)]}if(w>1){r+="="}else{r+=q[(x&63)]}}return r},getXHR:function(){var q=0,t=null,r=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest==="function"){return new XMLHttpRequest()}for(q=0;q/g,">")},escapeQuotes:function(r,q){if(q==="single"){return r.replace(/\'/g,"\\'")}if(q==="double"){return r.replace(/\"/g,'\\"')}return r.replace(/\'/g,"\\'").replace(/\"/g,'\\"')},formatHeaderName:(function(){var q={"content-md5":"Content-MD5",dnt:"DNT",etag:"ETag",p3p:"P3P",te:"TE","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-cdn":"X-CDN","x-ua-compatible":"X-UA-Compatible","x-xss-protection":"X-XSS-Protection"};return function(s){var r=s.toLowerCase();if(q.hasOwnProperty(r)){return q[r]}else{return r.replace(/(^|-)([a-z])/g,function(t,u,v){return u+v.toUpperCase()})}}}()),mod:function(q,r){return Math.round(q-(Math.floor(q/r)*r))},briefUrl:function(s,q){var r,t,u,v;q=q||100;if(s===undefined){return""}r=s.indexOf("//");if(-1!==r){t=s.indexOf("?");if(-1!==t){s=s.substring(0,t)+"?..."}if(s.length>q){u=s.indexOf("/",r+2);v=s.lastIndexOf("/");if(-1!==u&&-1!==v&&u!==v){s=s.substring(0,u+1)+"..."+s.substring(v)}else{s=s.substring(0,q+1)+"..."}}}return s},prettyAnchor:function(y,r,t,s,w,q,z){var u,x="",v="",A=0;if(typeof r==="undefined"){r=y}if(typeof t==="undefined"){t=""}else{t=' class="'+t+'"'}if(typeof w==="undefined"){w=100}if(typeof q==="undefined"){q=1}z=(z)?' rel="'+z+'"':"";r=YSLOW.util.escapeHtml(r);y=YSLOW.util.escapeHtml(y);u=YSLOW.util.escapeQuotes(r,"double");if(s){y=YSLOW.util.briefUrl(y,w);x=' title="'+u+'"'}while(0"+y.substring(0,w);y=y.substring(w);A+=1;if(A>=q){if(0";break}else{v+=" "}}return v},kbSize:function(q){var r=q%(q>100?100:10);q-=r;return parseFloat(q/1000)+(0===(q%1000)?".0":"")+"K"},prettyTypes:{image:"Image",doc:"HTML/Text",cssimage:"CSS Image",css:"Stylesheet File",js:"JavaScript File",flash:"Flash Object",iframe:"IFrame",xhr:"XMLHttpRequest",redirect:"Redirect",favicon:"Favicon",unknown:"Unknown"},prettyType:function(q){return YSLOW.util.prettyTypes[q]},prettyScore:function(r){var q="F";if(!parseInt(r,10)&&r!==0){return r}if(r===-1){return"N/A"}if(r>=90){q="A"}else{if(r>=80){q="B"}else{if(r>=70){q="C"}else{if(r>=60){q="D"}else{if(r>=50){q="E"}}}}}return q},getResults:function(w,S){var O,L,J,u,t,H,T,G,F,x,v,r,W,Q,I,s,E,D,y,A,N,K,B,z=/ "):"")}}return{score:J,message:z,components:r}}});YSLOW.registerRule({id:"yexpires",url:"http://developer.yahoo.com/performance/rules.html#expires",category:["server"],config:{points:11,howfar:172800,types:["css","js","image","cssimage","flash","favicon"]},lint:function(y,A,r){var x,t,z,s,w,u=parseInt(r.howfar,10)*1000,v=[],q=A.getComponentsByType(r.types);for(t=0,w=q.length;tx+u){continue}}v.push(q[t])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",v.length)+" without a far-future expiration date.":"",components:v}}});YSLOW.registerRule({id:"ycompress",url:"http://developer.yahoo.com/performance/rules.html#gzip",category:["server"],config:{min_filesize:500,types:["doc","iframe","xhr","js","css"],points:11},lint:function(x,y,r){var t,w,s,u,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% plain text component%s%",v.length)+" that should be sent compressed":"",components:v}}});YSLOW.registerRule({id:"ycsstop",url:"http://developer.yahoo.com/performance/rules.html#css_top",category:["css"],config:{points:10},lint:function(x,y,r){var t,w,s,u,q=y.getComponentsByType("css"),v=[];for(t=0,w=q.length;t0){s-=1+v.length*parseInt(r.points,10)}return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% stylesheet%s%",v.length)+" found in the body of the document":"",components:v}}});YSLOW.registerRule({id:"yjsbottom",url:"http://developer.yahoo.com/performance/rules.html#js_bottom",category:["javascript"],config:{points:5},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType("js");for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% JavaScript script%s%",v.length)+" found in the head of the document":"",components:v}}});YSLOW.registerRule({id:"yexpressions",url:"http://developer.yahoo.com/performance/rules.html#css_expressions",category:["css"],config:{points:2},lint:function(y,B,r){var t,w,A,u,z=(B.inline&&B.inline.styles)||[],q=B.getComponentsByType("css"),v=[],s=100,x=0;for(t=0,w=q.length;t0){u.yexpressions=YSLOW.util.plural("%num% expression%s%",A);x+=A;v.push(u)}}for(t=0,w=z.length;t0){v.push("inline <style> tag #"+(t+1)+" ("+YSLOW.util.plural("%num% expression%s%",A)+")");x+=A}}if(x>0){s=90-x*r.points}return{score:s,message:x>0?"There is a total of "+YSLOW.util.plural("%num% expression%s%",x):"",components:v}}});YSLOW.registerRule({id:"yexternal",url:"http://developer.yahoo.com/performance/rules.html#external",category:["javascript","css"],config:{},lint:function(v,x,r){var t,u=x.inline,s=(u&&u.styles)||[],q=(u&&u.scripts)||[],w=[];if(s.length){t=YSLOW.util.plural("There is a total of %num% inline css",s.length);w.push(t)}if(q.length){t=YSLOW.util.plural("There is a total of %num% inline script%s%",q.length);w.push(t)}return{score:"n/a",message:"Only consider this if your property is a common user home page.",components:w}}});YSLOW.registerRule({id:"ydns",url:"http://developer.yahoo.com/performance/rules.html#dns_lookups",category:["content"],config:{max_domains:4,points:5},lint:function(y,A,q){var t,v,s,u=YSLOW.util,w=u.kbSize,x=u.plural,r=100,z=u.summaryByDomain(A.components,["size","size_compressed"],true);if(z.length>q.max_domains){r-=(z.length-q.max_domains)*q.points}if(z.length){for(t=0,v=z.length;t0?" ("+w(s.sum_size_compressed)+" GZip)":"")}}return{score:r,message:(z.length>q.max_domains)?x("The components are split over more than %num% domain%s%",q.max_domains):"",components:z}}});YSLOW.registerRule({id:"yminify",url:"http://developer.yahoo.com/performance/rules.html#minify",category:["javascript","css"],config:{points:10,types:["js","css"]},lint:function(A,C,r){var u,x,s,z,v,y=C.inline,B=(y&&y.styles)||[],t=(y&&y.scripts)||[],q=C.getComponentsByType(r.types),w=[];for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% component%s% that can be minified",w.length):"",components:w}}});YSLOW.registerRule({id:"yredirects",url:"http://developer.yahoo.com/performance/rules.html#redirects",category:["content"],config:{points:10},lint:function(y,z,r){var u,x,v,s,w=[],t=YSLOW.util.briefUrl,q=z.getComponentsByType("redirect");for(u=0,x=q.length;u0)?YSLOW.util.plural("There %are% %num% redirect%s%",q.length):"",components:w}}});YSLOW.registerRule({id:"ydupes",url:"http://developer.yahoo.com/performance/rules.html#js_dupes",category:["javascript","css"],config:{points:5,types:["js","css"]},lint:function(y,z,s){var v,q,t,x,u={},w=[],r=z.getComponentsByType(s.types);for(v=0,x=r.length;v1){w.push(r[u[v].compindex])}}t=100-w.length*parseInt(s.points,10);return{score:t,message:(w.length>0)?YSLOW.util.plural("There %are% %num% duplicate component%s%",w.length):"",components:w}}});YSLOW.registerRule({id:"yetags",url:"http://developer.yahoo.com/performance/rules.html#etags",category:["server"],config:{points:11,types:["flash","js","css","cssimage","image","favicon"]},lint:function(y,z,r){var t,w,s,u,x,v=[],q=z.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% component%s% with misconfigured ETags",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhr",url:"http://developer.yahoo.com/performance/rules.html#cacheajax",category:["content"],config:{points:5,min_cache_time:3600},lint:function(y,A,r){var u,z,x,s,w,t=parseInt(r.min_cache_time,10)*1000,v=[],q=A.getComponentsByType("xhr");for(u=0;ux+t){continue}}v.push(q[u])}s=100-v.length*parseInt(r.points,10);return{score:s,message:(v.length>0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %are% not cacheable",v.length):"",components:v}}});YSLOW.registerRule({id:"yxhrmethod",url:"http://developer.yahoo.com/performance/rules.html#ajax_get",category:["server"],config:{points:5},lint:function(s,w,q){var r,t,v=[],u=w.getComponentsByType("xhr");for(r=0;r0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %do% not use GET HTTP method",v.length):"",components:v}}});YSLOW.registerRule({id:"ymindom",url:"http://developer.yahoo.com/performance/rules.html#min_dom",category:["content"],config:{range:250,points:10,maxdom:900},lint:function(s,u,r){var q=u.domElementsCount,t=100;if(q>r.maxdom){t=99-Math.ceil((q-parseInt(r.maxdom,10))/parseInt(r.range,10))*parseInt(r.points,10)}return{score:t,message:(q>r.maxdom)?YSLOW.util.plural("There %are% %num% DOM element%s% on the page",q):"",components:[]}}});YSLOW.registerRule({id:"yno404",url:"http://developer.yahoo.com/performance/rules.html#no404",category:["content"],config:{points:5,types:["css","js","image","cssimage","flash","xhr","favicon"]},lint:function(x,y,r){var t,w,u,s,v=[],q=y.getComponentsByType(r.types);for(t=0,w=q.length;t0)?YSLOW.util.plural("There %are% %num% request%s% that %are% 404 Not Found",v.length):"",components:v}}});YSLOW.registerRule({id:"ymincookie",url:"http://developer.yahoo.com/performance/rules.html#cookie_size",category:["cookie"],config:{points:10,max_cookie_size:1000},lint:function(u,x,r){var w,t=x.cookies,q=(t&&t.length)||0,s="",v=100;if(q>r.max_cookie_size){w=Math.floor(q/r.max_cookie_size);v-=1+w*parseInt(r.points,10);s=YSLOW.util.plural("There %are% %num% byte%s% of cookies on this page",q)}return{score:v,message:s,components:[]}}});YSLOW.registerRule({id:"ycookiefree",url:"http://developer.yahoo.com/performance/rules.html#cookie_free",category:["cookie"],config:{points:5,types:["js","css","image","cssimage","flash","favicon"]},lint:function(A,B,t){var v,z,u,x,q,y=[],s=YSLOW.util.getHostname,w=s(B.doc_comp.url),r=B.getComponentsByType(t.types);for(v=0,z=r.length;v0)?YSLOW.util.plural("There %are% %num% component%s% that %are% not cookie-free",y.length):"",components:y}}});YSLOW.registerRule({id:"ynofilter",url:"http://developer.yahoo.com/performance/rules.html#no_filters",category:["css"],config:{points:5,halfpoints:2},lint:function(B,E,s){var u,y,t,v,A,x,D,C=(E.inline&&E.inline.styles)||[],r=E.getComponentsByType("css"),w=[],q=0,z=0;for(u=0,y=r.length;u0){r[u].yfilters=YSLOW.util.plural("%num% filter%s%",x);w.push(r[u])}}for(u=0,y=C.length;u0){w.push("inline <style> tag #"+(u+1)+" ("+YSLOW.util.plural("%num% filter%s%",x)+")")}}t=100-(q*s.points+z*s.halfpoints);return{score:t,message:(q+z)>0?"There is a total of "+YSLOW.util.plural("%num% filter%s%",q+z):"",components:w}}});YSLOW.registerRule({id:"yimgnoscale",url:"http://developer.yahoo.com/performance/rules.html#no_scale",category:["images"],config:{points:5},lint:function(s,x,q){var r,w,t,v=[],u=x.getComponentsByType("image");for(r=0;r0)?YSLOW.util.plural("There %are% %num% image%s% that %are% scaled down",v.length):"",components:v}}});YSLOW.registerRule({id:"yfavicon",url:"http://developer.yahoo.com/performance/rules.html#favicon",category:["images"],config:{points:5,size:2000,min_cache_time:3600},lint:function(y,A,r){var x,z,w,t,s,v=[],u=parseInt(r.min_cache_time,10)*1000,q=A.getComponentsByType("favicon");if(q.length){w=q[0];if(parseInt(w.status,10)===404){v.push("Favicon was not found")}if(w.size>r.size){v.push(YSLOW.util.plural("Favicon is more than %num% bytes",r.size))}z=w.expires;if(typeof z==="object"&&typeof z.getTime==="function"){x=new Date().getTime();s=z.getTime()>=x+u}if(!s){v.push("Favicon is not cacheable")}}t=100-v.length*parseInt(r.points,10);return{score:t,message:(v.length>0)?v.join("\n"):"",components:[]}}});YSLOW.registerRule({id:"yemptysrc",url:"http://developer.yahoo.com/performance/rules.html#emptysrc",category:["server"],config:{points:100},lint:function(x,A,r){var w,s,v,y=A.empty_url,u=[],t=[],q="",z=parseInt(r.points,10);s=100;if(y){for(w in y){if(y.hasOwnProperty(w)){v=y[w];s-=v*z;t.push(v+" "+w)}}q=t.join(", ")+YSLOW.util.plural(" component%s% with empty link were found.",t.length)}return{score:s,message:q,components:u}}});YSLOW.registerRuleset({id:"ydefault",name:"YSlow(V2)",rules:{ynumreq:{},ycdn:{},yemptysrc:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,ycdn:6,yemptysrc:30,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.registerRuleset({id:"yslow1",name:"Classic(V1)",rules:{ynumreq:{},ycdn:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{types:["js"],check_inline:false},yredirects:{},ydupes:{types:["js"]},yetags:{}},weights:{ynumreq:8,ycdn:6,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2}});YSLOW.registerRuleset({id:"yblog",name:"Small Site or Blog",rules:{ynumreq:{},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},ydns:{},yminify:{},yredirects:{},ydupes:{},ymindom:{},yno404:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,ydns:3,yminify:4,yredirects:4,ydupes:4,ymindom:3,yno404:4,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.ResultSet=function(s,r,q){this.ruleset_applied=q;this.overall_score=r;this.results=s};YSLOW.ResultSet.prototype={getResults:function(){return this.results},getRulesetApplied:function(){return this.ruleset_applied},getOverallScore:function(){return this.overall_score}};YSLOW.view=function(r,w){var u,t,v,q,s;this.panel_doc=r.document;this.buttonViews={};this.curButtonId="";this.panelNode=r.panelNode;this.loadCSS(this.panel_doc);u=this.panel_doc.createElement("div");u.id="toolbarDiv";u.innerHTML=this.getToolbarSource();u.style.display="block";t=this.panel_doc.createElement("div");t.style.display="block";v='

text

';q=this.panel_doc.createElement("div");q.id="dialogDiv";q.innerHTML=v;q.style.display="none";this.modaldlg=q;this.tooltip=new YSLOW.view.Tooltip(this.panel_doc,r.panelNode);s=this.panel_doc.createElement("div");s.id="copyrightDiv";s.innerHTML=YSLOW.doc.copyright;this.copyright=s;if(r.panelNode){r.panelNode.id="yslowDiv";r.panelNode.appendChild(q);r.panelNode.appendChild(u);r.panelNode.appendChild(t);r.panelNode.appendChild(s)}this.viewNode=t;this.viewNode.id="viewDiv";this.viewNode.className="yui-skin-sam";this.yscontext=w;YSLOW.util.addEventListener(this.panelNode,"click",function(F){var A,B,z,G,C;var E=FBL.getContentView(r.document);var D=E.ysview.getElementByTagNameAndId(r.panelNode,"div","toolbarDiv");if(D){B=E.ysview.getElementByTagNameAndId(D,"li","helpLink");if(B){z=B.offsetLeft;G=B.offsetTop;C=B.offsetParent;while(C){z+=C.offsetLeft;G+=C.offsetTop;C=C.offsetParent}if(F.clientX>=z&&F.clientY>=G&&F.clientX"+y.name+"

"+y.info,z.target)}}}});YSLOW.util.addEventListener(this.panelNode,"mouseout",function(y){var x=FBL.getContentView(r.document);x.ysview.tooltip.hide()});YSLOW.util.addEventListener(this.panel_doc.defaultView||this.panel_doc.parentWindow,"resize",function(z){var y=FBL.getContentView(r.document);var x=y.ysview.modaldlg;if(x&&x.style.display==="block"){x.style.display="none"}})};YSLOW.view.prototype={setDocument:function(q){this.panel_doc=q},loadCSS:function(){},addButtonView:function(q,s){var r=this.getButtonView(q);if(!r){r=this.panel_doc.createElement("div");r.style.display="none";this.viewNode.appendChild(r);this.buttonViews[q]=r}r.innerHTML=s;this.showButtonView(q)},clearAllButtonView:function(){var r=this.buttonViews,s=this.viewNode,q=function(t){if(r.hasOwnProperty(t)){s.removeChild(r[t]);delete r[t]}};q("ysPerfButton");q("ysCompsButton");q("ysStatsButton")},showButtonView:function(r){var q,s=this.getButtonView(r);if(!s){YSLOW.util.dump("ERROR: YSLOW.view.showButtonView: Couldn't find ButtonView '"+r+"'.");return}for(q in this.buttonViews){if(this.buttonViews.hasOwnProperty(q)&&q!==r){this.buttonViews[q].style.display="none"}}if(r==="ysPerfButton"){if(this.copyright){this.copyright.style.display="none"}}else{if(this.curButtonId==="ysPerfButton"){if(this.copyright){this.copyright.style.display="block"}}}s.style.display="block";this.curButtonId=r},getButtonView:function(q){return(this.buttonViews.hasOwnProperty(q)?this.buttonViews[q]:undefined)},setButtonView:function(q,s){var r=this.getButtonView(q);if(!r){YSLOW.util.dump("ERROR: YSLOW.view.setButtonView: Couldn't find ButtonView '"+q+"'.");return}r.innerHTML=s;this.showButtonView(q)},setSplashView:function(r,s,t){var w,v="Grade your web pages with YSlow",x="YSlow gives you:",u="
  • Grade based on the performance (you can define your own rules)
  • Summary of the Components in the page
  • Chart with statistics
  • Tools including Smush.It and JSLint
  • ",q="Learn more about YSlow and YDN";if(YSLOW.doc.splash){if(YSLOW.doc.splash.title){v=YSLOW.doc.splash.title}if(YSLOW.doc.splash.content){if(YSLOW.doc.splash.content.header){x=YSLOW.doc.splash.content.header}if(YSLOW.doc.splash.content.text){u=YSLOW.doc.splash.content.text}}if(YSLOW.doc.splash.more_info){q=YSLOW.doc.splash.more_info}}if(typeof t!=="undefined"){YSLOW.hideToolsInfo=t}else{t=YSLOW.hideToolsInfo}if(t){u=u.replace(/
  • Tools[^<]+<\/li>/,"")}w='

    '+v+'

    '+x+'

      '+u+"
    ";if(typeof r!=="undefined"){YSLOW.hideAutoRun=r}else{r=YSLOW.hideAutoRun}if(!r){w+=''}w+='
    ";this.addButtonView("panel_about",w)},genProgressView:function(){var q='

    Finding components in the page:

    Getting component information:

    start...
    ';this.setButtonView("panel_about",q)},updateProgressView:function(q,v){var u,x,y,w,z,r,s,t,A="";if(this.curButtonId==="panel_about"){z=this.getButtonView(this.curButtonId);if(q==="peel"){u=this.getElementByTagNameAndId(z,"div","peelprogress");x=this.getElementByTagNameAndId(z,"div","progbar");y=this.getElementByTagNameAndId(z,"div","progtext");A=v.message;w=(v.current_step*100)/v.total_step}else{if(q==="fetch"){u=this.getElementByTagNameAndId(z,"div","fetchprogress");x=this.getElementByTagNameAndId(z,"div","progbar2");y=this.getElementByTagNameAndId(z,"div","progtext2");A=v.last_component_url;w=(v.current*100)/v.total}else{if(q==="message"){y=this.getElementByTagNameAndId(z,"div","progtext2");if(y){y.innerHTML=v}return}else{return}}}}if(u&&x&&y){r=u.clientWidth;if(w<0){w=0}if(w>100){w=100}w=100-w;s=(r*w)/100;if(s>r){s=r}t=r-parseInt(s,10);x.style.width=parseInt(s,10)+"px";x.style.left=parseInt(t,10)+"px";y.innerHTML=A}},updateStatusBar:function(x){var z,s,A,t,q,r=YSLOW,u=r.util,w=r.view,y=u.Preference,v=this.yscontext;if(!v.PAGE.statusbar){v.PAGE.statusbar=true;if(!v.PAGE.overallScore){r.controller.lint(x,v)}if(!v.PAGE.totalSize){v.collectStats()}z=u.kbSize(v.PAGE.totalSize);s=u.prettyScore(v.PAGE.overallScore);w.setStatusBar(s,"yslow_status_grade");w.setStatusBar(z,"yslow_status_size");if(y.getPref("optinBeacon",false)){t=y.getPref("beaconInfo","basic"),q=y.getPref("beaconUrl","http://rtblab.pclick.yahoo.com/images/ysb.gif");A=u.getResults(v,t);u.sendBeacon(A,t,q)}}},getRulesetListSource:function(q){var u,s,t="",r=YSLOW.controller.getDefaultRulesetId();for(u in q){if(q[u]){t+='"}}return t},updateRulesetList:function(){var u,w,s,t=this.panel_doc.getElementsByTagName("select"),q=YSLOW.controller.getRegisteredRuleset(),r=this.getRulesetListSource(q),v=function(x){var y=FBL.getContentView(this.ownerDocument);y.ysview.onChangeRuleset(x)};for(u=0;uRulesets ";t+='';t+='";t+='";t+="";return t},show:function(r){var s="html",q="";r=r||this.yscontext.defaultview;if(this.yscontext.component_set===null){YSLOW.controller.run(window.top.content,this.yscontext,false);this.yscontext.defaultview=r}else{if(this.getButtonView(r)){this.showButtonView(r)}else{if("ysCompsButton"===r){q+=this.yscontext.genComponents(s);this.addButtonView("ysCompsButton",q)}else{if("ysStatsButton"===r){q+=this.yscontext.genStats(s);this.addButtonView("ysStatsButton",q);YSLOW.renderer.plotComponents(this.getButtonView("ysStatsButton"),this.yscontext)}else{if("ysToolButton"===r){q+=this.yscontext.genToolsView(s);this.addButtonView("ysToolButton",q)}else{q+=this.yscontext.genPerformance(s);this.addButtonView("ysPerfButton",q)}}}}this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateStatusBar(this.yscontext.document);this.updateToolbarSelection()}},updateToolbarSelection:function(){var q,r,s;switch(this.curButtonId){case"ysCompsButton":case"ysPerfButton":case"ysStatsButton":case"ysToolButton":q=this.getElementByTagNameAndId(this.panelNode,"li",this.curButtonId);if(q){if(q.className.indexOf("selected")!==-1){return}else{q.className+=" selected";if(q.previousSibling){q.previousSibling.className+=" off"}}}break;default:break}r=this.getElementByTagNameAndId(this.panelNode,"ul","toolbarLinks");s=r.firstChild;while(s){if(s.id!==this.curButtonId&&s.className.indexOf("selected")!==-1){this.unselect(s);if(s.previousSibling){YSLOW.view.removeClassName(s.previousSibling,"off")}}s=s.nextSibling}},showPerformance:function(){this.show("ysPerfButton")},showStats:function(){this.show("ysStatsButton")},showComponents:function(){this.show("ysCompsButton")},showTools:function(){this.show("ysToolButton")},showRuleSettings:function(){var q=this.yscontext.genRulesetEditView("html");this.addButtonView("ysRuleEditButton",q);this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateToolbarSelection()},runTest:function(){YSLOW.controller.run(window.top.content,this.yscontext,false)},setAutorun:function(q){YSLOW.util.Preference.setPref("extensions.yslow.autorun",q)},setAntiIframe:function(q){YSLOW.antiIframe=q},addCDN:function(z){var t,r,v=this,x=document,A=v.yscontext,B=YSLOW.util.Preference,w=B.getPref("cdnHostnames",""),q=v.panel_doc,s=q.getElementById("tab-label-list"),y=s.getElementsByTagName("li"),u=y.length;if(w){w=w.replace(/\s+/g,"").split(",");w.push(z);w=w.join()}else{w=z}B.setPref("extensions.yslow.cdnHostnames",w);for(t=0;t-1){r=s.id;break}}YSLOW.controller.lint(A.document,A);v.addButtonView("ysPerfButton",A.genPerformance("html"));YSLOW.view.restoreStatusBar(A);v.updateToolbarSelection();s=q.getElementById(r);v.onclickTabLabel({currentTarget:s},true)},onChangeRuleset:function(t){var u,r,v,w,q=YSLOW.util.getCurrentTarget(t),s=q.options[q.selectedIndex];YSLOW.controller.setDefaultRuleset(s.value);u=q.ownerDocument;r="Do you want to run the selected ruleset now?";v="Run Test";w=function(y){var x;u.ysview.closeDialog(u);if(u.yslowContext.component_set===null){YSLOW.controller.run(u.yslowContext.document.defaultView||u.yslowContext.document.parentWindow,u.yslowContext,false)}else{YSLOW.controller.lint(u.yslowContext.document,u.yslowContext)}x=u.yslowContext.genPerformance("html");u.ysview.addButtonView("ysPerfButton",x);u.ysview.panelNode.scrollTop=0;u.ysview.panelNode.scrollLeft=0;YSLOW.view.restoreStatusBar(u.yslowContext);u.ysview.updateToolbarSelection()};this.openDialog(u,389,150,r,undefined,v,w)},onclickTabLabel:function(q,w){var s,r,t,y,A,z,v,B=YSLOW.util.getCurrentTarget(q),x=B.parentNode,u=x.nextSibling;if(B.className.indexOf("selected")!==-1||B.id.indexOf("label")===-1){return false}if(x){s=x.firstChild;while(s){if(this.unselect(s)){r=s.id.substring(5);break}s=s.nextSibling}B.className+=" selected";t=B.id.substring(5);s=u.firstChild;while(s){v=s.id.substring(3);if(!y&&r&&v===r){if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}y=true}if(!A&&t&&v===t){YSLOW.view.removeClassName(s,"yui-hidden");A=true;z=s}if((y||!r)&&(A||!t)){break}s=s.nextSibling}if(w===true&&A===true&&z){this.positionResultTab(z,u,B)}}return false},positionResultTab:function(r,q,w){var u,z,A,v=5,x=this.panel_doc,t=x.defaultView||x.parentWindow,s=t.offsetHeight?t.offsetHeight:t.innerHeight,B=w.offsetTop+r.offsetHeight;q.style.height=B+"px";r.style.position="absolute";r.style.left=w.offsetLeft+w.offsetWidth+"px";r.style.top=w.offsetTop+"px";u=r.offsetTop;z=r.offsetParent;while(z!==null){u+=z.offsetTop;z=z.offsetParent}if(uthis.panelNode.scrollTop+s){if(uu-this.panelNode.scrollTop){A=u-this.panelNode.scrollTop}this.panelNode.scrollTop+=A}}},onclickResult:function(q){YSLOW.util.preventDefault(q);return this.onclickTabLabel(q,true)},unselect:function(q){return YSLOW.view.removeClassName(q,"selected")},filterResult:function(z,q){var v,u,r,w,s,x,t,y=this.getButtonView("ysPerfButton");if(q==="all"){u=true}if(y){v=this.getElementByTagNameAndId(y,"ul","tab-label-list")}if(v){r=v.firstChild;t=v.nextSibling;s=t.firstChild;while(r){YSLOW.view.removeClassName(r,"first");if(u||r.className.indexOf(q)!==-1){r.style.display="block";if(w===undefined){w=s;x=r;YSLOW.view.removeClassName(s,"yui-hidden");r.className+=" first";if(r.className.indexOf("selected")===-1){r.className+=" selected"}r=r.nextSibling;s=s.nextSibling;continue}}else{r.style.display="none"}if(s.className.indexOf("yui-hidden")===-1){s.className+=" yui-hidden"}this.unselect(r);r=r.nextSibling;s=s.nextSibling}if(w){this.positionResultTab(w,t,x)}}},updateFilterSelection:function(s){var q,r=YSLOW.util.getCurrentTarget(s);YSLOW.util.preventDefault(s);if(r.className.indexOf("selected")!==-1){return}r.className+=" selected";q=r.parentNode.firstChild;while(q){if(q!==r&&this.unselect(q)){break}q=q.nextSibling}this.filterResult(r.ownerDocument,r.id)},onclickToolbarMenu:function(q){var u,s=YSLOW.util.getCurrentTarget(q),t=s.parentNode,r=t.parentNode;if(t.className.indexOf("selected")!==-1){return}t.className+=" selected";if(t.previousSibling){t.previousSibling.className+=" off"}if(r){u=r.firstChild;while(u){if(u!==t&&this.unselect(u)){if(u.previousSibling){YSLOW.view.removeClassName(u.previousSibling,"off")}break}u=u.nextSibling}}},expandCollapseComponentType:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.expandCollapseComponentType(u,s,r)}},expandAll:function(t){var r,s=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"table","components-table");s.expandAllComponentType(t,r)}},regenComponentsTable:function(v,u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysCompsButton");if(q){s=this.getElementByTagNameAndId(q,"table","components-table");t.regenComponentsTable(v,s,u,r,this.yscontext.component_set)}},showComponentHeaders:function(s){var r,t,q=this.getButtonView("ysCompsButton");if(q){r=this.getElementByTagNameAndId(q,"tr",s);if(r){t=r.firstChild;if(r.style.display==="none"){r.style.display="table-row"}else{r.style.display="none"}}}},openLink:function(q){YSLOW.util.openLink(q)},openPopup:function(s,r,u,q,t){window.open(s,r||"_blank","width="+(u||626)+",height="+(q||436)+","+(t||"toolbar=0,status=1,location=1,resizable=1"))},runTool:function(q,r){YSLOW.controller.runTool(q,this.yscontext,r)},onclickRuleset:function(v){var s,r,q,u,w=YSLOW.util.getCurrentTarget(v),t=w.className.indexOf("ruleset-");YSLOW.util.preventDefault(v);if(t!==-1){r=w.className.indexOf(" ",t+8);if(r!==-1){s=w.className.substring(t+8,r)}else{s=w.className.substring(t+8)}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form","edit-form");YSLOW.renderer.initRulesetEditForm(w.ownerDocument,u,YSLOW.controller.getRuleset(s))}}return this.onclickTabLabel(v,false)},openSaveAsDialog:function(s,r){var q='',t="Save",u=function(B){var y,w,v,z,x,A=YSLOW.util.getCurrentTarget(B).ownerDocument;if(A.ysview.modaldlg){y=A.ysview.getElementByTagNameAndId(A.ysview.modaldlg,"input","saveas-name")}if(y){if(YSLOW.controller.checkRulesetName(y.value)===true){w=q+'
    '+y.value+" ruleset already exists.
    ";A.ysview.closeDialog(A);A.ysview.openDialog(A,389,150,w,"",t,u)}else{v=A.ysview.getButtonView("ysRuleEditButton");if(v){z=A.ysview.getElementByTagNameAndId(v,"form",r);x=A.createElement("input");x.type="hidden";x.name="saveas-name";x.value=y.value;z.appendChild(x);z.submit()}A.ysview.closeDialog(A)}}};this.openDialog(s,389,150,q,undefined,t,u)},openPrintableDialog:function(t){var s="Please run YSlow first before using Printable View.",r="Check which information you want to view or print
    ",q='
    ',u="Ok",v=function(y){var w,x=YSLOW.util.getCurrentTarget(y).ownerDocument,x=FBL.getContentView(x);aInputs=x.getElementsByName("print-type"),print_type={};for(w=0;w0){for(q=0;q0){if(J[E].className==="dialog-box"){G=J[E]}else{if(J[E].className==="dialog-text"){z=J[E]}else{if(J[E].className==="dialog-more-text"){y=J[E]}}}}}if(H&&G&&z&&y){z.innerHTML=(x?x:"");y.innerHTML=(w?w:"");r=H.getElementsByTagName("input");for(D=0;D0)?s:225)+"px";G.style.top=((A&&A>0)?A:80)+"px";H.style.left=this.panelNode.scrollLeft+"px";H.style.top=this.panelNode.scrollTop+"px";H.style.display="block";if(r.length>0){r[0].focus()}}},closeDialog:function(r){var q=this.modaldlg;q.style.display="none"},saveRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.saveRuleset(u,s)}},deleteRuleset:function(u,r){var s,t=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){s=this.getElementByTagNameAndId(q,"form",r);t.deleteRuleset(u,s)}},shareRuleset:function(v,t){var q,x,u,y,w,r=YSLOW.controller.getRenderer("html"),s=this.getButtonView("ysRuleEditButton");if(s){q=this.getElementByTagNameAndId(s,"form",t);x=r.getEditFormRulesetId(q);u=YSLOW.controller.getRuleset(x);if(u){y=YSLOW.Exporter.exportRuleset(u);if(y){w="";this.openDialog(v,389,150,w,"","Ok")}}}},createRuleset:function(s,r){var q,t,v=s.parentNode,u=v.parentNode,w=u.firstChild;while(w){this.unselect(w);w=w.nextSibling}q=this.getButtonView("ysRuleEditButton");if(q){t=this.getElementByTagNameAndId(q,"form",r);YSLOW.renderer.initRulesetEditForm(this.panel_doc,t)}},showHideHelp:function(){var q,r=this.getElementByTagNameAndId(this.panelNode,"div","toolbarDiv");if(r){q=this.getElementByTagNameAndId(r,"div","helpDiv")}if(q){if(q.style.visibility==="visible"){q.style.visibility="hidden"}else{q.style.visibility="visible"}}},smushIt:function(r,q){YSLOW.util.smushIt(q,function(w){var u,t,v,x,s="";if(w.error){s+="
    "+w.error+"
    "}else{v=YSLOW.util.getSmushUrl();x=YSLOW.util.makeAbsoluteUrl(w.dest,v);s+="
    Original size: "+w.src_size+" bytes
    Result size: "+w.dest_size+" bytes
    % Savings: "+w.percent+"%
    "}u='
    Image: '+YSLOW.util.briefUrl(q,250)+"
    ";t=s;r.ysview.openDialog(r,389,150,u,t,"Ok")})},checkAllRules:function(v,s,r){var t,q,u,w;if(typeof r!=="boolean"){return}q=this.getButtonView("ysRuleEditButton");if(q){u=this.getElementByTagNameAndId(q,"form",s);w=u.elements;for(t=0;tD||H>q){this.tooltip.style.display="none";return}F=w.offsetParent;while(F!==null){B+=F.offsetLeft;A+=F.offsetTop;F=F.offsetParent}B+=w.offsetLeft;A+=w.offsetTop;if(BE.ysview.panelNode.scrollTop+q)){this.tooltip.style.display="none";return}t=B+w.offsetWidth/2;s=A+w.offsetHeight/2;if(B+w.offsetWidth+C+u=E.ysview.panelNode.scrollTop)&&(A-C+H+C<=E.ysview.panelNode.scrollTop+q)){A=A-C;r="right top"}else{A+=w.offsetHeight-H;r="right bottom"}}else{if(A-H-C>=E.ysview.panelNode.scrollTop){A-=H+C;r="top"}else{A+=w.offsetHeight+C;r="bottom"}z=Math.floor(t-u/2);if((z>=E.ysview.panelNode.scrollLeft)&&(z+u<=E.ysview.panelNode.scrollLeft+D)){B=z}else{if(z0&&q&&q.length>0){t=s.className.split(" ");for(r=0;r0){y[q]=w[q]}C+=w[q]}}return{total_size:C,num_requests:r,count_obj:v,size_obj:w,canvas_data:y}},collectStats:function(){var q=this.computeStats();if(q!==undefined){this.PAGE.totalSize=q.total_size;this.PAGE.totalRequests=q.num_requests;this.PAGE.totalObjCount=q.count_obj;this.PAGE.totalObjSize=q.size_obj;this.PAGE.canvas_data.empty=q.canvas_data}q=this.computeStats(true);if(q){this.PAGE.totalSizePrimed=q.total_size;this.PAGE.totalRequestsPrimed=q.num_requests;this.PAGE.totalObjCountPrimed=q.count_obj;this.PAGE.totalObjSizePrimed=q.size_obj;this.PAGE.canvas_data.primed=q.canvas_data}},genPerformance:function(r,q){if(this.result_set===null){if(!q){q=this.document}YSLOW.controller.lint(q,this)}return YSLOW.controller.render(r,"reportcard",{result_set:this.result_set})},genStats:function(r){var q={};if(!this.PAGE.totalSize){this.collectStats()}q.PAGE=this.PAGE;return YSLOW.controller.render(r,"stats",{stats:q})},genComponents:function(q){if(!this.PAGE.totalSize){this.collectStats()}return YSLOW.controller.render(q,"components",{comps:this.component_set.components,total_size:this.PAGE.totalSize})},genToolsView:function(r){var q=YSLOW.Tools.getAllTools();return YSLOW.controller.render(r,"tools",{tools:q})},genRulesetEditView:function(q){return YSLOW.controller.render(q,"rulesetEdit",{rulesets:YSLOW.controller.getRegisteredRuleset()})}};YSLOW.renderer={sortBy:"type",sortDesc:false,bPrintable:false,colors:{doc:"#8963df",redirect:"#FC8C8C",iframe:"#FFDFDF",xhr:"#89631f",flash:"#8D4F5B",js:"#9fd0e8",css:"#aba5eb",cssimage:"#677ab8",image:"#d375cd",favicon:"#a26c00",unknown:"#888888"},reset:function(){this.sortBy="type";this.sortDesc=false},genStats:function(y,z){var v,w,s,r,B,x,q,u,t="",A=0;if(!y.PAGE){return""}if(z){v=y.PAGE.totalObjCountPrimed;w=y.PAGE.totalObjSizePrimed;s=y.PAGE.totalRequestsPrimed;A=y.PAGE.totalSizePrimed}else{v=y.PAGE.totalObjCount;w=y.PAGE.totalObjSize;s=y.PAGE.totalRequests;A=y.PAGE.totalSize}r=YSLOW.peeler.types;B=(z)?"primed":"empty";for(x=0;x
     
    '+v[q]+''+YSLOW.util.prettyType(q)+''+YSLOW.util.kbSize(w[q])+""}}u='
    HTTP Requests - '+s+'
    Total Weight - '+YSLOW.util.kbSize(A)+'
    '+t+"
    ";return u},plotComponents:function(q,r){if(typeof q!=="object"){return}this.plotOne(q,r.PAGE.canvas_data.empty,r.PAGE.totalSize,"comp-canvas-empty");this.plotOne(q,r.PAGE.canvas_data.primed,r.PAGE.totalSizePrimed,"comp-canvas-primed")},plotOne:function(A,t,z,y){var s,u,C,r,x,q,w,D,v,B=A.getElementsByTagName("canvas");for(u=0;u'+YSLOW.util.escapeHtml(q.headers[s])+""}}if(q.req_headers){r+='Request Headers';for(s in q.req_headers){if(q.req_headers.hasOwnProperty(s)&&q.req_headers[s]){r+=''+YSLOW.util.escapeHtml(YSLOW.util.formatHeaderName(s))+'

    '+YSLOW.util.escapeHtml(q.req_headers[s])+"

    "}}}r+="";return r},genComponentRow:function(w,v,r,u){var s,A,t,q,z,y,x;if(typeof r!=="string"){r=""}if(v.status>=400&&v.status<500){r+=" compError"}if(v.after_onload===true){r+=" afteronload"}s="compHeaders"+v.id;A='";for(t in w){if(w.hasOwnProperty(t)){q=t;z="";if(t==="type"){z+=v[t];if(v.is_beacon){z+=" †"}if(v.after_onload){z+=" *"}}else{if(t==="size"){z+=YSLOW.util.kbSize(v.size)}else{if(t==="url"){if(v.status>=400&&v.status<500){A+=''+v[t]+" (status: "+v.status+")";continue}else{z+=YSLOW.util.prettyAnchor(v[t],v[t],undefined,!YSLOW.renderer.bPrintable,100,1,v.type)}}else{if(t==="gzip"&&(v.compressed==="gzip"||v.compressed==="deflate")){z+=(v.size_compressed!==undefined?YSLOW.util.kbSize(v.size_compressed):"uncertain")}else{if(t==="set-cookie"){y=v.getSetCookieSize();z+=y>0?y:""}else{if(t==="cookie"){x=v.getReceivedCookieSize();z+=x>0?x:""}else{if(t==="etag"){z+=v.getEtag()}else{if(t==="expires"){z+=YSLOW.util.prettyExpiresDate(v.expires)}else{if(t==="headers"){if(YSLOW.renderer.bPrintable){continue}if(v.raw_headers&&v.raw_headers.length>0){z+="'}}else{if(t==="action"){if(YSLOW.renderer.bPrintable){continue}if(v.type==="cssimage"||v.type==="image"){if(v.response_type===undefined||v.response_type==="image"){z+="smush.it"}}}else{if(v[t]!==undefined){z+=v[t]}}}}}}}}}}}A+=''+z+""}}A+="";if(v.raw_headers&&v.raw_headers.length>0){A+=''+this.getComponentHeadersTable(v)+""}return A},componentSortCallback:function(q,y){var r,t,u,w="",v="",x=YSLOW.renderer.sortBy,s=YSLOW.renderer.sortDesc;switch(x){case"type":w=q.type;v=y.type;break;case"size":w=q.size?Number(q.size):0;v=y.size?Number(y.size):0;break;case"gzip":w=q.size_compressed?Number(q.size_compressed):0;v=y.size_compressed?Number(y.size_compressed):0;break;case"set-cookie":w=q.getSetCookieSize();v=y.getSetCookieSize();break;case"cookie":w=q.getReceivedCookieSize();v=y.getReceivedCookieSize();break;case"headers":break;case"url":w=q.url;v=y.url;break;case"respTime":w=q.respTime?Number(q.respTime):0;v=y.respTime?Number(y.respTime):0;break;case"etag":w=q.getEtag();v=y.getEtag();break;case"action":if(q.type==="cssimage"||q.type==="image"){w="smush.it"}if(y.type==="cssimage"||y.type==="image"){v="smush.it"}break;case"expires":w=q.expires||0;v=y.expires||0;break}if(w===v){if(q.id>y.id){return(s)?-1:1}if(q.idv){return(s)?-1:1}if(w',v='
    ',t='
    ';for(q in A){if(A.hasOwnProperty(q)&&A[q]){y=A[q];s='
    ";if(z.rules[q]!==undefined){B+=1}if(z.weights!==undefined&&z.weights[q]!==undefined){w+=''}r=(u%3);switch(r){case 0:x+=s;break;case 1:v+=s;break;case 2:t+=s;break}u+=1}}x+="
    ";v+="
    ";t+="";return'

    '+z.name+' Ruleset (includes '+parseInt(B,10)+" of "+parseInt(u,10)+' rules)

    '+x+""+v+""+t+'
    '+w+"
    "},genRulesetEditForm:function(q){var r="";r+='
    '+YSLOW.renderer.genRulesCheckbox(q)+'
    ';return r},initRulesetEditForm:function(I,r,D){var C,F,E,B,G,K,w,J,v,y,q,u,A,s=r.elements,t="",z=[],x=0,H=0;for(F=0;F'}x+=1}}q.innerHTML="(includes "+parseInt(x,10)+" of "+parseInt(H,10)+" rules)";K.innerHTML='';w.innerHTML='';J.innerHTML=D.name}else{K.innerHTML="";w.innerHTML="";J.innerHTML="New";q.innerHTML=""}v.innerHTML=t}};YSLOW.registerRenderer({id:"html",supports:{components:1,reportcard:1,stats:1,tools:1,rulesetEdit:1},genComponentsTable:function(r,C,v){var A,y,B,z,u={type:"TYPE",size:"SIZE
    (KB)",gzip:"GZIP
    (KB)","set-cookie":"COOKIE RECEIVED
    (bytes)",cookie:"COOKIE SENT
    (bytes)",headers:"HEADERS",url:"URL",expires:"EXPIRES
    (Y/M/D)",respTime:"RESPONSE
    TIME (ms)",etag:"ETAG",action:"ACTION"},x=false,t="",w="",q=0,s=0;if(C!==undefined&&u[C]===undefined){return""}if(YSLOW.renderer.bPrintable){C=YSLOW.renderer.sortBy;v=YSLOW.renderer.sortDesc}else{if(C===undefined||C==="type"){C="type";x=true}}r=YSLOW.renderer.sortComponents(r,C,v);t+='';for(A in u){if(u.hasOwnProperty(A)&&u[A]){if(YSLOW.renderer.bPrintable&&(A==="action"||A==="components"||A==="headers")){continue}t+="'+(C===A?(v?"↓":"↑"):"")+" "+u[A]+""}}}t+="";for(y=0;y";t+=w;w="";q=0;s=0;B=z.type}}w+=YSLOW.renderer.genComponentRow(u,z,(q%2===0?"even":"odd"),x);q+=1;s+=z.size}else{t+=YSLOW.renderer.genComponentRow(u,z,(y%2===0?"even":"odd"),false)}}if(w.length>0){t+='";t+=w}t+="
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    '+B+" ("+q+')'+YSLOW.util.kbSize(s)+"
    ";return t},componentsView:function(w,r){var t,s=this.genComponentsTable(w,YSLOW.renderer.sortBy,false),u="in type column indicates the component is loaded after window onload event.",q="denotes 1x1 pixels image that may be image beacon",v="Components";if(YSLOW.doc){if(YSLOW.doc.components_legend){if(YSLOW.doc.components_legend.beacon){u=YSLOW.doc.components_legend.beacon}if(YSLOW.doc.components_legend.after_onload){q=YSLOW.doc.components_legend.after_onload}}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.components){v=YSLOW.doc.view_names.components}}t='
    '+v+'The page has a total of '+w.length+' components and a total weight of '+YSLOW.util.kbSize(r)+' bytes
    '+s+'
    * '+u+"
    † "+q+"
    ";return t},reportcardPrintableView:function(t,r,w){var u,s,y,q,x,v='
    ";for(u=0;u"}}v+="
    Overall Grade: '+r+" (Ruleset applied: "+w.name+")
    '+q+'

    '+y.name+'

    '+y.message+"
    ";if(y.components&&y.components.length>0){v+='
      ';for(s=0;s"+y.components[s]+""}else{if(y.components[s].url!==undefined){v+="
    • "+YSLOW.util.briefUrl(y.components[s].url,60)+"
    • "}}}v+="

    "}v+="

    ";return v},getFilterCode:function(x,u,s,q){var w,r,v,y,B,C,t,A=u.length,z=[];for(r in x){if(x.hasOwnProperty(r)&&x[r]){z.push(r)}}z.sort();w='
    • ALL ('+A+')
    • FILTER BY:
    • ';for(v=0,y=z.length;v'+z[v].toUpperCase()+" ("+x[z[v]]+")"}B="http://yslow.org/scoremeter/?url="+encodeURIComponent(q)+"&grade="+s;for(v=0;v=0&&t<100){B+="&"+C.rule_id.toLowerCase()+"="+t}}B=encodeURIComponent(encodeURIComponent(B));q=encodeURIComponent(encodeURIComponent(q.slice(0,60)+(q.length>60?"...":"")));w+='";w+='";w+="
    ";return w},reportcardView:function(s){var w,H,F,E,x,r,v,L,B,I,K,J,q,u,y='
    ',G=s.getRulesetApplied(),A=s.getResults(),t=s.url,M="Grade",D="",C="",z={};if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.grade){M=YSLOW.doc.view_names.grade}}w=YSLOW.util.prettyScore(s.getOverallScore());if(YSLOW.renderer.bPrintable){return this.reportcardPrintableView(A,w,G)}y+='
    '+M+'
    '+w+'
    Overall performance score '+Math.round(s.getOverallScore())+'Ruleset applied: '+G.name+'URL: '+YSLOW.util.briefUrl(t,100)+"
    ";for(H=0;H0){L+=" "}L+=x.category[E];if(z[x.category[E]]===undefined){z[x.category[E]]=0}z[x.category[E]]+=1}}if(L.length>0){D+=' class="'+L+'"'}D+=' onclick="javascript:document.ysview.onclickResult(event)">
    '+r+''+x.name+"
  • ";C+='
    ")}C+='">

    Grade '+r+" on "+x.name+"

    "+x.message+"
    ";if(x.components&&x.components.length>0){C+='

      ';for(F=0;F"+J+""}else{if(J.url!==undefined){C+="
    • ";q=x.rule_id.toLowerCase();if(x.rule_id.match("expires")){C+="("+YSLOW.util.prettyExpiresDate(J.expires)+") "}C+=YSLOW.util.prettyAnchor(J.url,J.url,undefined,true,120,undefined,J.type)+"
    • "}}}C+="

    "}C+="

    ";u=YSLOW.controller.getRule(x.rule_id);if(u){C+='

    '+(u.info||"** To be added **")+"

    ";if(u.url!==undefined){C+='

    »Read More

    "}}C+="
    "}}y+='
    '+this.getFilterCode(z,A,w,t)+'
      '+D+'
    '+C+'
    '+YSLOW.doc.copyright+"
    ";return y},statsView:function(r){var q="",s="Stats";if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.stats){s=YSLOW.doc.view_names.stats}}q+='
    '+s+'The page has a total of '+r.PAGE.totalRequests+' HTTP requests and a total weight of '+YSLOW.util.kbSize(r.PAGE.totalSize)+" bytes with empty cache
    ";q+='
    WEIGHT GRAPHS
    ';q+='
    Empty Cache
    '+YSLOW.renderer.genStats(r,false)+"
    ";q+='
    Primed Cache
    '+YSLOW.renderer.genStats(r,true)+"
    ";q+="
    ";return q},toolsView:function(u){var t,s,r,q="",w="Tools",v="Click the Launch Tool link next to the tool you want to run to start the tool.";if(YSLOW.doc){if(YSLOW.doc.tools_desc){v=YSLOW.doc.tools_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.tools){w=YSLOW.doc.view_names.tools}}for(t=0;t"}q+="
    "+r.name+"-"+(r.short_desc||"Short text here explaining what are the main benefits of running this App")+"
    ";s='
    '+w+""+v+'
    '+q+"
    ";return s},rulesetEditView:function(D){var s,B,u,t,w='
    ',C,z,y=0,r=false,q,v,A="Rule Settings",x="Choose which ruleset better fit your specific needs. You can Save As an existing rule, based on an existing ruleset.";if(YSLOW.doc){if(YSLOW.doc.rulesettings_desc){x=YSLOW.doc.rulesettings_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.rulesetedit){A=YSLOW.doc.view_names.rulesetedit}}v=YSLOW.controller.getDefaultRulesetId();C='
    • STANDARD SETS
    • ';for(s in D){if(D.hasOwnProperty(s)&&D[s]){B=D[s];u="tab"+y;if(!r&&B.custom===true){C+='
    • CUSTOM SETS
    • ';r=true}C+='
    • '+B.name+"
    • ";y+=1}}C+='
    ';z='
    '+YSLOW.renderer.genRulesetEditForm(q)+"
    ";w+=C+z;t='
    '+A+""+x+"
    "+w+"
    ";return t},rulesetEditUpdateTab:function(I,q,C,r,A){var s,B,F,u,z,G,D,x,t,y,H,E,v,w=q.parentNode.parentNode.parentNode;if(w&&w.id==="settingsDiv"&&C.custom===true){s=w.firstChild;B=s.nextSibling;if(r<1){F=s.firstChild;while(F){u=F.className.indexOf("ruleset-");if(u!==-1){z=F.className.substring(u+8);u=z.indexOf(" ");if(u!==-1){z=z.substring(0,u)}if(C.id===z){u=F.id.indexOf("label");if(u!==-1){G=F.id.substring(u+5);if(F.className.indexOf("selected")!==-1){D={};D.currentTarget=H;I.ysview.onclickRuleset(D)}if(F.previousSibling&&F.previousSibling.id==="custom-set-title"&&F.nextSibling&&F.nextSibling.id==="create-ruleset"){x=F.previousSibling}s.removeChild(F);if(x){s.removeChild(x)}}break}else{H=F}}F=F.nextSibling}}else{F=s.lastChild;while(F){y=F.id.indexOf("label");if(y!==-1){t=F.id.substring(y+5);break}F=F.previousSibling}t=Number(t)+1;F=I.createElement("li");F.className="ruleset-"+C.id;F.id="label"+t;F.onclick=function(J){I.ysview.onclickRuleset(J)};F.innerHTML=''+C.name+"";s.insertBefore(F,s.lastChild);E=s.firstChild;while(E){if(E.id&&E.id==="custom-set-title"){x=E;break}E=E.nextSibling}if(!x){x=I.createElement("li");x.className="new-section header";x.id="custom-set-title";x.innerHTML="CUSTOM SETS";s.insertBefore(x,F)}if(A){v={};v.currentTarget=F;I.ysview.onclickRuleset(v)}}}},hasClassName:function(t,q){var r,s=t.split(" ");if(s){for(r=0;r";s+=""+u[t].type+"";s+=""+u[t].size+"";if(u[t].compressed===false){s+=""}else{s+=""+(u[t].size_compressed!==undefined?parseInt(u[t].size_compressed,10):"uncertain")+""}q=u[t].getSetCookieSize();if(q>0){s+=""+parseInt(q,10)+""}q=u[t].getReceivedCookieSize();if(q>0){s+=""+parseInt(q,10)+""}s+=""+encodeURI(u[t].url)+"";s+=""+u[t].expires+"";s+=""+u[t].respTime+"";s+=""+u[t].getEtag()+"";s+=""}s+="";return s},reportcardView:function(w){var t,r,y,u=w.getOverallScore(),s=YSLOW.util.prettyScore(u),x=w.getRulesetApplied(),v=w.getResults(),q='';q+='';for(t=0;t';q+=""+y.message+"";if(v.components&&v.components.length>0){q+="";for(r=0;r"+y.components[r]+""}else{if(y.components[r].url!==undefined){q+=""+y.components[r].url+""}}}q+=""}q+=""}q+="";return q},statsView:function(t){var s,w,r,v='',u='',q=YSLOW.peeler.types;for(s=0;s'}if((t.PAGE.totalObjCount[w])!==undefined){u+=''}}v+="";u+="";r=''+v+u+"";return r}});YSLOW.peeler={types:["doc","js","css","iframe","flash","cssimage","image","favicon","xhr","redirect","font"],NODETYPE:{ELEMENT:1,DOCUMENT:9},CSSRULE:{IMPORT_RULE:3,FONT_FACE_RULE:5},peel:function(q,r){},findDocuments:function(r){var y,B,u,z,v,w,q,C,A,s={};YSLOW.util.event.fire("peelProgress",{total_step:7,current_step:1,message:"Finding documents"});if(!r){return}if(!YSLOW.util.Preference.getPref("extensions.yslow.getFramesComponents",true)){s[r.URL]={document:r,type:"doc"};return s}z="doc";if(r.nodeType===this.NODETYPE.DOCUMENT){B=r;u=r.URL}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="frame"){B=r.contentDocument;u=r.src}else{if(r.nodeType===this.NODETYPE.ELEMENT&&r.nodeName.toLowerCase()==="iframe"){B=r.contentDocument;u=r.src;z="iframe";try{A=r.contentWindow;A=A&&A.parent;A=A&&A.document;A=A||r.ownerDocument;if(A&&A.URL===u){u=!r.getAttribute("src")?"":"about:blank"}}catch(t){YSLOW.util.dump(t)}}else{return s}}}s[u]={document:B,type:z};try{y=B.getElementsByTagName("iframe");for(v=0,w=y.length;v0){for(s=0;s0){for(s=0;s '/php-file-iterator/Iterator.php', - 'file_iterator_facade' => '/php-file-iterator/Iterator/Facade.php', - 'file_iterator_factory' => '/php-file-iterator/Iterator/Factory.php', - 'php_codecoverage' => '/php-code-coverage/CodeCoverage.php', - 'php_codecoverage_driver' => '/php-code-coverage/CodeCoverage/Driver.php', - 'php_codecoverage_driver_hhvm' => '/php-code-coverage/CodeCoverage/Driver/HHVM.php', - 'php_codecoverage_driver_xdebug' => '/php-code-coverage/CodeCoverage/Driver/Xdebug.php', - 'php_codecoverage_exception' => '/php-code-coverage/CodeCoverage/Exception.php', - 'php_codecoverage_exception_unintentionallycoveredcode' => '/php-code-coverage/CodeCoverage/Exception/UnintentionallyCoveredCode.php', - 'php_codecoverage_filter' => '/php-code-coverage/CodeCoverage/Filter.php', - 'php_codecoverage_report_clover' => '/php-code-coverage/CodeCoverage/Report/Clover.php', - 'php_codecoverage_report_crap4j' => '/php-code-coverage/CodeCoverage/Report/Crap4j.php', - 'php_codecoverage_report_factory' => '/php-code-coverage/CodeCoverage/Report/Factory.php', - 'php_codecoverage_report_html' => '/php-code-coverage/CodeCoverage/Report/HTML.php', - 'php_codecoverage_report_html_renderer' => '/php-code-coverage/CodeCoverage/Report/HTML/Renderer.php', - 'php_codecoverage_report_html_renderer_dashboard' => '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Dashboard.php', - 'php_codecoverage_report_html_renderer_directory' => '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Directory.php', - 'php_codecoverage_report_html_renderer_file' => '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/File.php', - 'php_codecoverage_report_node' => '/php-code-coverage/CodeCoverage/Report/Node.php', - 'php_codecoverage_report_node_directory' => '/php-code-coverage/CodeCoverage/Report/Node/Directory.php', - 'php_codecoverage_report_node_file' => '/php-code-coverage/CodeCoverage/Report/Node/File.php', - 'php_codecoverage_report_node_iterator' => '/php-code-coverage/CodeCoverage/Report/Node/Iterator.php', - 'php_codecoverage_report_php' => '/php-code-coverage/CodeCoverage/Report/PHP.php', - 'php_codecoverage_report_text' => '/php-code-coverage/CodeCoverage/Report/Text.php', - 'php_codecoverage_report_xml' => '/php-code-coverage/CodeCoverage/Report/XML.php', - 'php_codecoverage_report_xml_directory' => '/php-code-coverage/CodeCoverage/Report/XML/Directory.php', - 'php_codecoverage_report_xml_file' => '/php-code-coverage/CodeCoverage/Report/XML/File.php', - 'php_codecoverage_report_xml_file_coverage' => '/php-code-coverage/CodeCoverage/Report/XML/File/Coverage.php', - 'php_codecoverage_report_xml_file_method' => '/php-code-coverage/CodeCoverage/Report/XML/File/Method.php', - 'php_codecoverage_report_xml_file_report' => '/php-code-coverage/CodeCoverage/Report/XML/File/Report.php', - 'php_codecoverage_report_xml_file_unit' => '/php-code-coverage/CodeCoverage/Report/XML/File/Unit.php', - 'php_codecoverage_report_xml_node' => '/php-code-coverage/CodeCoverage/Report/XML/Node.php', - 'php_codecoverage_report_xml_project' => '/php-code-coverage/CodeCoverage/Report/XML/Project.php', - 'php_codecoverage_report_xml_tests' => '/php-code-coverage/CodeCoverage/Report/XML/Tests.php', - 'php_codecoverage_report_xml_totals' => '/php-code-coverage/CodeCoverage/Report/XML/Totals.php', - 'php_codecoverage_util' => '/php-code-coverage/CodeCoverage/Util.php', - 'php_codecoverage_util_invalidargumenthelper' => '/php-code-coverage/CodeCoverage/Util/InvalidArgumentHelper.php', - 'php_invoker' => '/php-invoker/Invoker.php', - 'php_invoker_timeoutexception' => '/php-invoker/Invoker/TimeoutException.php', - 'php_timer' => '/php-timer/Timer.php', - 'php_token' => '/php-token-stream/Token.php', - 'php_token_abstract' => '/php-token-stream/Token.php', - 'php_token_ampersand' => '/php-token-stream/Token.php', - 'php_token_and_equal' => '/php-token-stream/Token.php', - 'php_token_array' => '/php-token-stream/Token.php', - 'php_token_array_cast' => '/php-token-stream/Token.php', - 'php_token_as' => '/php-token-stream/Token.php', - 'php_token_at' => '/php-token-stream/Token.php', - 'php_token_backtick' => '/php-token-stream/Token.php', - 'php_token_bad_character' => '/php-token-stream/Token.php', - 'php_token_bool_cast' => '/php-token-stream/Token.php', - 'php_token_boolean_and' => '/php-token-stream/Token.php', - 'php_token_boolean_or' => '/php-token-stream/Token.php', - 'php_token_break' => '/php-token-stream/Token.php', - 'php_token_callable' => '/php-token-stream/Token.php', - 'php_token_caret' => '/php-token-stream/Token.php', - 'php_token_case' => '/php-token-stream/Token.php', - 'php_token_catch' => '/php-token-stream/Token.php', - 'php_token_character' => '/php-token-stream/Token.php', - 'php_token_class' => '/php-token-stream/Token.php', - 'php_token_class_c' => '/php-token-stream/Token.php', - 'php_token_class_name_constant' => '/php-token-stream/Token.php', - 'php_token_clone' => '/php-token-stream/Token.php', - 'php_token_close_bracket' => '/php-token-stream/Token.php', - 'php_token_close_curly' => '/php-token-stream/Token.php', - 'php_token_close_square' => '/php-token-stream/Token.php', - 'php_token_close_tag' => '/php-token-stream/Token.php', - 'php_token_colon' => '/php-token-stream/Token.php', - 'php_token_comma' => '/php-token-stream/Token.php', - 'php_token_comment' => '/php-token-stream/Token.php', - 'php_token_concat_equal' => '/php-token-stream/Token.php', - 'php_token_const' => '/php-token-stream/Token.php', - 'php_token_constant_encapsed_string' => '/php-token-stream/Token.php', - 'php_token_continue' => '/php-token-stream/Token.php', - 'php_token_curly_open' => '/php-token-stream/Token.php', - 'php_token_dec' => '/php-token-stream/Token.php', - 'php_token_declare' => '/php-token-stream/Token.php', - 'php_token_default' => '/php-token-stream/Token.php', - 'php_token_dir' => '/php-token-stream/Token.php', - 'php_token_div' => '/php-token-stream/Token.php', - 'php_token_div_equal' => '/php-token-stream/Token.php', - 'php_token_dnumber' => '/php-token-stream/Token.php', - 'php_token_do' => '/php-token-stream/Token.php', - 'php_token_doc_comment' => '/php-token-stream/Token.php', - 'php_token_dollar' => '/php-token-stream/Token.php', - 'php_token_dollar_open_curly_braces' => '/php-token-stream/Token.php', - 'php_token_dot' => '/php-token-stream/Token.php', - 'php_token_double_arrow' => '/php-token-stream/Token.php', - 'php_token_double_cast' => '/php-token-stream/Token.php', - 'php_token_double_colon' => '/php-token-stream/Token.php', - 'php_token_double_quotes' => '/php-token-stream/Token.php', - 'php_token_echo' => '/php-token-stream/Token.php', - 'php_token_else' => '/php-token-stream/Token.php', - 'php_token_elseif' => '/php-token-stream/Token.php', - 'php_token_empty' => '/php-token-stream/Token.php', - 'php_token_encapsed_and_whitespace' => '/php-token-stream/Token.php', - 'php_token_end_heredoc' => '/php-token-stream/Token.php', - 'php_token_enddeclare' => '/php-token-stream/Token.php', - 'php_token_endfor' => '/php-token-stream/Token.php', - 'php_token_endforeach' => '/php-token-stream/Token.php', - 'php_token_endif' => '/php-token-stream/Token.php', - 'php_token_endswitch' => '/php-token-stream/Token.php', - 'php_token_endwhile' => '/php-token-stream/Token.php', - 'php_token_equal' => '/php-token-stream/Token.php', - 'php_token_eval' => '/php-token-stream/Token.php', - 'php_token_exclamation_mark' => '/php-token-stream/Token.php', - 'php_token_exit' => '/php-token-stream/Token.php', - 'php_token_extends' => '/php-token-stream/Token.php', - 'php_token_file' => '/php-token-stream/Token.php', - 'php_token_final' => '/php-token-stream/Token.php', - 'php_token_finally' => '/php-token-stream/Token.php', - 'php_token_for' => '/php-token-stream/Token.php', - 'php_token_foreach' => '/php-token-stream/Token.php', - 'php_token_func_c' => '/php-token-stream/Token.php', - 'php_token_function' => '/php-token-stream/Token.php', - 'php_token_global' => '/php-token-stream/Token.php', - 'php_token_goto' => '/php-token-stream/Token.php', - 'php_token_gt' => '/php-token-stream/Token.php', - 'php_token_halt_compiler' => '/php-token-stream/Token.php', - 'php_token_if' => '/php-token-stream/Token.php', - 'php_token_implements' => '/php-token-stream/Token.php', - 'php_token_inc' => '/php-token-stream/Token.php', - 'php_token_include' => '/php-token-stream/Token.php', - 'php_token_include_once' => '/php-token-stream/Token.php', - 'php_token_includes' => '/php-token-stream/Token.php', - 'php_token_inline_html' => '/php-token-stream/Token.php', - 'php_token_instanceof' => '/php-token-stream/Token.php', - 'php_token_insteadof' => '/php-token-stream/Token.php', - 'php_token_int_cast' => '/php-token-stream/Token.php', - 'php_token_interface' => '/php-token-stream/Token.php', - 'php_token_is_equal' => '/php-token-stream/Token.php', - 'php_token_is_greater_or_equal' => '/php-token-stream/Token.php', - 'php_token_is_identical' => '/php-token-stream/Token.php', - 'php_token_is_not_equal' => '/php-token-stream/Token.php', - 'php_token_is_not_identical' => '/php-token-stream/Token.php', - 'php_token_is_smaller_or_equal' => '/php-token-stream/Token.php', - 'php_token_isset' => '/php-token-stream/Token.php', - 'php_token_line' => '/php-token-stream/Token.php', - 'php_token_list' => '/php-token-stream/Token.php', - 'php_token_lnumber' => '/php-token-stream/Token.php', - 'php_token_logical_and' => '/php-token-stream/Token.php', - 'php_token_logical_or' => '/php-token-stream/Token.php', - 'php_token_logical_xor' => '/php-token-stream/Token.php', - 'php_token_lt' => '/php-token-stream/Token.php', - 'php_token_method_c' => '/php-token-stream/Token.php', - 'php_token_minus' => '/php-token-stream/Token.php', - 'php_token_minus_equal' => '/php-token-stream/Token.php', - 'php_token_mod_equal' => '/php-token-stream/Token.php', - 'php_token_mul_equal' => '/php-token-stream/Token.php', - 'php_token_mult' => '/php-token-stream/Token.php', - 'php_token_namespace' => '/php-token-stream/Token.php', - 'php_token_new' => '/php-token-stream/Token.php', - 'php_token_ns_c' => '/php-token-stream/Token.php', - 'php_token_ns_separator' => '/php-token-stream/Token.php', - 'php_token_num_string' => '/php-token-stream/Token.php', - 'php_token_object_cast' => '/php-token-stream/Token.php', - 'php_token_object_operator' => '/php-token-stream/Token.php', - 'php_token_open_bracket' => '/php-token-stream/Token.php', - 'php_token_open_curly' => '/php-token-stream/Token.php', - 'php_token_open_square' => '/php-token-stream/Token.php', - 'php_token_open_tag' => '/php-token-stream/Token.php', - 'php_token_open_tag_with_echo' => '/php-token-stream/Token.php', - 'php_token_or_equal' => '/php-token-stream/Token.php', - 'php_token_paamayim_nekudotayim' => '/php-token-stream/Token.php', - 'php_token_percent' => '/php-token-stream/Token.php', - 'php_token_pipe' => '/php-token-stream/Token.php', - 'php_token_plus' => '/php-token-stream/Token.php', - 'php_token_plus_equal' => '/php-token-stream/Token.php', - 'php_token_print' => '/php-token-stream/Token.php', - 'php_token_private' => '/php-token-stream/Token.php', - 'php_token_protected' => '/php-token-stream/Token.php', - 'php_token_public' => '/php-token-stream/Token.php', - 'php_token_question_mark' => '/php-token-stream/Token.php', - 'php_token_require' => '/php-token-stream/Token.php', - 'php_token_require_once' => '/php-token-stream/Token.php', - 'php_token_return' => '/php-token-stream/Token.php', - 'php_token_semicolon' => '/php-token-stream/Token.php', - 'php_token_sl' => '/php-token-stream/Token.php', - 'php_token_sl_equal' => '/php-token-stream/Token.php', - 'php_token_sr' => '/php-token-stream/Token.php', - 'php_token_sr_equal' => '/php-token-stream/Token.php', - 'php_token_start_heredoc' => '/php-token-stream/Token.php', - 'php_token_static' => '/php-token-stream/Token.php', - 'php_token_stream' => '/php-token-stream/Token/Stream.php', - 'php_token_stream_cachingfactory' => '/php-token-stream/Token/Stream/CachingFactory.php', - 'php_token_string' => '/php-token-stream/Token.php', - 'php_token_string_cast' => '/php-token-stream/Token.php', - 'php_token_string_varname' => '/php-token-stream/Token.php', - 'php_token_switch' => '/php-token-stream/Token.php', - 'php_token_throw' => '/php-token-stream/Token.php', - 'php_token_tilde' => '/php-token-stream/Token.php', - 'php_token_trait' => '/php-token-stream/Token.php', - 'php_token_trait_c' => '/php-token-stream/Token.php', - 'php_token_try' => '/php-token-stream/Token.php', - 'php_token_unset' => '/php-token-stream/Token.php', - 'php_token_unset_cast' => '/php-token-stream/Token.php', - 'php_token_use' => '/php-token-stream/Token.php', - 'php_token_var' => '/php-token-stream/Token.php', - 'php_token_variable' => '/php-token-stream/Token.php', - 'php_token_while' => '/php-token-stream/Token.php', - 'php_token_whitespace' => '/php-token-stream/Token.php', - 'php_token_xor_equal' => '/php-token-stream/Token.php', - 'php_token_yield' => '/php-token-stream/Token.php', - 'php_tokenwithscope' => '/php-token-stream/Token.php', - 'php_tokenwithscopeandvisibility' => '/php-token-stream/Token.php', - 'phpunit_exception' => '/phpunit/Exception.php', - 'phpunit_extensions_database_abstracttester' => '/dbunit/Extensions/Database/AbstractTester.php', - 'phpunit_extensions_database_constraint_datasetisequal' => '/dbunit/Extensions/Database/Constraint/DataSetIsEqual.php', - 'phpunit_extensions_database_constraint_tableisequal' => '/dbunit/Extensions/Database/Constraint/TableIsEqual.php', - 'phpunit_extensions_database_constraint_tablerowcount' => '/dbunit/Extensions/Database/Constraint/TableRowCount.php', - 'phpunit_extensions_database_dataset_abstractdataset' => '/dbunit/Extensions/Database/DataSet/AbstractDataSet.php', - 'phpunit_extensions_database_dataset_abstracttable' => '/dbunit/Extensions/Database/DataSet/AbstractTable.php', - 'phpunit_extensions_database_dataset_abstracttablemetadata' => '/dbunit/Extensions/Database/DataSet/AbstractTableMetaData.php', - 'phpunit_extensions_database_dataset_abstractxmldataset' => '/dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.php', - 'phpunit_extensions_database_dataset_compositedataset' => '/dbunit/Extensions/Database/DataSet/CompositeDataSet.php', - 'phpunit_extensions_database_dataset_csvdataset' => '/dbunit/Extensions/Database/DataSet/CsvDataSet.php', - 'phpunit_extensions_database_dataset_datasetfilter' => '/dbunit/Extensions/Database/DataSet/DataSetFilter.php', - 'phpunit_extensions_database_dataset_defaultdataset' => '/dbunit/Extensions/Database/DataSet/DefaultDataSet.php', - 'phpunit_extensions_database_dataset_defaulttable' => '/dbunit/Extensions/Database/DataSet/DefaultTable.php', - 'phpunit_extensions_database_dataset_defaulttableiterator' => '/dbunit/Extensions/Database/DataSet/DefaultTableIterator.php', - 'phpunit_extensions_database_dataset_defaulttablemetadata' => '/dbunit/Extensions/Database/DataSet/DefaultTableMetaData.php', - 'phpunit_extensions_database_dataset_flatxmldataset' => '/dbunit/Extensions/Database/DataSet/FlatXmlDataSet.php', - 'phpunit_extensions_database_dataset_idataset' => '/dbunit/Extensions/Database/DataSet/IDataSet.php', - 'phpunit_extensions_database_dataset_ipersistable' => '/dbunit/Extensions/Database/DataSet/IPersistable.php', - 'phpunit_extensions_database_dataset_ispec' => '/dbunit/Extensions/Database/DataSet/ISpec.php', - 'phpunit_extensions_database_dataset_itable' => '/dbunit/Extensions/Database/DataSet/ITable.php', - 'phpunit_extensions_database_dataset_itableiterator' => '/dbunit/Extensions/Database/DataSet/ITableIterator.php', - 'phpunit_extensions_database_dataset_itablemetadata' => '/dbunit/Extensions/Database/DataSet/ITableMetaData.php', - 'phpunit_extensions_database_dataset_iyamlparser' => '/dbunit/Extensions/Database/DataSet/IYamlParser.php', - 'phpunit_extensions_database_dataset_mysqlxmldataset' => '/dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.php', - 'phpunit_extensions_database_dataset_persistors_abstract' => '/dbunit/Extensions/Database/DataSet/Persistors/Abstract.php', - 'phpunit_extensions_database_dataset_persistors_factory' => '/dbunit/Extensions/Database/DataSet/Persistors/Factory.php', - 'phpunit_extensions_database_dataset_persistors_flatxml' => '/dbunit/Extensions/Database/DataSet/Persistors/FlatXml.php', - 'phpunit_extensions_database_dataset_persistors_mysqlxml' => '/dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.php', - 'phpunit_extensions_database_dataset_persistors_xml' => '/dbunit/Extensions/Database/DataSet/Persistors/Xml.php', - 'phpunit_extensions_database_dataset_persistors_yaml' => '/dbunit/Extensions/Database/DataSet/Persistors/Yaml.php', - 'phpunit_extensions_database_dataset_querydataset' => '/dbunit/Extensions/Database/DataSet/QueryDataSet.php', - 'phpunit_extensions_database_dataset_querytable' => '/dbunit/Extensions/Database/DataSet/QueryTable.php', - 'phpunit_extensions_database_dataset_replacementdataset' => '/dbunit/Extensions/Database/DataSet/ReplacementDataSet.php', - 'phpunit_extensions_database_dataset_replacementtable' => '/dbunit/Extensions/Database/DataSet/ReplacementTable.php', - 'phpunit_extensions_database_dataset_replacementtableiterator' => '/dbunit/Extensions/Database/DataSet/ReplacementTableIterator.php', - 'phpunit_extensions_database_dataset_specs_csv' => '/dbunit/Extensions/Database/DataSet/Specs/Csv.php', - 'phpunit_extensions_database_dataset_specs_dbquery' => '/dbunit/Extensions/Database/DataSet/Specs/DbQuery.php', - 'phpunit_extensions_database_dataset_specs_dbtable' => '/dbunit/Extensions/Database/DataSet/Specs/DbTable.php', - 'phpunit_extensions_database_dataset_specs_factory' => '/dbunit/Extensions/Database/DataSet/Specs/Factory.php', - 'phpunit_extensions_database_dataset_specs_flatxml' => '/dbunit/Extensions/Database/DataSet/Specs/FlatXml.php', - 'phpunit_extensions_database_dataset_specs_ifactory' => '/dbunit/Extensions/Database/DataSet/Specs/IFactory.php', - 'phpunit_extensions_database_dataset_specs_xml' => '/dbunit/Extensions/Database/DataSet/Specs/Xml.php', - 'phpunit_extensions_database_dataset_specs_yaml' => '/dbunit/Extensions/Database/DataSet/Specs/Yaml.php', - 'phpunit_extensions_database_dataset_symfonyyamlparser' => '/dbunit/Extensions/Database/DataSet/SymfonyYamlParser.php', - 'phpunit_extensions_database_dataset_tablefilter' => '/dbunit/Extensions/Database/DataSet/TableFilter.php', - 'phpunit_extensions_database_dataset_tablemetadatafilter' => '/dbunit/Extensions/Database/DataSet/TableMetaDataFilter.php', - 'phpunit_extensions_database_dataset_xmldataset' => '/dbunit/Extensions/Database/DataSet/XmlDataSet.php', - 'phpunit_extensions_database_dataset_yamldataset' => '/dbunit/Extensions/Database/DataSet/YamlDataSet.php', - 'phpunit_extensions_database_db_dataset' => '/dbunit/Extensions/Database/DB/DataSet.php', - 'phpunit_extensions_database_db_defaultdatabaseconnection' => '/dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php', - 'phpunit_extensions_database_db_filtereddataset' => '/dbunit/Extensions/Database/DB/FilteredDataSet.php', - 'phpunit_extensions_database_db_idatabaseconnection' => '/dbunit/Extensions/Database/DB/IDatabaseConnection.php', - 'phpunit_extensions_database_db_imetadata' => '/dbunit/Extensions/Database/DB/IMetaData.php', - 'phpunit_extensions_database_db_metadata' => '/dbunit/Extensions/Database/DB/MetaData.php', - 'phpunit_extensions_database_db_metadata_dblib' => '/dbunit/Extensions/Database/DB/MetaData/Dblib.php', - 'phpunit_extensions_database_db_metadata_firebird' => '/dbunit/Extensions/Database/DB/MetaData/Firebird.php', - 'phpunit_extensions_database_db_metadata_informationschema' => '/dbunit/Extensions/Database/DB/MetaData/InformationSchema.php', - 'phpunit_extensions_database_db_metadata_mysql' => '/dbunit/Extensions/Database/DB/MetaData/MySQL.php', - 'phpunit_extensions_database_db_metadata_oci' => '/dbunit/Extensions/Database/DB/MetaData/Oci.php', - 'phpunit_extensions_database_db_metadata_pgsql' => '/dbunit/Extensions/Database/DB/MetaData/PgSQL.php', - 'phpunit_extensions_database_db_metadata_sqlite' => '/dbunit/Extensions/Database/DB/MetaData/Sqlite.php', - 'phpunit_extensions_database_db_metadata_sqlsrv' => '/dbunit/Extensions/Database/DB/MetaData/SqlSrv.php', - 'phpunit_extensions_database_db_resultsettable' => '/dbunit/Extensions/Database/DB/ResultSetTable.php', - 'phpunit_extensions_database_db_table' => '/dbunit/Extensions/Database/DB/Table.php', - 'phpunit_extensions_database_db_tableiterator' => '/dbunit/Extensions/Database/DB/TableIterator.php', - 'phpunit_extensions_database_db_tablemetadata' => '/dbunit/Extensions/Database/DB/TableMetaData.php', - 'phpunit_extensions_database_defaulttester' => '/dbunit/Extensions/Database/DefaultTester.php', - 'phpunit_extensions_database_exception' => '/dbunit/Extensions/Database/Exception.php', - 'phpunit_extensions_database_idatabaselistconsumer' => '/dbunit/Extensions/Database/IDatabaseListConsumer.php', - 'phpunit_extensions_database_itester' => '/dbunit/Extensions/Database/ITester.php', - 'phpunit_extensions_database_operation_composite' => '/dbunit/Extensions/Database/Operation/Composite.php', - 'phpunit_extensions_database_operation_delete' => '/dbunit/Extensions/Database/Operation/Delete.php', - 'phpunit_extensions_database_operation_deleteall' => '/dbunit/Extensions/Database/Operation/DeleteAll.php', - 'phpunit_extensions_database_operation_exception' => '/dbunit/Extensions/Database/Operation/Exception.php', - 'phpunit_extensions_database_operation_factory' => '/dbunit/Extensions/Database/Operation/Factory.php', - 'phpunit_extensions_database_operation_idatabaseoperation' => '/dbunit/Extensions/Database/Operation/IDatabaseOperation.php', - 'phpunit_extensions_database_operation_insert' => '/dbunit/Extensions/Database/Operation/Insert.php', - 'phpunit_extensions_database_operation_null' => '/dbunit/Extensions/Database/Operation/Null.php', - 'phpunit_extensions_database_operation_replace' => '/dbunit/Extensions/Database/Operation/Replace.php', - 'phpunit_extensions_database_operation_rowbased' => '/dbunit/Extensions/Database/Operation/RowBased.php', - 'phpunit_extensions_database_operation_truncate' => '/dbunit/Extensions/Database/Operation/Truncate.php', - 'phpunit_extensions_database_operation_update' => '/dbunit/Extensions/Database/Operation/Update.php', - 'phpunit_extensions_database_testcase' => '/dbunit/Extensions/Database/TestCase.php', - 'phpunit_extensions_database_ui_command' => '/dbunit/Extensions/Database/UI/Command.php', - 'phpunit_extensions_database_ui_context' => '/dbunit/Extensions/Database/UI/Context.php', - 'phpunit_extensions_database_ui_imedium' => '/dbunit/Extensions/Database/UI/IMedium.php', - 'phpunit_extensions_database_ui_imediumprinter' => '/dbunit/Extensions/Database/UI/IMediumPrinter.php', - 'phpunit_extensions_database_ui_imode' => '/dbunit/Extensions/Database/UI/IMode.php', - 'phpunit_extensions_database_ui_imodefactory' => '/dbunit/Extensions/Database/UI/IModeFactory.php', - 'phpunit_extensions_database_ui_invalidmodeexception' => '/dbunit/Extensions/Database/UI/InvalidModeException.php', - 'phpunit_extensions_database_ui_mediums_text' => '/dbunit/Extensions/Database/UI/Mediums/Text.php', - 'phpunit_extensions_database_ui_modefactory' => '/dbunit/Extensions/Database/UI/ModeFactory.php', - 'phpunit_extensions_database_ui_modes_exportdataset' => '/dbunit/Extensions/Database/UI/Modes/ExportDataSet.php', - 'phpunit_extensions_database_ui_modes_exportdataset_arguments' => '/dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.php', - 'phpunit_extensions_grouptestsuite' => '/phpunit/Extensions/GroupTestSuite.php', - 'phpunit_extensions_phpttestcase' => '/phpunit/Extensions/PhptTestCase.php', - 'phpunit_extensions_phpttestsuite' => '/phpunit/Extensions/PhptTestSuite.php', - 'phpunit_extensions_repeatedtest' => '/phpunit/Extensions/RepeatedTest.php', - 'phpunit_extensions_selenium2testcase' => '/phpunit-selenium/Extensions/Selenium2TestCase.php', - 'phpunit_extensions_selenium2testcase_command' => '/phpunit-selenium/Extensions/Selenium2TestCase/Command.php', - 'phpunit_extensions_selenium2testcase_commandsholder' => '/phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.php', - 'phpunit_extensions_selenium2testcase_driver' => '/phpunit-selenium/Extensions/Selenium2TestCase/Driver.php', - 'phpunit_extensions_selenium2testcase_element' => '/phpunit-selenium/Extensions/Selenium2TestCase/Element.php', - 'phpunit_extensions_selenium2testcase_element_accessor' => '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.php', - 'phpunit_extensions_selenium2testcase_element_select' => '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.php', - 'phpunit_extensions_selenium2testcase_elementcommand_attribute' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.php', - 'phpunit_extensions_selenium2testcase_elementcommand_click' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php', - 'phpunit_extensions_selenium2testcase_elementcommand_css' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.php', - 'phpunit_extensions_selenium2testcase_elementcommand_equals' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php', - 'phpunit_extensions_selenium2testcase_elementcommand_genericaccessor' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.php', - 'phpunit_extensions_selenium2testcase_elementcommand_genericpost' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.php', - 'phpunit_extensions_selenium2testcase_elementcommand_value' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.php', - 'phpunit_extensions_selenium2testcase_elementcriteria' => '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.php', - 'phpunit_extensions_selenium2testcase_exception' => '/phpunit-selenium/Extensions/Selenium2TestCase/Exception.php', - 'phpunit_extensions_selenium2testcase_keys' => '/phpunit-selenium/Extensions/Selenium2TestCase/Keys.php', - 'phpunit_extensions_selenium2testcase_keysholder' => '/phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.php', - 'phpunit_extensions_selenium2testcase_noseleniumexception' => '/phpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.php', - 'phpunit_extensions_selenium2testcase_response' => '/phpunit-selenium/Extensions/Selenium2TestCase/Response.php', - 'phpunit_extensions_selenium2testcase_screenshotlistener' => '/phpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.php', - 'phpunit_extensions_selenium2testcase_session' => '/phpunit-selenium/Extensions/Selenium2TestCase/Session.php', - 'phpunit_extensions_selenium2testcase_session_cookie' => '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.php', - 'phpunit_extensions_selenium2testcase_session_cookie_builder' => '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.php', - 'phpunit_extensions_selenium2testcase_session_storage' => '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php', - 'phpunit_extensions_selenium2testcase_session_timeouts' => '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_acceptalert' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_alerttext' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_click' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_dismissalert' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_file' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_frame' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_genericaccessor' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_genericattribute' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_keys' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_location' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_log' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_moveto' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_orientation' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_url' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php', - 'phpunit_extensions_selenium2testcase_sessioncommand_window' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.php', - 'phpunit_extensions_selenium2testcase_sessionstrategy' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php', - 'phpunit_extensions_selenium2testcase_sessionstrategy_isolated' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php', - 'phpunit_extensions_selenium2testcase_sessionstrategy_shared' => '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.php', - 'phpunit_extensions_selenium2testcase_statecommand' => '/phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.php', - 'phpunit_extensions_selenium2testcase_url' => '/phpunit-selenium/Extensions/Selenium2TestCase/URL.php', - 'phpunit_extensions_selenium2testcase_waituntil' => '/phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.php', - 'phpunit_extensions_selenium2testcase_webdriverexception' => '/phpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.php', - 'phpunit_extensions_selenium2testcase_window' => '/phpunit-selenium/Extensions/Selenium2TestCase/Window.php', - 'phpunit_extensions_seleniumbrowsersuite' => '/phpunit-selenium/Extensions/SeleniumBrowserSuite.php', - 'phpunit_extensions_seleniumcommon_exithandler' => '/phpunit-selenium/Extensions/SeleniumCommon/ExitHandler.php', - 'phpunit_extensions_seleniumcommon_remotecoverage' => '/phpunit-selenium/Extensions/SeleniumCommon/RemoteCoverage.php', - 'phpunit_extensions_seleniumtestcase' => '/phpunit-selenium/Extensions/SeleniumTestCase.php', - 'phpunit_extensions_seleniumtestcase_driver' => '/phpunit-selenium/Extensions/SeleniumTestCase/Driver.php', - 'phpunit_extensions_seleniumtestsuite' => '/phpunit-selenium/Extensions/SeleniumTestSuite.php', - 'phpunit_extensions_testdecorator' => '/phpunit/Extensions/TestDecorator.php', - 'phpunit_extensions_ticketlistener' => '/phpunit/Extensions/TicketListener.php', - 'phpunit_framework_assert' => '/phpunit/Framework/Assert.php', - 'phpunit_framework_assertionfailederror' => '/phpunit/Framework/AssertionFailedError.php', - 'phpunit_framework_basetestlistener' => '/phpunit/Framework/BaseTestListener.php', - 'phpunit_framework_codecoverageexception' => '/phpunit/Framework/CodeCoverageException.php', - 'phpunit_framework_constraint' => '/phpunit/Framework/Constraint.php', - 'phpunit_framework_constraint_and' => '/phpunit/Framework/Constraint/And.php', - 'phpunit_framework_constraint_arrayhaskey' => '/phpunit/Framework/Constraint/ArrayHasKey.php', - 'phpunit_framework_constraint_attribute' => '/phpunit/Framework/Constraint/Attribute.php', - 'phpunit_framework_constraint_callback' => '/phpunit/Framework/Constraint/Callback.php', - 'phpunit_framework_constraint_classhasattribute' => '/phpunit/Framework/Constraint/ClassHasAttribute.php', - 'phpunit_framework_constraint_classhasstaticattribute' => '/phpunit/Framework/Constraint/ClassHasStaticAttribute.php', - 'phpunit_framework_constraint_composite' => '/phpunit/Framework/Constraint/Composite.php', - 'phpunit_framework_constraint_count' => '/phpunit/Framework/Constraint/Count.php', - 'phpunit_framework_constraint_exception' => '/phpunit/Framework/Constraint/Exception.php', - 'phpunit_framework_constraint_exceptioncode' => '/phpunit/Framework/Constraint/ExceptionCode.php', - 'phpunit_framework_constraint_exceptionmessage' => '/phpunit/Framework/Constraint/ExceptionMessage.php', - 'phpunit_framework_constraint_fileexists' => '/phpunit/Framework/Constraint/FileExists.php', - 'phpunit_framework_constraint_greaterthan' => '/phpunit/Framework/Constraint/GreaterThan.php', - 'phpunit_framework_constraint_isanything' => '/phpunit/Framework/Constraint/IsAnything.php', - 'phpunit_framework_constraint_isempty' => '/phpunit/Framework/Constraint/IsEmpty.php', - 'phpunit_framework_constraint_isequal' => '/phpunit/Framework/Constraint/IsEqual.php', - 'phpunit_framework_constraint_isfalse' => '/phpunit/Framework/Constraint/IsFalse.php', - 'phpunit_framework_constraint_isidentical' => '/phpunit/Framework/Constraint/IsIdentical.php', - 'phpunit_framework_constraint_isinstanceof' => '/phpunit/Framework/Constraint/IsInstanceOf.php', - 'phpunit_framework_constraint_isjson' => '/phpunit/Framework/Constraint/IsJson.php', - 'phpunit_framework_constraint_isnull' => '/phpunit/Framework/Constraint/IsNull.php', - 'phpunit_framework_constraint_istrue' => '/phpunit/Framework/Constraint/IsTrue.php', - 'phpunit_framework_constraint_istype' => '/phpunit/Framework/Constraint/IsType.php', - 'phpunit_framework_constraint_jsonmatches' => '/phpunit/Framework/Constraint/JsonMatches.php', - 'phpunit_framework_constraint_jsonmatches_errormessageprovider' => '/phpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', - 'phpunit_framework_constraint_lessthan' => '/phpunit/Framework/Constraint/LessThan.php', - 'phpunit_framework_constraint_not' => '/phpunit/Framework/Constraint/Not.php', - 'phpunit_framework_constraint_objecthasattribute' => '/phpunit/Framework/Constraint/ObjectHasAttribute.php', - 'phpunit_framework_constraint_or' => '/phpunit/Framework/Constraint/Or.php', - 'phpunit_framework_constraint_pcrematch' => '/phpunit/Framework/Constraint/PCREMatch.php', - 'phpunit_framework_constraint_samesize' => '/phpunit/Framework/Constraint/SameSize.php', - 'phpunit_framework_constraint_stringcontains' => '/phpunit/Framework/Constraint/StringContains.php', - 'phpunit_framework_constraint_stringendswith' => '/phpunit/Framework/Constraint/StringEndsWith.php', - 'phpunit_framework_constraint_stringmatches' => '/phpunit/Framework/Constraint/StringMatches.php', - 'phpunit_framework_constraint_stringstartswith' => '/phpunit/Framework/Constraint/StringStartsWith.php', - 'phpunit_framework_constraint_traversablecontains' => '/phpunit/Framework/Constraint/TraversableContains.php', - 'phpunit_framework_constraint_traversablecontainsonly' => '/phpunit/Framework/Constraint/TraversableContainsOnly.php', - 'phpunit_framework_constraint_xor' => '/phpunit/Framework/Constraint/Xor.php', - 'phpunit_framework_error' => '/phpunit/Framework/Error.php', - 'phpunit_framework_error_deprecated' => '/phpunit/Framework/Error/Deprecated.php', - 'phpunit_framework_error_notice' => '/phpunit/Framework/Error/Notice.php', - 'phpunit_framework_error_warning' => '/phpunit/Framework/Error/Warning.php', - 'phpunit_framework_exception' => '/phpunit/Framework/Exception.php', - 'phpunit_framework_expectationfailedexception' => '/phpunit/Framework/ExpectationFailedException.php', - 'phpunit_framework_incompletetest' => '/phpunit/Framework/IncompleteTest.php', - 'phpunit_framework_incompletetesterror' => '/phpunit/Framework/IncompleteTestError.php', - 'phpunit_framework_invalidcoverstargeterror' => '/phpunit/Framework/InvalidCoversTargetError.php', - 'phpunit_framework_invalidcoverstargetexception' => '/phpunit/Framework/InvalidCoversTargetException.php', - 'phpunit_framework_mockobject_builder_identity' => '/phpunit-mock-objects/Framework/MockObject/Builder/Identity.php', - 'phpunit_framework_mockobject_builder_invocationmocker' => '/phpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.php', - 'phpunit_framework_mockobject_builder_match' => '/phpunit-mock-objects/Framework/MockObject/Builder/Match.php', - 'phpunit_framework_mockobject_builder_methodnamematch' => '/phpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php', - 'phpunit_framework_mockobject_builder_namespace' => '/phpunit-mock-objects/Framework/MockObject/Builder/Namespace.php', - 'phpunit_framework_mockobject_builder_parametersmatch' => '/phpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.php', - 'phpunit_framework_mockobject_builder_stub' => '/phpunit-mock-objects/Framework/MockObject/Builder/Stub.php', - 'phpunit_framework_mockobject_exception' => '/phpunit-mock-objects/Framework/MockObject/Exception.php', - 'phpunit_framework_mockobject_generator' => '/phpunit-mock-objects/Framework/MockObject/Generator.php', - 'phpunit_framework_mockobject_invocation' => '/phpunit-mock-objects/Framework/MockObject/Invocation.php', - 'phpunit_framework_mockobject_invocation_object' => '/phpunit-mock-objects/Framework/MockObject/Invocation/Object.php', - 'phpunit_framework_mockobject_invocation_static' => '/phpunit-mock-objects/Framework/MockObject/Invocation/Static.php', - 'phpunit_framework_mockobject_invocationmocker' => '/phpunit-mock-objects/Framework/MockObject/InvocationMocker.php', - 'phpunit_framework_mockobject_invokable' => '/phpunit-mock-objects/Framework/MockObject/Invokable.php', - 'phpunit_framework_mockobject_matcher' => '/phpunit-mock-objects/Framework/MockObject/Matcher.php', - 'phpunit_framework_mockobject_matcher_anyinvokedcount' => '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.php', - 'phpunit_framework_mockobject_matcher_anyparameters' => '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.php', - 'phpunit_framework_mockobject_matcher_consecutiveparameters' => '/phpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.php', - 'phpunit_framework_mockobject_matcher_invocation' => '/phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.php', - 'phpunit_framework_mockobject_matcher_invokedatindex' => '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.php', - 'phpunit_framework_mockobject_matcher_invokedatleastonce' => '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', - 'phpunit_framework_mockobject_matcher_invokedcount' => '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.php', - 'phpunit_framework_mockobject_matcher_invokedrecorder' => '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.php', - 'phpunit_framework_mockobject_matcher_methodname' => '/phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.php', - 'phpunit_framework_mockobject_matcher_parameters' => '/phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.php', - 'phpunit_framework_mockobject_matcher_statelessinvocation' => '/phpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.php', - 'phpunit_framework_mockobject_mockbuilder' => '/phpunit-mock-objects/Framework/MockObject/MockBuilder.php', - 'phpunit_framework_mockobject_mockobject' => '/phpunit-mock-objects/Framework/MockObject/MockObject.php', - 'phpunit_framework_mockobject_stub' => '/phpunit-mock-objects/Framework/MockObject/Stub.php', - 'phpunit_framework_mockobject_stub_consecutivecalls' => '/phpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.php', - 'phpunit_framework_mockobject_stub_exception' => '/phpunit-mock-objects/Framework/MockObject/Stub/Exception.php', - 'phpunit_framework_mockobject_stub_matchercollection' => '/phpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.php', - 'phpunit_framework_mockobject_stub_return' => '/phpunit-mock-objects/Framework/MockObject/Stub/Return.php', - 'phpunit_framework_mockobject_stub_returnargument' => '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.php', - 'phpunit_framework_mockobject_stub_returncallback' => '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.php', - 'phpunit_framework_mockobject_stub_returnself' => '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.php', - 'phpunit_framework_mockobject_stub_returnvaluemap' => '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.php', - 'phpunit_framework_mockobject_verifiable' => '/phpunit-mock-objects/Framework/MockObject/Verifiable.php', - 'phpunit_framework_outputerror' => '/phpunit/Framework/OutputError.php', - 'phpunit_framework_riskytest' => '/phpunit/Framework/RiskyTest.php', - 'phpunit_framework_riskytesterror' => '/phpunit/Framework/RiskyTestError.php', - 'phpunit_framework_selfdescribing' => '/phpunit/Framework/SelfDescribing.php', - 'phpunit_framework_skippedtest' => '/phpunit/Framework/SkippedTest.php', - 'phpunit_framework_skippedtesterror' => '/phpunit/Framework/SkippedTestError.php', - 'phpunit_framework_skippedtestsuiteerror' => '/phpunit/Framework/SkippedTestSuiteError.php', - 'phpunit_framework_syntheticerror' => '/phpunit/Framework/SyntheticError.php', - 'phpunit_framework_test' => '/phpunit/Framework/Test.php', - 'phpunit_framework_testcase' => '/phpunit/Framework/TestCase.php', - 'phpunit_framework_testfailure' => '/phpunit/Framework/TestFailure.php', - 'phpunit_framework_testlistener' => '/phpunit/Framework/TestListener.php', - 'phpunit_framework_testresult' => '/phpunit/Framework/TestResult.php', - 'phpunit_framework_testsuite' => '/phpunit/Framework/TestSuite.php', - 'phpunit_framework_testsuite_dataprovider' => '/phpunit/Framework/TestSuite/DataProvider.php', - 'phpunit_framework_unintentionallycoveredcodeerror' => '/phpunit/Framework/UnintentionallyCoveredCodeError.php', - 'phpunit_framework_warning' => '/phpunit/Framework/Warning.php', - 'phpunit_runner_basetestrunner' => '/phpunit/Runner/BaseTestRunner.php', - 'phpunit_runner_exception' => '/phpunit/Runner/Exception.php', - 'phpunit_runner_filter_factory' => '/phpunit/Runner/Filter/Factory.php', - 'phpunit_runner_filter_group_exclude' => '/phpunit/Runner/Filter/Group/Exclude.php', - 'phpunit_runner_filter_group_include' => '/phpunit/Runner/Filter/Group/Include.php', - 'phpunit_runner_filter_groupfilteriterator' => '/phpunit/Runner/Filter/Group.php', - 'phpunit_runner_filter_test' => '/phpunit/Runner/Filter/Test.php', - 'phpunit_runner_standardtestsuiteloader' => '/phpunit/Runner/StandardTestSuiteLoader.php', - 'phpunit_runner_testsuiteloader' => '/phpunit/Runner/TestSuiteLoader.php', - 'phpunit_runner_version' => '/phpunit/Runner/Version.php', - 'phpunit_textui_command' => '/phpunit/TextUI/Command.php', - 'phpunit_textui_resultprinter' => '/phpunit/TextUI/ResultPrinter.php', - 'phpunit_textui_testrunner' => '/phpunit/TextUI/TestRunner.php', - 'phpunit_util_blacklist' => '/phpunit/Util/Blacklist.php', - 'phpunit_util_configuration' => '/phpunit/Util/Configuration.php', - 'phpunit_util_deprecatedfeature' => '/phpunit/Util/DeprecatedFeature.php', - 'phpunit_util_deprecatedfeature_logger' => '/phpunit/Util/DeprecatedFeature/Logger.php', - 'phpunit_util_errorhandler' => '/phpunit/Util/ErrorHandler.php', - 'phpunit_util_fileloader' => '/phpunit/Util/Fileloader.php', - 'phpunit_util_filesystem' => '/phpunit/Util/Filesystem.php', - 'phpunit_util_filter' => '/phpunit/Util/Filter.php', - 'phpunit_util_getopt' => '/phpunit/Util/Getopt.php', - 'phpunit_util_globalstate' => '/phpunit/Util/GlobalState.php', - 'phpunit_util_invalidargumenthelper' => '/phpunit/Util/InvalidArgumentHelper.php', - 'phpunit_util_log_json' => '/phpunit/Util/Log/JSON.php', - 'phpunit_util_log_junit' => '/phpunit/Util/Log/JUnit.php', - 'phpunit_util_log_tap' => '/phpunit/Util/Log/TAP.php', - 'phpunit_util_php' => '/phpunit/Util/PHP.php', - 'phpunit_util_php_default' => '/phpunit/Util/PHP/Default.php', - 'phpunit_util_php_windows' => '/phpunit/Util/PHP/Windows.php', - 'phpunit_util_printer' => '/phpunit/Util/Printer.php', - 'phpunit_util_string' => '/phpunit/Util/String.php', - 'phpunit_util_test' => '/phpunit/Util/Test.php', - 'phpunit_util_testdox_nameprettifier' => '/phpunit/Util/TestDox/NamePrettifier.php', - 'phpunit_util_testdox_resultprinter' => '/phpunit/Util/TestDox/ResultPrinter.php', - 'phpunit_util_testdox_resultprinter_html' => '/phpunit/Util/TestDox/ResultPrinter/HTML.php', - 'phpunit_util_testdox_resultprinter_text' => '/phpunit/Util/TestDox/ResultPrinter/Text.php', - 'phpunit_util_testsuiteiterator' => '/phpunit/Util/TestSuiteIterator.php', - 'phpunit_util_type' => '/phpunit/Util/Type.php', - 'phpunit_util_xml' => '/phpunit/Util/XML.php', - 'sebastianbergmann\\comparator\\arraycomparator' => '/sebastian-comparator/ArrayComparator.php', - 'sebastianbergmann\\comparator\\comparator' => '/sebastian-comparator/Comparator.php', - 'sebastianbergmann\\comparator\\comparisonfailure' => '/sebastian-comparator/ComparisonFailure.php', - 'sebastianbergmann\\comparator\\datetimecomparator' => '/sebastian-comparator/DateTimeComparator.php', - 'sebastianbergmann\\comparator\\domnodecomparator' => '/sebastian-comparator/DOMNodeComparator.php', - 'sebastianbergmann\\comparator\\doublecomparator' => '/sebastian-comparator/DoubleComparator.php', - 'sebastianbergmann\\comparator\\exceptioncomparator' => '/sebastian-comparator/ExceptionComparator.php', - 'sebastianbergmann\\comparator\\factory' => '/sebastian-comparator/Factory.php', - 'sebastianbergmann\\comparator\\mockobjectcomparator' => '/sebastian-comparator/MockObjectComparator.php', - 'sebastianbergmann\\comparator\\numericcomparator' => '/sebastian-comparator/NumericComparator.php', - 'sebastianbergmann\\comparator\\objectcomparator' => '/sebastian-comparator/ObjectComparator.php', - 'sebastianbergmann\\comparator\\resourcecomparator' => '/sebastian-comparator/ResourceComparator.php', - 'sebastianbergmann\\comparator\\scalarcomparator' => '/sebastian-comparator/ScalarComparator.php', - 'sebastianbergmann\\comparator\\splobjectstoragecomparator' => '/sebastian-comparator/SplObjectStorageComparator.php', - 'sebastianbergmann\\comparator\\typecomparator' => '/sebastian-comparator/TypeComparator.php', - 'sebastianbergmann\\diff\\chunk' => '/sebastian-diff/Chunk.php', - 'sebastianbergmann\\diff\\diff' => '/sebastian-diff/Diff.php', - 'sebastianbergmann\\diff\\differ' => '/sebastian-diff/Differ.php', - 'sebastianbergmann\\diff\\line' => '/sebastian-diff/Line.php', - 'sebastianbergmann\\diff\\parser' => '/sebastian-diff/Parser.php', - 'sebastianbergmann\\environment\\runtime' => '/sebastian-environment/Runtime.php', - 'sebastianbergmann\\exporter\\context' => '/sebastian-exporter/Context.php', - 'sebastianbergmann\\exporter\\exception' => '/sebastian-exporter/Exception.php', - 'sebastianbergmann\\exporter\\exporter' => '/sebastian-exporter/Exporter.php', - 'sebastianbergmann\\version' => '/sebastian-version/Version.php', - 'symfony\\component\\yaml\\dumper' => '/symfony/yaml/Symfony/Component/Yaml/Dumper.php', - 'symfony\\component\\yaml\\escaper' => '/symfony/yaml/Symfony/Component/Yaml/Escaper.php', - 'symfony\\component\\yaml\\exception\\dumpexception' => '/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php', - 'symfony\\component\\yaml\\exception\\exceptioninterface' => '/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php', - 'symfony\\component\\yaml\\exception\\parseexception' => '/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php', - 'symfony\\component\\yaml\\exception\\runtimeexception' => '/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php', - 'symfony\\component\\yaml\\inline' => '/symfony/yaml/Symfony/Component/Yaml/Inline.php', - 'symfony\\component\\yaml\\parser' => '/symfony/yaml/Symfony/Component/Yaml/Parser.php', - 'symfony\\component\\yaml\\unescaper' => '/symfony/yaml/Symfony/Component/Yaml/Unescaper.php', - 'symfony\\component\\yaml\\yaml' => '/symfony/yaml/Symfony/Component/Yaml/Yaml.php', - 'text_template' => '/php-text-template/Template.php' - ); - } - - $class = strtolower($class); - - if (isset($classes[$class])) { - require __PHPUNIT_PHAR_ROOT__ . $classes[$class]; - } - } -); - -Phar::mapPhar('phpunit-4.1.0.phar'); - -if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == '--manifest') { - print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/manifest.txt'); - exit; -} - -if ($GLOBALS['_SERVER']['SCRIPT_NAME'] != '-') { - PHPUnit_TextUI_Command::main(); -} - -__HALT_COMPILER(); ?> -phpunit-4.1.0.phar$phpunit/Framework/RiskyTestError.php) -FcS) -y0phpunit/Framework/ExpectationFailedException.php FcS -.phpunit/Framework/InvalidCoversTargetError.phph -FcSh -޶$phpunit/Framework/SelfDescribing.php< -FcS< -l$phpunit/Framework/IncompleteTest.php -FcS -8!phpunit/Framework/TestFailure.phpFcSŶ phpunit/Framework/Constraint.phpFcS/Vpж2phpunit/Framework/InvalidCoversTargetException.php FcS ں&phpunit/Framework/SkippedTestError.php/ -FcS/ -&ֳ)phpunit/Framework/IncompleteTestError.php9 -FcS9 -#Y"phpunit/Framework/TestListener.phpsFcSsB&phpunit/Framework/Assert/Functions.phppFcSp[ʶ phpunit/Framework/TestResult.phptFcSt{z$phpunit/Framework/SyntheticError.phpAFcSA/3+phpunit/Framework/SkippedTestSuiteError.php: -FcS: - +phpunit/Framework/CodeCoverageException.php FcS 5&^phpunit/Framework/Assert.php}FcS}Ll!phpunit/Framework/SkippedTest.php FcS K9phpunit/Framework/Warning.php FcS l,phpunit/Framework/TestSuite/DataProvider.php -FcS -T`phpunit/Framework/RiskyTest.php FcS 7phpunit/Framework/TestCase.phpFcSE_phpunit/Framework/TestSuite.phpiFcSia*phpunit/Framework/AssertionFailedError.php -FcS -~Vpphpunit/Framework/Test.php -FcS -S!phpunit/Framework/OutputError.php -FcS -MԺphpunit/Framework/Error.php8 FcS8 nV$phpunit/Framework/Constraint/Xor.phpFcST}82phpunit/Framework/Constraint/ClassHasAttribute.phpdFcSdX,(phpunit/Framework/Constraint/IsEmpty.phpFcS蝬&phpunit/Framework/Constraint/Count.phpLFcSLῂ1phpunit/Framework/Constraint/StringStartsWith.phpv FcSv n>)phpunit/Framework/Constraint/SameSize.php FcS ~(phpunit/Framework/Constraint/IsEqual.phpFcSӷ#phpunit/Framework/Constraint/Or.php{FcS{oc/phpunit/Framework/Constraint/StringContains.phpFcS67[*phpunit/Framework/Constraint/Composite.phpFcS[Lm1phpunit/Framework/Constraint/ExceptionMessage.php{FcS{FXc'phpunit/Framework/Constraint/IsNull.php! FcS! .phpunit/Framework/Constraint/StringMatches.phpFcSښ'phpunit/Framework/Constraint/IsType.phpFcSF-phpunit/Framework/Constraint/IsInstanceOf.php[FcS[ߘ'phpunit/Framework/Constraint/IsTrue.php! FcS! 0߶(phpunit/Framework/Constraint/IsFalse.php% FcS% .phpunit/Framework/Constraint/ExceptionCode.phpFcSV)'phpunit/Framework/Constraint/IsJson.phpFcSKh$phpunit/Framework/Constraint/Not.phpFcS,phpunit/Framework/Constraint/ArrayHasKey.phpkFcSk|o*phpunit/Framework/Constraint/PCREMatch.phpjFcSj1#׶$phpunit/Framework/Constraint/And.phpCFcSCZ)phpunit/Framework/Constraint/Callback.phpKFcSKO8phpunit/Framework/Constraint/TraversableContainsOnly.phpFcSϸ_*phpunit/Framework/Constraint/Attribute.phpFcSJ)phpunit/Framework/Constraint/LessThan.phpn FcSn `,phpunit/Framework/Constraint/JsonMatches.php<FcS<t,phpunit/Framework/Constraint/GreaterThan.phpw FcSw p4phpunit/Framework/Constraint/TraversableContains.phpFcS+phpunit/Framework/Constraint/FileExists.php[FcS[yF?+phpunit/Framework/Constraint/IsAnything.phpFcSCW3phpunit/Framework/Constraint/ObjectHasAttribute.phpM FcSM Aphpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.phpFcS 8phpunit/Framework/Constraint/ClassHasStaticAttribute.php*FcS*F*8*phpunit/Framework/Constraint/Exception.phpFcSw/phpunit/Framework/Constraint/StringEndsWith.php FcS ȶ,phpunit/Framework/Constraint/IsIdentical.phpFcS4&phpunit/Framework/Error/Deprecated.phpx -FcSx -9*"phpunit/Framework/Error/Notice.phpb -FcSb -ֶ#phpunit/Framework/Error/Warning.phpe -FcSe -0flphpunit/Framework/Exception.php FcS |&phpunit/Framework/BaseTestListener.php@ FcS@ 9pu5phpunit/Framework/UnintentionallyCoveredCodeError.php- -FcS- -q⮶phpunit/Util/Log/TAP.phpFcSS`phpunit/Util/Log/JSON.php| FcS| H7phpunit/Util/Log/JUnit.php#<FcS#<6`Wphpunit/Util/PHP.php!FcS!v**8phpunit/Util/XML.phpc}FcSc}۶phpunit/Util/Getopt.phpOFcSOsOL޶phpunit/Util/PHP/Windows.php FcS 2u@phpunit/Util/PHP/Default.phpFcS@%ƶ1phpunit/Util/PHP/Template/TestCaseMethod.tpl.dist?FcS?Yնphpunit/Util/Filesystem.php FcS f%phpunit/Util/Type.php FcS `"phpunit/Util/DeprecatedFeature.php FcS Fpiphpunit/Util/Filter.phpEFcSEe/)phpunit/Util/DeprecatedFeature/Logger.phpCFcSCQphpunit/Util/String.phpFcS@R"phpunit/Util/TestSuiteIterator.phphFcShQҘphpunit/Util/GlobalState.php^1FcS^1˕phpunit/Util/Fileloader.phpFcSphpunit/Util/Test.phpd|FcSd|/Cphpunit/Util/Printer.php]FcS]g\phpunit/Util/Configuration.phpFcSk0&phpunit/Util/InvalidArgumentHelper.php FcS ث1phpunit/Util/Blacklist.phpFcS'phpunit/Util/TestDox/NamePrettifier.php2FcS22&phpunit/Util/TestDox/ResultPrinter.php(FcS(Yö+phpunit/Util/TestDox/ResultPrinter/HTML.phpFcS7m{+phpunit/Util/TestDox/ResultPrinter/Text.php FcS c"phpunit/Util/ErrorHandler.php,FcS,=nphpunit/TextUI/Command.php|FcS|y,(T phpunit/TextUI/ResultPrinter.phpOFcSOxڶphpunit/TextUI/TestRunner.phpFcSEG!phpunit/Runner/BaseTestRunner.phpDFcSD q"phpunit/Runner/TestSuiteLoader.php FcS @'phpunit/Runner/Filter/Group/Exclude.php -FcS -հ'phpunit/Runner/Filter/Group/Include.php -FcS -/!phpunit/Runner/Filter/Factory.php FcS Uԃphpunit/Runner/Filter/Group.php FcS t`phpunit/Runner/Filter/Test.php&FcS&*phpunit/Runner/StandardTestSuiteLoader.phpFcSΝphpunit/Runner/Exception.php FcS 3 phpunit/Runner/Version.php FcS Զ#phpunit/Extensions/PhptTestCase.phpFcS^f@#phpunit/Extensions/RepeatedTest.phpnFcSnM5Y$phpunit/Extensions/TestDecorator.phpiFcSiQݶ%phpunit/Extensions/GroupTestSuite.phpFcSV%phpunit/Extensions/TicketListener.php FcS $phpunit/Extensions/PhptTestSuite.phpZ FcSZ [Mphpunit/Exception.php FcS FcS>*dBʶ1phpunit-selenium/Extensions/SeleniumTestSuite.phpFcS8phpunit-selenium/Extensions/Selenium2TestCase/Driver.php/FcS/z}Lphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php1 -FcS1 -BHQphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.php -FcS -BLphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.php FcS @\WIJphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.phpC FcSC lXimEphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.phpFcS0ߗPphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.phpT -FcST -XIphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.php FcS Mphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php6 -FcS6 -vlFphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php FcS ^aDphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php FcS KEphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php$FcS$wͶFphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php FcS z"Gphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.phpFcS- -Dphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php FcS "=Gphpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.php -FcS -@phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.phpFcSZewDphpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.phpFcS|aHphpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.phpHFcSHVmJphpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php FcS Ͷ9phpunit-selenium/Extensions/Selenium2TestCase/Session.php/FcS/ĶAphpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.phpN FcSN ¶Ephpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.php FcS k9phpunit-selenium/Extensions/Selenium2TestCase/Command.phpL FcSL cyƶBphpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.phpFcS\w@phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.phpFcSL@"Pphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.phpi -FcSi -PeLphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.phpW -FcSW -LqFphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php+ -FcS+ -ĻGphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php` FcS` nնDphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.phpi FcSi Jphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.phpt FcSt  ˈFphpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.php -FcS -.$5phpunit-selenium/Extensions/Selenium2TestCase/URL.phpFcSHF>phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.phpw -FcSw -e3Z6phpunit-selenium/Extensions/Selenium2TestCase/Keys.phpIFcSIͶ9phpunit-selenium/Extensions/Selenium2TestCase/Element.phpFcS:phpunit-selenium/Extensions/Selenium2TestCase/Response.phpFcSTZ8phpunit-selenium/Extensions/Selenium2TestCase/Window.phpO FcSO SAphpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php FcS ̳rDphpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.phpf FcSf K1<phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.phpFcS|HAphpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php8 FcS8 Hphpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.phpFcSӸqBphpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php]FcS]/X@phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.phpFcS$!;phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.phpFcSsX;phpunit-selenium/Extensions/Selenium2TestCase/Exception.php FcS H"[4phpunit-selenium/Extensions/SeleniumBrowserSuite.phpFcSD0phpunit-selenium/Extensions/SeleniumTestCase.phpЖFcSЖ`ec1phpunit-selenium/Extensions/Selenium2TestCase.phpkCFcSkCmf7phpunit-selenium/Extensions/SeleniumTestCase/Driver.php^FcS^7'q߶!sebastian-environment/Runtime.phpFcSj8phpunit-mock-objects/Framework/MockObject/Invocation.php FcS a?>phpunit-mock-objects/Framework/MockObject/InvocationMocker.php{FcS{h5phpunit-mock-objects/Framework/MockObject/Matcher.php(FcS(L7phpunit-mock-objects/Framework/MockObject/Generator.php$FcS$z>ox7phpunit-mock-objects/Framework/MockObject/Invokable.php FcS ]Dphpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.php FcS  =phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.php FcS Á9phpunit-mock-objects/Framework/MockObject/Stub/Return.php FcS Aphpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.php FcS '޶Aphpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.php FcS #j{5Cphpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.php FcS #|<phpunit-mock-objects/Framework/MockObject/Stub/Exception.phpX FcSX ȝ>nAphpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.phpe FcSe M#?phpunit-mock-objects/Framework/MockObject/Invocation/Object.php FcS a|¶?phpunit-mock-objects/Framework/MockObject/Invocation/Static.phptFcSt>gKphpunit-mock-objects/Framework/MockObject/Generator/proxied_method.tpl.distFcS?aPphpunit-mock-objects/Framework/MockObject/Generator/mocked_class_method.tpl.distFcS4޶Iphpunit-mock-objects/Framework/MockObject/Generator/mocked_clone.tpl.distFcSaTJphpunit-mock-objects/Framework/MockObject/Generator/mocked_method.tpl.distFcSbVIphpunit-mock-objects/Framework/MockObject/Generator/mocked_class.tpl.dist FcS FZHphpunit-mock-objects/Framework/MockObject/Generator/wsdl_method.tpl.dist<FcS<iGphpunit-mock-objects/Framework/MockObject/Generator/wsdl_class.tpl.distFcSw&SHphpunit-mock-objects/Framework/MockObject/Generator/trait_class.tpl.dist7FcS7[$~Kphpunit-mock-objects/Framework/MockObject/Generator/unmocked_clone.tpl.distFcS8W}ض9phpunit-mock-objects/Framework/MockObject/MockBuilder.php%FcS% -d8phpunit-mock-objects/Framework/MockObject/Verifiable.php FcS &nFphpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.php$FcS$p -OEphpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.phpaFcSa#$ Ephpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php FcS ?phpunit-mock-objects/Framework/MockObject/Builder/Namespace.phpFcSca>phpunit-mock-objects/Framework/MockObject/Builder/Identity.php FcS Nts:phpunit-mock-objects/Framework/MockObject/Builder/Stub.php FcS t ;phpunit-mock-objects/Framework/MockObject/Builder/Match.php FcS ڂ8phpunit-mock-objects/Framework/MockObject/MockObject.php>FcS>AEphpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.phpA FcSA tM8@phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.phpeFcSe̸Iphpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.phpFcS7gEphpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.phpFcS; =PDphpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.phpuFcSua @phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.phpBFcSB`5hHphpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.php/ FcS/ mrَ@phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.phpFcSe?Bphpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.phpFcS92Cphpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.php FcS eKphpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.phpFcStY2phpunit-mock-objects/Framework/MockObject/Stub.php FcS Y7phpunit-mock-objects/Framework/MockObject/Exception.php FcS ͚php-file-iterator/Iterator.phpcFcSc~ԃ&php-file-iterator/Iterator/Factory.phphFcShڶ%php-file-iterator/Iterator/Facade.phpFcSlca.pem -FcS -ssebastian-version/Version.php FcS Y +sebastian-comparator/DateTimeComparator.phpZFcSZ@Cp)sebastian-comparator/ScalarComparator.phpFcS_붶(sebastian-comparator/ArrayComparator.phpBFcSBj#sebastian-comparator/Comparator.phpFcS6*sebastian-comparator/NumericComparator.phpAFcSA۶*sebastian-comparator/ComparisonFailure.phpFcS "Ҷ)sebastian-comparator/DoubleComparator.phpFcSO)sebastian-comparator/ObjectComparator.phpFcSt sebastian-comparator/Factory.php7FcS7E,sebastian-comparator/ExceptionComparator.php FcS 3sebastian-comparator/SplObjectStorageComparator.phpFcS϶'sebastian-comparator/TypeComparator.php FcS -sebastian-comparator/MockObjectComparator.php FcS *)+*sebastian-comparator/DOMNodeComparator.phpFcS*+sebastian-comparator/ResourceComparator.phpVFcSV sebastian-diff/Parser.phpFcSH.wsebastian-diff/Line.php FcS pBsebastian-diff/Chunk.php FcS %sebastian-diff/Differ.php!FcS!ohrŶsebastian-diff/Diff.php FcS ̶,dbunit/Extensions/Database/DefaultTester.php FcS :&dbunit/Extensions/Database/ITester.phpFcSo;dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php FcS ʉ10dbunit/Extensions/Database/DB/ResultSetTable.php FcS [5dbunit/Extensions/Database/DB/IDatabaseConnection.phpFcSD+dbunit/Extensions/Database/DB/IMetaData.php6FcS6vi'dbunit/Extensions/Database/DB/Table.php FcS s5<dbunit/Extensions/Database/DB/MetaData/InformationSchema.phptFcStö0dbunit/Extensions/Database/DB/MetaData/MySQL.phpFcS01dbunit/Extensions/Database/DB/MetaData/Sqlite.php>FcS>=^ف.dbunit/Extensions/Database/DB/MetaData/Oci.phpVFcSV+ E0dbunit/Extensions/Database/DB/MetaData/PgSQL.phpFcSgĶ3dbunit/Extensions/Database/DB/MetaData/Firebird.phpFcSBp0dbunit/Extensions/Database/DB/MetaData/Dblib.php FcS {ڧ1dbunit/Extensions/Database/DB/MetaData/SqlSrv.phpFcS0 )dbunit/Extensions/Database/DB/DataSet.phpFcS`Wk/dbunit/Extensions/Database/DB/TableIterator.phpFcSl*dbunit/Extensions/Database/DB/MetaData.phpL FcSL !!1dbunit/Extensions/Database/DB/FilteredDataSet.phpM FcSM /dbunit/Extensions/Database/DB/TableMetaData.php FcS K1dbunit/Extensions/Database/DataSet/CsvDataSet.phpFcS/0(6dbunit/Extensions/Database/DataSet/Persistors/Yaml.phpFcSn:dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.phpFcSf]-9dbunit/Extensions/Database/DataSet/Persistors/FlatXml.phpjFcSj_9dbunit/Extensions/Database/DataSet/Persistors/Factory.phpFcS[̶:dbunit/Extensions/Database/DataSet/Persistors/Abstract.phpFcS75dbunit/Extensions/Database/DataSet/Persistors/Xml.phpFcSw:3dbunit/Extensions/Database/DataSet/DefaultTable.phpFcS2F5dbunit/Extensions/Database/DataSet/ITableIterator.php - FcS - "h-dbunit/Extensions/Database/DataSet/ITable.php FcS 9<dbunit/Extensions/Database/DataSet/AbstractTableMetaData.phpFcS7dbunit/Extensions/Database/DataSet/ReplacementTable.php3FcS3`藶,dbunit/Extensions/Database/DataSet/ISpec.php -FcS -fC6dbunit/Extensions/Database/DataSet/AbstractDataSet.phpFcS[9;dbunit/Extensions/Database/DataSet/DefaultTableMetaData.php FcS 1dbunit/Extensions/Database/DataSet/XmlDataSet.phpFcSLNȶ2dbunit/Extensions/Database/DataSet/IYamlParser.php FcS Cp7dbunit/Extensions/Database/DataSet/CompositeDataSet.phpFcSN=2dbunit/Extensions/Database/DataSet/TableFilter.phpFcS*E3dbunit/Extensions/Database/DataSet/IPersistable.php -FcS -?dbunit/Extensions/Database/DataSet/ReplacementTableIterator.phpFcSB! 5dbunit/Extensions/Database/DataSet/DefaultDataSet.php FcS kr0dbunit/Extensions/Database/DataSet/Specs/Csv.phpaFcSa=Kj1dbunit/Extensions/Database/DataSet/Specs/Yaml.php FcS SD\4dbunit/Extensions/Database/DataSet/Specs/FlatXml.php FcS .4dbunit/Extensions/Database/DataSet/Specs/Factory.php FcS >34dbunit/Extensions/Database/DataSet/Specs/DbQuery.phpFcS5v0dbunit/Extensions/Database/DataSet/Specs/Xml.php FcS )5T5dbunit/Extensions/Database/DataSet/Specs/IFactory.phpQ -FcSQ -f4dbunit/Extensions/Database/DataSet/Specs/DbTable.phpFcSJ3dbunit/Extensions/Database/DataSet/QueryDataSet.phpoFcSo1Г8dbunit/Extensions/Database/DataSet/SymfonyYamlParser.php -FcS -n| 2dbunit/Extensions/Database/DataSet/YamlDataSet.phpFcSL5dbunit/Extensions/Database/DataSet/FlatXmlDataSet.phpVFcSVN@Զ:dbunit/Extensions/Database/DataSet/TableMetaDataFilter.php*FcS* -۶/dbunit/Extensions/Database/DataSet/IDataSet.php FcS -oB4dbunit/Extensions/Database/DataSet/DataSetFilter.phpFcS_ƴ6dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.php/FcS/8o1dbunit/Extensions/Database/DataSet/QueryTable.phpFcS!9dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.phptFcSt3!5dbunit/Extensions/Database/DataSet/ITableMetaData.php8 FcS8 qjY9dbunit/Extensions/Database/DataSet/ReplacementDataSet.php`FcS`ք4dbunit/Extensions/Database/DataSet/AbstractTable.phpW!FcSW!|;dbunit/Extensions/Database/DataSet/DefaultTableIterator.phpFcSr-dbunit/Extensions/Database/AbstractTester.php$FcS$Q-dbunit/Extensions/Database/UI/ModeFactory.php)FcS)X.dbunit/Extensions/Database/UI/Mediums/Text.phpFcS2Zv)dbunit/Extensions/Database/UI/Command.phpR FcSR !B?dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.phpFcS'WҶ)dbunit/Extensions/Database/UI/IMedium.phpY FcSY 1.dbunit/Extensions/Database/UI/IModeFactory.php -FcS -F$6dbunit/Extensions/Database/UI/InvalidModeException.php FcS 0dbunit/Extensions/Database/UI/IMediumPrinter.php -FcS -)dbunit/Extensions/Database/UI/Context.php FcS c$4dbunit/Extensions/Database/IDatabaseListConsumer.phpA -FcSA -SӶ'dbunit/Extensions/Database/TestCase.php(%FcS(%s/dbunit/Extensions/Database/Operation/Delete.phpFcS2_Ͷ0dbunit/Extensions/Database/Operation/Replace.phpfFcSf8w@2dbunit/Extensions/Database/Operation/Composite.phpFcS9$ ;dbunit/Extensions/Database/Operation/IDatabaseOperation.php FcS f0dbunit/Extensions/Database/Operation/Factory.phpFcSt¶1dbunit/Extensions/Database/Operation/Truncate.php FcS p/dbunit/Extensions/Database/Operation/Insert.phpFcS-dbunit/Extensions/Database/Operation/Null.php -FcS -I9/dbunit/Extensions/Database/Operation/Update.phpFcS2dbunit/Extensions/Database/Operation/Exception.phpFcS2dbunit/Extensions/Database/Operation/DeleteAll.php FcS l+1dbunit/Extensions/Database/Operation/RowBased.php*FcS*+*Ҷ6dbunit/Extensions/Database/Constraint/TableIsEqual.phpdFcSdNjǶ7dbunit/Extensions/Database/Constraint/TableRowCount.phpc FcSc +/8dbunit/Extensions/Database/Constraint/DataSetIsEqual.phprFcSrT((dbunit/Extensions/Database/Exception.php -FcS -x -!php-invoker/Invoker.php&FcS&-顶(php-invoker/Invoker/TimeoutException.php FcS nphp-timer/Timer.php6FcS6#X60php-token-stream/Token/Stream/CachingFactory.php FcS Ӓն!php-token-stream/Token/Stream.phpuDFcSuDrSͶphp-token-stream/Token.php\FcS\C2}php-text-template/Template.phpFcS;$. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a risky test. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Framework_RiskyTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_RiskyTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Exception for expectations which failed their check. - * - * The exception contains the error message and optionally a - * SebastianBergmann\Comparator\ComparisonFailure which is used to - * generate diff output of the failed expectations. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_ExpectationFailedException extends PHPUnit_Framework_AssertionFailedError -{ - /** - * @var SebastianBergmann\Comparator\ComparisonFailure - */ - protected $comparisonFailure; - - public function __construct($message, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null, Exception $previous = null) - { - $this->comparisonFailure = $comparisonFailure; - - parent::__construct($message, 0, $previous); - } - - /** - * @return SebastianBergmann\Comparator\ComparisonFailure - */ - public function getComparisonFailure() - { - return $this->comparisonFailure; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a test that is skipped because of an invalid @covers annotation. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Framework_InvalidCoversTargetError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Interface for classes that can return a description of itself. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 3.0.0 - */ -interface PHPUnit_Framework_SelfDescribing -{ - /** - * Returns a string representation of the object. - * - * @return string - */ - public function toString(); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A marker interface for marking any exception/error as result of an unit - * test as incomplete implementation or currently not implemented. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 2.0.0 - */ -interface PHPUnit_Framework_IncompleteTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A TestFailure collects a failed test together with the caught exception. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_TestFailure -{ - /** - * @var PHPUnit_Framework_Test - */ - protected $failedTest; - - /** - * @var Exception - */ - protected $thrownException; - - /** - * Constructs a TestFailure with the given test and exception. - * - * @param PHPUnit_Framework_Test $failedTest - * @param Exception $thrownException - */ - public function __construct(PHPUnit_Framework_Test $failedTest, Exception $thrownException) - { - $this->failedTest = $failedTest; - $this->thrownException = $thrownException; - } - - /** - * Returns a short description of the failure. - * - * @return string - */ - public function toString() - { - return sprintf( - '%s: %s', - - $this->failedTest->toString(), - $this->thrownException->getMessage() - ); - } - - /** - * Returns a description for the thrown exception. - * - * @return string - * @since Method available since Release 3.4.0 - */ - public function getExceptionAsString() - { - return self::exceptionToString($this->thrownException); - } - - /** - * Returns a description for an exception. - * - * @param Exception $e - * @return string - * @since Method available since Release 3.2.0 - */ - public static function exceptionToString(Exception $e) - { - if ($e instanceof PHPUnit_Framework_SelfDescribing) { - $buffer = $e->toString(); - - if ($e instanceof PHPUnit_Framework_ExpectationFailedException && $e->getComparisonFailure()) { - $buffer = $buffer . $e->getComparisonFailure()->getDiff(); - } - - if (!empty($buffer)) { - $buffer = trim($buffer) . "\n"; - } - } elseif ($e instanceof PHPUnit_Framework_Error) { - $buffer = $e->getMessage() . "\n"; - } else { - $buffer = get_class($e) . ': ' . $e->getMessage() . "\n"; - } - - return $buffer; - } - - /** - * Gets the failed test. - * - * @return PHPUnit_Framework_Test - */ - public function failedTest() - { - return $this->failedTest; - } - - /** - * Gets the thrown exception. - * - * @return Exception - */ - public function thrownException() - { - return $this->thrownException; - } - - /** - * Returns the exception's message. - * - * @return string - */ - public function exceptionMessage() - { - return $this->thrownException()->getMessage(); - } - - /** - * Returns true if the thrown exception - * is of type AssertionFailedError. - * - * @return boolean - */ - public function isFailure() - { - return ($this->thrownException() instanceof PHPUnit_Framework_AssertionFailedError); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -use SebastianBergmann\Exporter\Exporter; - -/** - * Abstract base class for constraints. which are placed upon any value. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 3.0.0 - */ -abstract class PHPUnit_Framework_Constraint implements Countable, PHPUnit_Framework_SelfDescribing -{ - protected $exporter; - - public function __construct() - { - $this->exporter = new Exporter; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = false; - - if ($this->matches($other)) { - $success = true; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return false; - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.4.0 - */ - public function count() - { - return 1; - } - - /** - * Throws an exception for the given compared value and test description - * - * @param mixed $other Evaluated value or object. - * @param string $description Additional information about the test - * @param SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure - * @throws PHPUnit_Framework_ExpectationFailedException - */ - protected function fail($other, $description, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null) - { - $failureDescription = sprintf( - 'Failed asserting that %s.', - $this->failureDescription($other) - ); - - $additionalFailureDescription = $this->additionalFailureDescription($other); - - if ($additionalFailureDescription) { - $failureDescription .= "\n" . $additionalFailureDescription; - } - - if (!empty($description)) { - $failureDescription = $description . "\n" . $failureDescription; - } - - throw new PHPUnit_Framework_ExpectationFailedException( - $failureDescription, - $comparisonFailure - ); - } - - /** - * Return additional failure description where needed - * - * The function can be overridden to provide additional failure - * information like a diff - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function additionalFailureDescription($other) - { - return ''; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * To provide additional failure information additionalFailureDescription - * can be used. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return $this->exporter->export($other) . ' ' . $this->toString(); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Framework_InvalidCoversTargetException extends PHPUnit_Framework_CodeCoverageException -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a skipped test. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of an incomplete test. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A Listener for test progress. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 2.0.0 - */ -interface PHPUnit_Framework_TestListener -{ - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time); - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time); - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time); - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time); - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time); - - /** - * A test suite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite); - - /** - * A test suite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite); - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test); - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.0 - */ - -/** - * Returns a matcher that matches when the method it is evaluated for - * is executed zero or more times. - * - * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount - * @since Method available since Release 3.0.0 - */ -function any() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::any', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object. - * - * @return PHPUnit_Framework_Constraint_IsAnything - * @since Method available since Release 3.0.0 - */ -function anything() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::anything', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object. - * - * @param mixed $key - * @return PHPUnit_Framework_Constraint_ArrayHasKey - * @since Method available since Release 3.0.0 - */ -function arrayHasKey($key) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::arrayHasKey', - func_get_args() - ); -} - -/** - * Asserts that an array has a specified key. - * - * @param mixed $key - * @param array|ArrayAccess $array - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertArrayHasKey($key, $array, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertArrayHasKey', - func_get_args() - ); -} - -/** - * Asserts that an array does not have a specified key. - * - * @param mixed $key - * @param array|ArrayAccess $array - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertArrayNotHasKey($key, $array, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertArrayNotHasKey', - func_get_args() - ); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains a needle. - * - * @param mixed $needle - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 3.0.0 - */ -function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeContains', - func_get_args() - ); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains only values of a given type. - * - * @param string $type - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ -function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeContainsOnly', - func_get_args() - ); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param integer $expectedCount - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.6.0 - */ -function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeCount', - func_get_args() - ); -} - -/** - * Asserts that a static attribute of a class or an attribute of an object - * is empty. - * - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeEmpty', - func_get_args() - ); -} - -/** - * Asserts that a variable is equal to an attribute of an object. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ -function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeEquals', - func_get_args() - ); -} - -/** - * Asserts that an attribute is greater than another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeGreaterThan', - func_get_args() - ); -} - -/** - * Asserts that an attribute is greater than or equal to another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual', - func_get_args() - ); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeInstanceOf', - func_get_args() - ); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeInternalType', - func_get_args() - ); -} - -/** - * Asserts that an attribute is smaller than another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeLessThan', - func_get_args() - ); -} - -/** - * Asserts that an attribute is smaller than or equal to another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual', - func_get_args() - ); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain a needle. - * - * @param mixed $needle - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 3.0.0 - */ -function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotContains', - func_get_args() - ); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain only values of a given - * type. - * - * @param string $type - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ -function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotContainsOnly', - func_get_args() - ); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param integer $expectedCount - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.6.0 - */ -function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotCount', - func_get_args() - ); -} - -/** - * Asserts that a static attribute of a class or an attribute of an object - * is not empty. - * - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotEmpty', - func_get_args() - ); -} - -/** - * Asserts that a variable is not equal to an attribute of an object. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ -function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotEquals', - func_get_args() - ); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotInstanceOf', - func_get_args() - ); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotInternalType', - func_get_args() - ); -} - -/** - * Asserts that a variable and an attribute of an object do not have the - * same type and value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param object $actualClassOrObject - * @param string $message - */ -function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeNotSame', - func_get_args() - ); -} - -/** - * Asserts that a variable and an attribute of an object have the same type - * and value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param object $actualClassOrObject - * @param string $message - */ -function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertAttributeSame', - func_get_args() - ); -} - -/** - * Asserts that a class has a specified attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertClassHasAttribute($attributeName, $className, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertClassHasAttribute', - func_get_args() - ); -} - -/** - * Asserts that a class has a specified static attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertClassHasStaticAttribute($attributeName, $className, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertClassHasStaticAttribute', - func_get_args() - ); -} - -/** - * Asserts that a class does not have a specified attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertClassNotHasAttribute($attributeName, $className, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertClassNotHasAttribute', - func_get_args() - ); -} - -/** - * Asserts that a class does not have a specified static attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertClassNotHasStaticAttribute($attributeName, $className, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute', - func_get_args() - ); -} - -/** - * Asserts that a haystack contains a needle. - * - * @param mixed $needle - * @param mixed $haystack - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 2.1.0 - */ -function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertContains', - func_get_args() - ); -} - -/** - * Asserts that a haystack contains only values of a given type. - * - * @param string $type - * @param mixed $haystack - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ -function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertContainsOnly', - func_get_args() - ); -} - -/** - * Asserts that a haystack contains only instances of a given classname - * - * @param string $classname - * @param array|Traversable $haystack - * @param string $message - */ -function assertContainsOnlyInstancesOf($classname, $haystack, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf', - func_get_args() - ); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param integer $expectedCount - * @param mixed $haystack - * @param string $message - */ -function assertCount($expectedCount, $haystack, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertCount', - func_get_args() - ); -} - -/** - * Asserts that a variable is empty. - * - * @param mixed $actual - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertEmpty($actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertEmpty', - func_get_args() - ); -} - -/** - * Asserts that a hierarchy of DOMElements matches. - * - * @param DOMElement $expectedElement - * @param DOMElement $actualElement - * @param boolean $checkAttributes - * @param string $message - * @author Mattis Stordalen Flister - * @since Method available since Release 3.3.0 - */ -function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertEqualXMLStructure', - func_get_args() - ); -} - -/** - * Asserts that two variables are equal. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ -function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertEquals', - func_get_args() - ); -} - -/** - * Asserts that a condition is not true. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertNotTrue($condition, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotTrue', - func_get_args() - ); -} - -/** - * Asserts that a condition is false. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertFalse($condition, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertFalse', - func_get_args() - ); -} - -/** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @param string $expected - * @param string $actual - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.2.14 - */ -function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertFileEquals', - func_get_args() - ); -} - -/** - * Asserts that a file exists. - * - * @param string $filename - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertFileExists($filename, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertFileExists', - func_get_args() - ); -} - -/** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @param string $expected - * @param string $actual - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.2.14 - */ -function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertFileNotEquals', - func_get_args() - ); -} - -/** - * Asserts that a file does not exist. - * - * @param string $filename - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertFileNotExists($filename, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertFileNotExists', - func_get_args() - ); -} - -/** - * Asserts that a value is greater than another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertGreaterThan($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertGreaterThan', - func_get_args() - ); -} - -/** - * Asserts that a value is greater than or equal to another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertGreaterThanOrEqual($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertGreaterThanOrEqual', - func_get_args() - ); -} - -/** - * Asserts that a variable is of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertInstanceOf($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertInstanceOf', - func_get_args() - ); -} - -/** - * Asserts that a variable is of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertInternalType($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertInternalType', - func_get_args() - ); -} - -/** - * Asserts that a string is a valid JSON string. - * - * @param string $filename - * @param string $message - * @since Method available since Release 3.7.20 - */ -function assertJson($expectedJson, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJson', - func_get_args() - ); -} - -/** - * Asserts that two JSON files are equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - */ -function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile', - func_get_args() - ); -} - -/** - * Asserts that two JSON files are not equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - */ -function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile', - func_get_args() - ); -} - -/** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @param string $expectedFile - * @param string $actualJson - * @param string $message - */ -function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile', - func_get_args() - ); -} - -/** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @param string $expectedJson - * @param string $actualJson - * @param string $message - */ -function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString', - func_get_args() - ); -} - -/** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @param string $expectedFile - * @param string $actualJson - * @param string $message - */ -function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile', - func_get_args() - ); -} - -/** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @param string $expectedJson - * @param string $actualJson - * @param string $message - */ -function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString', - func_get_args() - ); -} - -/** - * Asserts that a value is smaller than another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertLessThan($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertLessThan', - func_get_args() - ); -} - -/** - * Asserts that a value is smaller than or equal to another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertLessThanOrEqual($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertLessThanOrEqual', - func_get_args() - ); -} - -/** - * Asserts that a haystack does not contain a needle. - * - * @param mixed $needle - * @param mixed $haystack - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 2.1.0 - */ -function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotContains', - func_get_args() - ); -} - -/** - * Asserts that a haystack does not contain only values of a given type. - * - * @param string $type - * @param mixed $haystack - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ -function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotContainsOnly', - func_get_args() - ); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param integer $expectedCount - * @param mixed $haystack - * @param string $message - */ -function assertNotCount($expectedCount, $haystack, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotCount', - func_get_args() - ); -} - -/** - * Asserts that a variable is not empty. - * - * @param mixed $actual - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertNotEmpty($actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotEmpty', - func_get_args() - ); -} - -/** - * Asserts that two variables are not equal. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 2.3.0 - */ -function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotEquals', - func_get_args() - ); -} - -/** - * Asserts that a variable is not of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertNotInstanceOf($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotInstanceOf', - func_get_args() - ); -} - -/** - * Asserts that a variable is not of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertNotInternalType($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotInternalType', - func_get_args() - ); -} - -/** - * Asserts that a condition is not false. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertNotFalse($condition, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotFalse', - func_get_args() - ); -} - -/** - * Asserts that a variable is not null. - * - * @param mixed $actual - * @param string $message - */ -function assertNotNull($actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotNull', - func_get_args() - ); -} - -/** - * Asserts that a string does not match a given regular expression. - * - * @param string $pattern - * @param string $string - * @param string $message - * @since Method available since Release 2.1.0 - */ -function assertNotRegExp($pattern, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotRegExp', - func_get_args() - ); -} - -/** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - */ -function assertNotSame($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotSame', - func_get_args() - ); -} - -/** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @param array|Countable|Traversable $expected - * @param array|Countable|Traversable $actual - * @param string $message - */ -function assertNotSameSize($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotSameSize', - func_get_args() - ); -} - -/** - * This assertion is the exact opposite of assertTag(). - * - * Rather than asserting that $matcher results in a match, it asserts that - * $matcher does not match. - * - * @param array $matcher - * @param string $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ -function assertNotTag($matcher, $actual, $message = '', $isHtml = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNotTag', - func_get_args() - ); -} - -/** - * Asserts that a variable is null. - * - * @param mixed $actual - * @param string $message - */ -function assertNull($actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertNull', - func_get_args() - ); -} - -/** - * Asserts that an object has a specified attribute. - * - * @param string $attributeName - * @param object $object - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertObjectHasAttribute($attributeName, $object, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertObjectHasAttribute', - func_get_args() - ); -} - -/** - * Asserts that an object does not have a specified attribute. - * - * @param string $attributeName - * @param object $object - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertObjectNotHasAttribute($attributeName, $object, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertObjectNotHasAttribute', - func_get_args() - ); -} - -/** - * Asserts that a string matches a given regular expression. - * - * @param string $pattern - * @param string $string - * @param string $message - */ -function assertRegExp($pattern, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertRegExp', - func_get_args() - ); -} - -/** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - */ -function assertSame($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertSame', - func_get_args() - ); -} - -/** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @param array|Countable|Traversable $expected - * @param array|Countable|Traversable $actual - * @param string $message - */ -function assertSameSize($expected, $actual, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertSameSize', - func_get_args() - ); -} - -/** - * Assert the presence, absence, or count of elements in a document matching - * the CSS $selector, regardless of the contents of those elements. - * - * The first argument, $selector, is the CSS selector used to match - * the elements in the $actual document. - * - * The second argument, $count, can be either boolean or numeric. - * When boolean, it asserts for presence of elements matching the selector - * (true) or absence of elements (false). - * When numeric, it asserts the count of elements. - * - * assertSelectCount("#binder", true, $xml); // any? - * assertSelectCount(".binder", 3, $xml); // exactly 3? - * - * @param array $selector - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ -function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertSelectCount', - func_get_args() - ); -} - -/** - * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any? - * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none? - * - * @param array $selector - * @param string $content - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ -function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertSelectEquals', - func_get_args() - ); -} - -/** - * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any? - * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml);// 3? - * - * @param array $selector - * @param string $pattern - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ -function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertSelectRegExp', - func_get_args() - ); -} - -/** - * Asserts that a string ends not with a given prefix. - * - * @param string $suffix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ -function assertStringEndsNotWith($suffix, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringEndsNotWith', - func_get_args() - ); -} - -/** - * Asserts that a string ends with a given prefix. - * - * @param string $suffix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ -function assertStringEndsWith($suffix, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringEndsWith', - func_get_args() - ); -} - -/** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @param string $expectedFile - * @param string $actualString - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.3.0 - */ -function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringEqualsFile', - func_get_args() - ); -} - -/** - * Asserts that a string matches a given format string. - * - * @param string $format - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertStringMatchesFormat($format, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringMatchesFormat', - func_get_args() - ); -} - -/** - * Asserts that a string matches a given format file. - * - * @param string $formatFile - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertStringMatchesFormatFile($formatFile, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringMatchesFormatFile', - func_get_args() - ); -} - -/** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @param string $expectedFile - * @param string $actualString - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.3.0 - */ -function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringNotEqualsFile', - func_get_args() - ); -} - -/** - * Asserts that a string does not match a given format string. - * - * @param string $format - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertStringNotMatchesFormat($format, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringNotMatchesFormat', - func_get_args() - ); -} - -/** - * Asserts that a string does not match a given format string. - * - * @param string $formatFile - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ -function assertStringNotMatchesFormatFile($formatFile, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile', - func_get_args() - ); -} - -/** - * Asserts that a string starts not with a given prefix. - * - * @param string $prefix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ -function assertStringStartsNotWith($prefix, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringStartsNotWith', - func_get_args() - ); -} - -/** - * Asserts that a string starts with a given prefix. - * - * @param string $prefix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ -function assertStringStartsWith($prefix, $string, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertStringStartsWith', - func_get_args() - ); -} - -/** - * Evaluate an HTML or XML string and assert its structure and/or contents. - * - * The first argument ($matcher) is an associative array that specifies the - * match criteria for the assertion: - * - * - `id` : the node with the given id attribute must match the - * corresponding value. - * - `tag` : the node type must match the corresponding value. - * - `attributes` : a hash. The node's attributes must match the - * corresponding values in the hash. - * - `content` : The text content must match the given value. - * - `parent` : a hash. The node's parent must match the - * corresponding hash. - * - `child`: a hash. At least one of the node's immediate children - * must meet the criteria described by the hash. - * - `ancestor` : a hash. At least one of the node's ancestors must - * meet the criteria described by the hash. - * - `descendant` : a hash. At least one of the node's descendants must - * meet the criteria described by the hash. - * - `children` : a hash, for counting children of a node. - * Accepts the keys: - *- `count`: a number which must equal the number of children - * that match - *- `less_than`: the number of matching children must be greater - * than this number - *- `greater_than` : the number of matching children must be less than - * this number - *- `only` : another hash consisting of the keys to use to match - * on the children, and only matching children will be - * counted - * - * - * // Matcher that asserts that there is an element with an id="my_id". - * $matcher = array('id' => 'my_id'); - * - * // Matcher that asserts that there is a "span" tag. - * $matcher = array('tag' => 'span'); - * - * // Matcher that asserts that there is a "span" tag with the content - * // "Hello World". - * $matcher = array('tag' => 'span', 'content' => 'Hello World'); - * - * // Matcher that asserts that there is a "span" tag with content matching - * // the regular expression pattern. - * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/'); - * - * // Matcher that asserts that there is a "span" with an "list" class - * // attribute. - * $matcher = array( - * 'tag'=> 'span', - * 'attributes' => array('class' => 'list') - * ); - * - * // Matcher that asserts that there is a "span" inside of a "div". - * $matcher = array( - * 'tag'=> 'span', - * 'parent' => array('tag' => 'div') - * ); - * - * // Matcher that asserts that there is a "span" somewhere inside a - * // "table". - * $matcher = array( - * 'tag' => 'span', - * 'ancestor' => array('tag' => 'table') - * ); - * - * // Matcher that asserts that there is a "span" with at least one "em" - * // child. - * $matcher = array( - * 'tag' => 'span', - * 'child' => array('tag' => 'em') - * ); - * - * // Matcher that asserts that there is a "span" containing a (possibly - * // nested) "strong" tag. - * $matcher = array( - * 'tag'=> 'span', - * 'descendant' => array('tag' => 'strong') - * ); - * - * // Matcher that asserts that there is a "span" containing 5-10 "em" tags - * // as immediate children. - * $matcher = array( - * 'tag' => 'span', - * 'children' => array( - * 'less_than'=> 11, - * 'greater_than' => 4, - * 'only' => array('tag' => 'em') - * ) - * ); - * - * // Matcher that asserts that there is a "div", with an "ul" ancestor and - * // a "li" parent (with class="enum"), and containing a "span" descendant - * // that contains an element with id="my_test" and the text "Hello World". - * $matcher = array( - * 'tag'=> 'div', - * 'ancestor' => array('tag' => 'ul'), - * 'parent' => array( - * 'tag'=> 'li', - * 'attributes' => array('class' => 'enum') - * ), - * 'descendant' => array( - * 'tag' => 'span', - * 'child' => array( - * 'id' => 'my_test', - * 'content' => 'Hello World' - * ) - * ) - * ); - * - * // Use assertTag() to apply a $matcher to a piece of $html. - * $this->assertTag($matcher, $html); - * - * // Use assertTag() to apply a $matcher to a piece of $xml. - * $this->assertTag($matcher, $xml, '', false); - * - * - * The second argument ($actual) is a string containing either HTML or - * XML text to be tested. - * - * The third argument ($message) is an optional message that will be - * used if the assertion fails. - * - * The fourth argument ($html) is an optional flag specifying whether - * to load the $actual string into a DOMDocument using the HTML or - * XML load strategy. It is true by default, which assumes the HTML - * load strategy. In many cases, this will be acceptable for XML as well. - * - * @param array $matcher - * @param string $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ -function assertTag($matcher, $actual, $message = '', $isHtml = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertTag', - func_get_args() - ); -} - -/** - * Evaluates a PHPUnit_Framework_Constraint matcher object. - * - * @param mixed$value - * @param PHPUnit_Framework_Constraint $constraint - * @param string $message - * @since Method available since Release 3.0.0 - */ -function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertThat', - func_get_args() - ); -} - -/** - * Asserts that a condition is true. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ -function assertTrue($condition, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertTrue', - func_get_args() - ); -} - -/** - * Asserts that two XML files are equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile', - func_get_args() - ); -} - -/** - * Asserts that two XML files are not equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile', - func_get_args() - ); -} - -/** - * Asserts that two XML documents are equal. - * - * @param string $expectedFile - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.3.0 - */ -function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile', - func_get_args() - ); -} - -/** - * Asserts that two XML documents are equal. - * - * @param string $expectedXml - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString', - func_get_args() - ); -} - -/** - * Asserts that two XML documents are not equal. - * - * @param string $expectedFile - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.3.0 - */ -function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile', - func_get_args() - ); -} - -/** - * Asserts that two XML documents are not equal. - * - * @param string $expectedXml - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.1.0 - */ -function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '') -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString', - func_get_args() - ); -} - -/** - * Returns a matcher that matches when the method it is evaluated for - * is invoked at the given $index. - * - * @param integer $index - * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex - * @since Method available since Release 3.0.0 - */ -function at($index) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::at', - func_get_args() - ); -} - -/** - * Returns a matcher that matches when the method it is evaluated for - * is executed at least once. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce - * @since Method available since Release 3.0.0 - */ -function atLeastOnce() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::atLeastOnce', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Attribute matcher object. - * - * @param PHPUnit_Framework_Constraint $constraint - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_Attribute - * @since Method available since Release 3.1.0 - */ -function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::attribute', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object - * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher - * object. - * - * @param string $attributeName - * @param mixed $value - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @return PHPUnit_Framework_Constraint_Attribute - * @since Method available since Release 3.1.0 - */ -function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::attributeEqualTo', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Callback matcher object. - * - * @param callable $callback - * @return PHPUnit_Framework_Constraint_Callback - */ -function callback($callback) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::callback', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ClassHasAttribute - * @since Method available since Release 3.1.0 - */ -function classHasAttribute($attributeName) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::classHasAttribute', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher - * object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute - * @since Method available since Release 3.1.0 - */ -function classHasStaticAttribute($attributeName) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::classHasStaticAttribute', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher - * object. - * - * @param mixed $value - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @return PHPUnit_Framework_Constraint_TraversableContains - * @since Method available since Release 3.0.0 - */ -function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::contains', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher - * object. - * - * @param string $type - * @return PHPUnit_Framework_Constraint_TraversableContainsOnly - * @since Method available since Release 3.1.4 - */ -function containsOnly($type) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::containsOnly', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher - * object. - * - * @param string $classname - * @return PHPUnit_Framework_Constraint_TraversableContainsOnly - */ -function containsOnlyInstancesOf($classname) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::containsOnlyInstancesOf', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object. - * - * @param mixed $value - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @return PHPUnit_Framework_Constraint_IsEqual - * @since Method available since Release 3.0.0 - */ -function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::equalTo', - func_get_args() - ); -} - -/** - * Returns a matcher that matches when the method it is evaluated for - * is executed exactly $count times. - * - * @param integer $count - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ -function exactly($count) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::exactly', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_FileExists matcher object. - * - * @return PHPUnit_Framework_Constraint_FileExists - * @since Method available since Release 3.0.0 - */ -function fileExists() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::fileExists', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_GreaterThan - * @since Method available since Release 3.0.0 - */ -function greaterThan($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::greaterThan', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps - * a PHPUnit_Framework_Constraint_IsEqual and a - * PHPUnit_Framework_Constraint_GreaterThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.1.0 - */ -function greaterThanOrEqual($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::greaterThanOrEqual', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_IsIdentical - * @since Method available since Release 3.0.0 - */ -function identicalTo($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::identicalTo', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object. - * - * @return PHPUnit_Framework_Constraint_IsEmpty - * @since Method available since Release 3.5.0 - */ -function isEmpty() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isEmpty', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object. - * - * @return PHPUnit_Framework_Constraint_IsFalse - * @since Method available since Release 3.3.0 - */ -function isFalse() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isFalse', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object. - * - * @param string $className - * @return PHPUnit_Framework_Constraint_IsInstanceOf - * @since Method available since Release 3.0.0 - */ -function isInstanceOf($className) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isInstanceOf', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsJson matcher object. - * - * @return PHPUnit_Framework_Constraint_IsJson - * @since Method available since Release 3.7.20 - */ -function isJson() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isJson', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsNull matcher object. - * - * @return PHPUnit_Framework_Constraint_IsNull - * @since Method available since Release 3.3.0 - */ -function isNull() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isNull', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object. - * - * @return PHPUnit_Framework_Constraint_IsTrue - * @since Method available since Release 3.3.0 - */ -function isTrue() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isTrue', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_IsType matcher object. - * - * @param string $type - * @return PHPUnit_Framework_Constraint_IsType - * @since Method available since Release 3.0.0 - */ -function isType($type) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::isType', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_LessThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_LessThan - * @since Method available since Release 3.0.0 - */ -function lessThan($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::lessThan', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps - * a PHPUnit_Framework_Constraint_IsEqual and a - * PHPUnit_Framework_Constraint_LessThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.1.0 - */ -function lessThanOrEqual($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::lessThanOrEqual', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_And matcher object. - * - * @return PHPUnit_Framework_Constraint_And - * @since Method available since Release 3.0.0 - */ -function logicalAnd() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::logicalAnd', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Not matcher object. - * - * @param PHPUnit_Framework_Constraint $constraint - * @return PHPUnit_Framework_Constraint_Not - * @since Method available since Release 3.0.0 - */ -function logicalNot(PHPUnit_Framework_Constraint $constraint) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::logicalNot', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Or matcher object. - * - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.0.0 - */ -function logicalOr() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::logicalOr', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_Xor matcher object. - * - * @return PHPUnit_Framework_Constraint_Xor - * @since Method available since Release 3.0.0 - */ -function logicalXor() -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::logicalXor', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object. - * - * @param string $string - * @return PHPUnit_Framework_Constraint_StringMatches - * @since Method available since Release 3.5.0 - */ -function matches($string) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::matches', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object. - * - * @param string $pattern - * @return PHPUnit_Framework_Constraint_PCREMatch - * @since Method available since Release 3.0.0 - */ -function matchesRegularExpression($pattern) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::matchesRegularExpression', - func_get_args() - ); -} - -/** - * Returns a matcher that matches when the method it is evaluated for - * is never executed. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ -function never() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::never', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ObjectHasAttribute - * @since Method available since Release 3.0.0 - */ -function objectHasAttribute($attributeName) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::objectHasAttribute', - func_get_args() - ); -} - -/** - * @param mixed $value, ... - * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls - * @since Method available since Release 3.0.0 - */ -function onConsecutiveCalls() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::onConsecutiveCalls', - func_get_args() - ); -} - -/** - * Returns a matcher that matches when the method it is evaluated for - * is executed exactly once. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ -function once() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::once', - func_get_args() - ); -} - -/** - * - * - * @param integer $argumentIndex - * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument - * @since Method available since Release 3.3.0 - */ -function returnArgument($argumentIndex) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::returnArgument', - func_get_args() - ); -} - -/** - * - * - * @param mixed $callback - * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback - * @since Method available since Release 3.3.0 - */ -function returnCallback($callback) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::returnCallback', - func_get_args() - ); -} - -/** - * Returns the current object. - * - * This method is useful when mocking a fluent interface. - * - * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf - * @since Method available since Release 3.6.0 - */ -function returnSelf() -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::returnSelf', - func_get_args() - ); -} - -/** - * - * - * @param mixed $value - * @return PHPUnit_Framework_MockObject_Stub_Return - * @since Method available since Release 3.0.0 - */ -function returnValue($value) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::returnValue', - func_get_args() - ); -} - -/** - * - * - * @param array $valueMap - * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap - * @since Method available since Release 3.6.0 - */ -function returnValueMap(array $valueMap) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::returnValueMap', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_StringContains matcher object. - * - * @param string $string - * @param boolean $case - * @return PHPUnit_Framework_Constraint_StringContains - * @since Method available since Release 3.0.0 - */ -function stringContains($string, $case = true) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::stringContains', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object. - * - * @param mixed $suffix - * @return PHPUnit_Framework_Constraint_StringEndsWith - * @since Method available since Release 3.4.0 - */ -function stringEndsWith($suffix) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::stringEndsWith', - func_get_args() - ); -} - -/** - * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object. - * - * @param mixed $prefix - * @return PHPUnit_Framework_Constraint_StringStartsWith - * @since Method available since Release 3.4.0 - */ -function stringStartsWith($prefix) -{ - return call_user_func_array( - 'PHPUnit_Framework_Assert::stringStartsWith', - func_get_args() - ); -} - -/** - * - * - * @param Exception $exception - * @return PHPUnit_Framework_MockObject_Stub_Exception - * @since Method available since Release 3.1.0 - */ -function throwException(Exception $exception) -{ - return call_user_func_array( - 'PHPUnit_Framework_TestCase::throwException', - func_get_args() - ); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A TestResult collects the results of executing a test case. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_TestResult implements Countable -{ - /** - * @var array - */ - protected $passed = array(); - - /** - * @var array - */ - protected $errors = array(); - - /** - * @var array - */ - protected $deprecatedFeatures = array(); - - /** - * @var array - */ - protected $failures = array(); - - /** - * @var array - */ - protected $notImplemented = array(); - - /** - * @var array - */ - protected $risky = array(); - - /** - * @var array - */ - protected $skipped = array(); - - /** - * @var array - */ - protected $listeners = array(); - - /** - * @var integer - */ - protected $runTests = 0; - - /** - * @var float - */ - protected $time = 0; - - /** - * @var PHPUnit_Framework_TestSuite - */ - protected $topTestSuite = null; - - /** - * Code Coverage information. - * - * @var PHP_CodeCoverage - */ - protected $codeCoverage; - - /** - * @var boolean - */ - protected $convertErrorsToExceptions = true; - - /** - * @var boolean - */ - protected $stop = false; - - /** - * @var boolean - */ - protected $stopOnError = false; - - /** - * @var boolean - */ - protected $stopOnFailure = false; - - /** - * @var boolean - */ - protected $beStrictAboutTestsThatDoNotTestAnything = false; - - /** - * @var boolean - */ - protected $beStrictAboutOutputDuringTests = false; - - /** - * @var boolean - */ - protected $beStrictAboutTestSize = false; - - /** - * @var boolean - */ - protected $stopOnRisky = false; - - /** - * @var boolean - */ - protected $stopOnIncomplete = false; - - /** - * @var boolean - */ - protected $stopOnSkipped = false; - - /** - * @var boolean - */ - protected $lastTestFailed = false; - - /** - * @var integer - */ - protected $timeoutForSmallTests = 1; - - /** - * @var integer - */ - protected $timeoutForMediumTests = 10; - - /** - * @var integer - */ - protected $timeoutForLargeTests = 60; - - /** - * Registers a TestListener. - * - * @param PHPUnit_Framework_TestListener - */ - public function addListener(PHPUnit_Framework_TestListener $listener) - { - $this->listeners[] = $listener; - } - - /** - * Unregisters a TestListener. - * - * @param PHPUnit_Framework_TestListener $listener - */ - public function removeListener(PHPUnit_Framework_TestListener $listener) - { - foreach ($this->listeners as $key => $_listener) { - if ($listener === $_listener) { - unset($this->listeners[$key]); - } - } - } - - /** - * Flushes all flushable TestListeners. - * - * @since Method available since Release 3.0.0 - */ - public function flushListeners() - { - foreach ($this->listeners as $listener) { - if ($listener instanceof PHPUnit_Util_Printer) { - $listener->flush(); - } - } - } - - /** - * Adds an error to the list of errors. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($e instanceof PHPUnit_Framework_RiskyTest) { - $this->risky[] = new PHPUnit_Framework_TestFailure( - $test, $e - ); - - $notifyMethod = 'addRiskyTest'; - - if ($this->stopOnRisky) { - $this->stop(); - } - } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) { - $this->notImplemented[] = new PHPUnit_Framework_TestFailure( - $test, $e - ); - - $notifyMethod = 'addIncompleteTest'; - - if ($this->stopOnIncomplete) { - $this->stop(); - } - } elseif ($e instanceof PHPUnit_Framework_SkippedTest) { - $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e); - $notifyMethod = 'addSkippedTest'; - - if ($this->stopOnSkipped) { - $this->stop(); - } - } else { - $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e); - $notifyMethod = 'addError'; - - if ($this->stopOnError || $this->stopOnFailure) { - $this->stop(); - } - } - - foreach ($this->listeners as $listener) { - $listener->$notifyMethod($test, $e, $time); - } - - $this->lastTestFailed = true; - $this->time += $time; - } - - /** - * Adds a failure to the list of failures. - * The passed in exception caused the failure. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - if ($e instanceof PHPUnit_Framework_RiskyTest) { - $this->risky[] = new PHPUnit_Framework_TestFailure( - $test, $e - ); - - $notifyMethod = 'addRiskyTest'; - - if ($this->stopOnRisky) { - $this->stop(); - } - } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) { - $this->notImplemented[] = new PHPUnit_Framework_TestFailure( - $test, $e - ); - - $notifyMethod = 'addIncompleteTest'; - - if ($this->stopOnIncomplete) { - $this->stop(); - } - } elseif ($e instanceof PHPUnit_Framework_SkippedTest) { - $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e); - $notifyMethod = 'addSkippedTest'; - - if ($this->stopOnSkipped) { - $this->stop(); - } - } else { - $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e); - $notifyMethod = 'addFailure'; - - if ($this->stopOnFailure) { - $this->stop(); - } - } - - foreach ($this->listeners as $listener) { - $listener->$notifyMethod($test, $e, $time); - } - - $this->lastTestFailed = true; - $this->time += $time; - } - - /** - * Adds a deprecated feature notice to the list of deprecated features used during run - * - * @param PHPUnit_Util_DeprecatedFeature $deprecatedFeature - */ - public function addDeprecatedFeature(PHPUnit_Util_DeprecatedFeature $deprecatedFeature) - { - $this->deprecatedFeatures[] = $deprecatedFeature; - } - - /** - * Informs the result that a testsuite will be started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - if ($this->topTestSuite === null) { - $this->topTestSuite = $suite; - } - - foreach ($this->listeners as $listener) { - $listener->startTestSuite($suite); - } - } - - /** - * Informs the result that a testsuite was completed. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - foreach ($this->listeners as $listener) { - $listener->endTestSuite($suite); - } - } - - /** - * Informs the result that a test will be started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - $this->lastTestFailed = false; - $this->runTests += count($test); - - foreach ($this->listeners as $listener) { - $listener->startTest($test); - } - } - - /** - * Informs the result that a test was completed. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - foreach ($this->listeners as $listener) { - $listener->endTest($test, $time); - } - - if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) { - $class = get_class($test); - $key = $class . '::' . $test->getName(); - - $this->passed[$key] = array( - 'result' => $test->getResult(), - 'size' => PHPUnit_Util_Test::getSize( - $class, $test->getName(false) - ) - ); - - $this->time += $time; - } - } - - /** - * Returns true if no risky test occurred. - * - * @return boolean - * @since Method available since Release 4.0.0 - */ - public function allHarmless() - { - return $this->riskyCount() == 0; - } - - /** - * Gets the number of risky tests. - * - * @return integer - * @since Method available since Release 4.0.0 - */ - public function riskyCount() - { - return count($this->risky); - } - - /** - * Returns true if no incomplete test occurred. - * - * @return boolean - */ - public function allCompletelyImplemented() - { - return $this->notImplementedCount() == 0; - } - - /** - * Gets the number of incomplete tests. - * - * @return integer - */ - public function notImplementedCount() - { - return count($this->notImplemented); - } - - /** - * Returns an Enumeration for the risky tests. - * - * @return array - * @since Method available since Release 4.0.0 - */ - public function risky() - { - return $this->risky; - } - - /** - * Returns an Enumeration for the incomplete tests. - * - * @return array - */ - public function notImplemented() - { - return $this->notImplemented; - } - - /** - * Returns true if no test has been skipped. - * - * @return boolean - * @since Method available since Release 3.0.0 - */ - public function noneSkipped() - { - return $this->skippedCount() == 0; - } - - /** - * Gets the number of skipped tests. - * - * @return integer - * @since Method available since Release 3.0.0 - */ - public function skippedCount() - { - return count($this->skipped); - } - - /** - * Returns an Enumeration for the skipped tests. - * - * @return array - * @since Method available since Release 3.0.0 - */ - public function skipped() - { - return $this->skipped; - } - - /** - * Gets the number of detected errors. - * - * @return integer - */ - public function errorCount() - { - return count($this->errors); - } - - /** - * Returns an Enumeration for the errors. - * - * @return array - */ - public function errors() - { - return $this->errors; - } - - /** - * Returns an Enumeration for the deprecated features used. - * - * @return array - * @since Method available since Release 3.5.7 - */ - public function deprecatedFeatures() - { - return $this->deprecatedFeatures; - } - - /** - * Returns an Enumeration for the deprecated features used. - * - * @return array - * @since Method available since Release 3.5.7 - */ - public function deprecatedFeaturesCount() - { - return count($this->deprecatedFeatures); - } - - /** - * Gets the number of detected failures. - * - * @return integer - */ - public function failureCount() - { - return count($this->failures); - } - - /** - * Returns an Enumeration for the failures. - * - * @return array - */ - public function failures() - { - return $this->failures; - } - - /** - * Returns the names of the tests that have passed. - * - * @return array - * @since Method available since Release 3.4.0 - */ - public function passed() - { - return $this->passed; - } - - /** - * Returns the (top) test suite. - * - * @return PHPUnit_Framework_TestSuite - * @since Method available since Release 3.0.0 - */ - public function topTestSuite() - { - return $this->topTestSuite; - } - - /** - * Returns whether code coverage information should be collected. - * - * @return boolean If code coverage should be collected - * @since Method available since Release 3.2.0 - */ - public function getCollectCodeCoverageInformation() - { - return $this->codeCoverage !== null; - } - - /** - * Runs a TestCase. - * - * @param PHPUnit_Framework_Test $test - */ - public function run(PHPUnit_Framework_Test $test) - { - PHPUnit_Framework_Assert::resetCount(); - - $error = false; - $failure = false; - $incomplete = false; - $risky = false; - $skipped = false; - - $this->startTest($test); - - $errorHandlerSet = false; - - if ($this->convertErrorsToExceptions) { - $oldErrorHandler = set_error_handler( - array('PHPUnit_Util_ErrorHandler', 'handleError'), - E_ALL | E_STRICT - ); - - if ($oldErrorHandler === null) { - $errorHandlerSet = true; - } else { - restore_error_handler(); - } - } - - $collectCodeCoverage = $this->codeCoverage !== null && - !$test instanceof PHPUnit_Extensions_SeleniumTestCase && - !$test instanceof PHPUnit_Framework_Warning; - - if ($collectCodeCoverage) { - // We need to blacklist test source files when no whitelist is used. - if (!$this->codeCoverage->filter()->hasWhitelist()) { - $classes = $this->getHierarchy(get_class($test), true); - - foreach ($classes as $class) { - $this->codeCoverage->filter()->addFileToBlacklist( - $class->getFileName() - ); - } - } - - $this->codeCoverage->start($test); - } - - PHP_Timer::start(); - - try { - if (!$test instanceof PHPUnit_Framework_Warning && - $this->beStrictAboutTestSize && - extension_loaded('pcntl') && class_exists('PHP_Invoker')) { - switch ($test->getSize()) { - case PHPUnit_Util_Test::SMALL: { - $_timeout = $this->timeoutForSmallTests; - } - break; - - case PHPUnit_Util_Test::MEDIUM: { - $_timeout = $this->timeoutForMediumTests; - } - break; - - case PHPUnit_Util_Test::LARGE: { - $_timeout = $this->timeoutForLargeTests; - } - break; - } - - $invoker = new PHP_Invoker; - $invoker->invoke(array($test, 'runBare'), array(), $_timeout); - } else { - $test->runBare(); - } - } catch (PHPUnit_Framework_AssertionFailedError $e) { - $failure = true; - - if ($e instanceof PHPUnit_Framework_RiskyTestError) { - $risky = true; - } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) { - $incomplete = true; - } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) { - $skipped = true; - } - } catch (Exception $e) { - $error = true; - } - - $time = PHP_Timer::stop(); - $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount()); - - if ($this->beStrictAboutTestsThatDoNotTestAnything && - $test->getNumAssertions() == 0) { - $risky = true; - } - - if ($collectCodeCoverage) { - $append = !$risky && !$incomplete && !$skipped; - $linesToBeCovered = array(); - $linesToBeUsed = array(); - - if ($append && $test instanceof PHPUnit_Framework_TestCase) { - $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered( - get_class($test), $test->getName(false) - ); - - $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed( - get_class($test), $test->getName(false) - ); - } - - try { - $this->codeCoverage->stop( - $append, $linesToBeCovered, $linesToBeUsed - ); - } catch (PHP_CodeCoverage_Exception_UnintentionallyCoveredCode $cce) { - $this->addFailure( - $test, - new PHPUnit_Framework_UnintentionallyCoveredCodeError( - 'This test executed code that is not listed as code to be covered or used:' . - PHP_EOL . $cce->getMessage() - ), - $time - ); - } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) { - $this->addFailure( - $test, - new PHPUnit_Framework_InvalidCoversTargetError( - $cce->getMessage() - ), - $time - ); - } catch (PHP_CodeCoverage_Exception $cce) { - $error = true; - - if (!isset($e)) { - $e = $cce; - } - } - } - - if ($errorHandlerSet === true) { - restore_error_handler(); - } - - if ($error === true) { - $this->addError($test, $e, $time); - } elseif ($failure === true) { - $this->addFailure($test, $e, $time); - } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && - $test->getNumAssertions() == 0) { - $this->addFailure( - $test, - new PHPUnit_Framework_RiskyTestError( - 'This test did not perform any assertions' - ), - $time - ); - } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { - $this->addFailure( - $test, - new PHPUnit_Framework_OutputError( - sprintf( - 'This test printed output: %s', - $test->getActualOutput() - ) - ), - $time - ); - } - - $this->endTest($test, $time); - } - - /** - * Gets the number of run tests. - * - * @return integer - */ - public function count() - { - return $this->runTests; - } - - /** - * Checks whether the test run should stop. - * - * @return boolean - */ - public function shouldStop() - { - return $this->stop; - } - - /** - * Marks that the test run should stop. - * - */ - public function stop() - { - $this->stop = true; - } - - /** - * Returns the PHP_CodeCoverage object. - * - * @return PHP_CodeCoverage - * @since Method available since Release 3.5.0 - */ - public function getCodeCoverage() - { - return $this->codeCoverage; - } - - /** - * Sets the PHP_CodeCoverage object. - * - * @param PHP_CodeCoverage $codeCoverage - * @since Method available since Release 3.6.0 - */ - public function setCodeCoverage(PHP_CodeCoverage $codeCoverage) - { - $this->codeCoverage = $codeCoverage; - } - - /** - * Enables or disables the error-to-exception conversion. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.2.14 - */ - public function convertErrorsToExceptions($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->convertErrorsToExceptions = $flag; - } - - /** - * Returns the error-to-exception conversion setting. - * - * @return boolean - * @since Method available since Release 3.4.0 - */ - public function getConvertErrorsToExceptions() - { - return $this->convertErrorsToExceptions; - } - - /** - * Enables or disables the stopping when an error occurs. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.5.0 - */ - public function stopOnError($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->stopOnError = $flag; - } - - /** - * Enables or disables the stopping when a failure occurs. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.1.0 - */ - public function stopOnFailure($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->stopOnFailure = $flag; - } - - /** - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public function beStrictAboutTestsThatDoNotTestAnything($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->beStrictAboutTestsThatDoNotTestAnything = $flag; - } - - /** - * @return boolean - * @since Method available since Release 4.0.0 - */ - public function isStrictAboutTestsThatDoNotTestAnything() - { - return $this->beStrictAboutTestsThatDoNotTestAnything; - } - - /** - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public function beStrictAboutOutputDuringTests($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->beStrictAboutOutputDuringTests = $flag; - } - - /** - * @return boolean - * @since Method available since Release 4.0.0 - */ - public function isStrictAboutOutputDuringTests() - { - return $this->beStrictAboutOutputDuringTests; - } - - /** - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public function beStrictAboutTestSize($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->beStrictAboutTestSize = $flag; - } - - /** - * @return boolean - * @since Method available since Release 4.0.0 - */ - public function isStrictAboutTestSize() - { - return $this->beStrictAboutTestSize; - } - - /** - * Enables or disables the stopping for risky tests. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public function stopOnRisky($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->stopOnRisky = $flag; - } - - /** - * Enables or disables the stopping for incomplete tests. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.5.0 - */ - public function stopOnIncomplete($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->stopOnIncomplete = $flag; - } - - /** - * Enables or disables the stopping for skipped tests. - * - * @param boolean $flag - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.1.0 - */ - public function stopOnSkipped($flag) - { - if (!is_bool($flag)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - - $this->stopOnSkipped = $flag; - } - - /** - * Returns the time spent running the tests. - * - * @return float - */ - public function time() - { - return $this->time; - } - - /** - * Returns whether the entire test was successful or not. - * - * @return boolean - */ - public function wasSuccessful() - { - return empty($this->errors) && empty($this->failures); - } - - /** - * Sets the timeout for small tests. - * - * @param integer $timeout - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.6.0 - */ - public function setTimeoutForSmallTests($timeout) - { - if (!is_integer($timeout)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); - } - - $this->timeoutForSmallTests = $timeout; - } - - /** - * Sets the timeout for medium tests. - * - * @param integer $timeout - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.6.0 - */ - public function setTimeoutForMediumTests($timeout) - { - if (!is_integer($timeout)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); - } - - $this->timeoutForMediumTests = $timeout; - } - - /** - * Sets the timeout for large tests. - * - * @param integer $timeout - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.6.0 - */ - public function setTimeoutForLargeTests($timeout) - { - if (!is_integer($timeout)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); - } - - $this->timeoutForLargeTests = $timeout; - } - - /** - * Returns the class hierarchy for a given class. - * - * @param string $className - * @param boolean $asReflectionObjects - * @return array - */ - protected function getHierarchy($className, $asReflectionObjects = false) - { - if ($asReflectionObjects) { - $classes = array(new ReflectionClass($className)); - } else { - $classes = array($className); - } - - $done = false; - - while (!$done) { - if ($asReflectionObjects) { - $class = new ReflectionClass( - $classes[count($classes)-1]->getName() - ); - } else { - $class = new ReflectionClass($classes[count($classes)-1]); - } - - $parent = $class->getParentClass(); - - if ($parent !== false) { - if ($asReflectionObjects) { - $classes[] = $parent; - } else { - $classes[] = $parent->getName(); - } - } else { - $done = true; - } - } - - return $classes; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.0 - */ - -/** - * Creates a synthetic failed assertion. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.0 - */ -class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError -{ - /** - * The synthetic file. - * - * @var string - */ - protected $syntheticFile = ''; - - /** - * The synthetic line number. - * - * @var integer - */ - protected $syntheticLine = 0; - - /** - * The synthetic trace. - * - * @var array - */ - protected $syntheticTrace = array(); - - /** - * Constructor. - * - * @param string $message - * @param integer $code - * @param string $file - * @param integer $line - * @param array $trace - */ - public function __construct($message, $code, $file, $line, $trace) - { - parent::__construct($message, $code); - - $this->syntheticFile = $file; - $this->syntheticLine = $line; - $this->syntheticTrace = $trace; - } - - /** - * @return string - */ - public function getSyntheticFile() - { - return $this->syntheticFile; - } - - /** - * @return integer - */ - public function getSyntheticLine() - { - return $this->syntheticLine; - } - - /** - * @return array - */ - public function getSyntheticTrace() - { - return $this->syntheticTrace; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a skipped test suite. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.0 - */ -class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Framework_CodeCoverageException extends PHPUnit_Framework_Exception -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A set of assert methods. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -abstract class PHPUnit_Framework_Assert -{ - /** - * @var integer - */ - private static $count = 0; - - /** - * Asserts that an array has a specified key. - * - * @param mixed $key - * @param array|ArrayAccess $array - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertArrayHasKey($key, $array, $message = '') - { - if (!(is_integer($key) || is_string($key))) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'integer or string' - ); - } - - if (!(is_array($array) || $array instanceof ArrayAccess)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array or ArrayAccess' - ); - } - - $constraint = new PHPUnit_Framework_Constraint_ArrayHasKey($key); - - self::assertThat($array, $constraint, $message); - } - - /** - * Asserts that an array does not have a specified key. - * - * @param mixed $key - * @param array|ArrayAccess $array - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertArrayNotHasKey($key, $array, $message = '') - { - if (!(is_integer($key) || is_string($key))) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'integer or string' - ); - } - - if (!(is_array($array) || $array instanceof ArrayAccess)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array or ArrayAccess' - ); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_ArrayHasKey($key) - ); - - self::assertThat($array, $constraint, $message); - } - - /** - * Asserts that a haystack contains a needle. - * - * @param mixed $needle - * @param mixed $haystack - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 2.1.0 - */ - public static function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - if (is_array($haystack) || - is_object($haystack) && $haystack instanceof Traversable) { - $constraint = new PHPUnit_Framework_Constraint_TraversableContains( - $needle, $checkForObjectIdentity, $checkForNonObjectIdentity - ); - } elseif (is_string($haystack)) { - $constraint = new PHPUnit_Framework_Constraint_StringContains( - $needle, $ignoreCase - ); - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array, traversable or string' - ); - } - - self::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains a needle. - * - * @param mixed $needle - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 3.0.0 - */ - public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - self::assertContains( - $needle, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message, - $ignoreCase, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ); - } - - /** - * Asserts that a haystack does not contain a needle. - * - * @param mixed $needle - * @param mixed $haystack - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 2.1.0 - */ - public static function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - if (is_array($haystack) || - is_object($haystack) && $haystack instanceof Traversable) { - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_TraversableContains( - $needle, $checkForObjectIdentity, $checkForNonObjectIdentity - ) - ); - } elseif (is_string($haystack)) { - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_StringContains( - $needle, $ignoreCase - ) - ); - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array, traversable or string' - ); - } - - self::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain a needle. - * - * @param mixed $needle - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @param boolean $ignoreCase - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @since Method available since Release 3.0.0 - */ - public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - self::assertNotContains( - $needle, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message, - $ignoreCase, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ); - } - - /** - * Asserts that a haystack contains only values of a given type. - * - * @param string $type - * @param mixed $haystack - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ - public static function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '') - { - if (!(is_array($haystack) || - is_object($haystack) && $haystack instanceof Traversable)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array or traversable' - ); - } - - if ($isNativeType == null) { - $isNativeType = PHPUnit_Util_Type::isType($type); - } - - self::assertThat( - $haystack, - new PHPUnit_Framework_Constraint_TraversableContainsOnly( - $type, $isNativeType - ), - $message - ); - } - - /** - * Asserts that a haystack contains only instances of a given classname - * - * @param string $classname - * @param array|Traversable $haystack - * @param string $message - */ - public static function assertContainsOnlyInstancesOf($classname, $haystack, $message = '') - { - if (!(is_array($haystack) || - is_object($haystack) && $haystack instanceof Traversable)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array or traversable' - ); - } - - self::assertThat( - $haystack, - new PHPUnit_Framework_Constraint_TraversableContainsOnly( - $classname, false - ), - $message - ); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains only values of a given type. - * - * @param string $type - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ - public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') - { - self::assertContainsOnly( - $type, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $isNativeType, - $message - ); - } - - /** - * Asserts that a haystack does not contain only values of a given type. - * - * @param string $type - * @param mixed $haystack - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ - public static function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '') - { - if (!(is_array($haystack) || - is_object($haystack) && $haystack instanceof Traversable)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'array or traversable' - ); - } - - if ($isNativeType == null) { - $isNativeType = PHPUnit_Util_Type::isType($type); - } - - self::assertThat( - $haystack, - new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_TraversableContainsOnly( - $type, $isNativeType - ) - ), - $message - ); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain only values of a given - * type. - * - * @param string $type - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param boolean $isNativeType - * @param string $message - * @since Method available since Release 3.1.4 - */ - public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '') - { - self::assertNotContainsOnly( - $type, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $isNativeType, - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param integer $expectedCount - * @param mixed $haystack - * @param string $message - */ - public static function assertCount($expectedCount, $haystack, $message = '') - { - if (!is_int($expectedCount)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); - } - - if (!$haystack instanceof Countable && - !$haystack instanceof Traversable && - !is_array($haystack)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); - } - - self::assertThat( - $haystack, - new PHPUnit_Framework_Constraint_Count($expectedCount), - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param integer $expectedCount - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.6.0 - */ - public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') - { - self::assertCount( - $expectedCount, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param integer $expectedCount - * @param mixed $haystack - * @param string $message - */ - public static function assertNotCount($expectedCount, $haystack, $message = '') - { - if (!is_int($expectedCount)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer'); - } - - if (!$haystack instanceof Countable && - !$haystack instanceof Traversable && - !is_array($haystack)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_Count($expectedCount) - ); - - self::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param integer $expectedCount - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.6.0 - */ - public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '') - { - self::assertNotCount( - $expectedCount, - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that two variables are equal. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ - public static function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - $constraint = new PHPUnit_Framework_Constraint_IsEqual( - $expected, $delta, $maxDepth, $canonicalize, $ignoreCase - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that a variable is equal to an attribute of an object. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ - public static function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - self::assertEquals( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that two variables are not equal. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 2.3.0 - */ - public static function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_IsEqual( - $expected, $delta, $maxDepth, $canonicalize, $ignoreCase - ) - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that a variable is not equal to an attribute of an object. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - */ - public static function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - self::assertNotEquals( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that a variable is empty. - * - * @param mixed $actual - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertEmpty($actual, $message = '') - { - self::assertThat($actual, self::isEmpty(), $message); - } - - /** - * Asserts that a static attribute of a class or an attribute of an object - * is empty. - * - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') - { - self::assertEmpty( - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that a variable is not empty. - * - * @param mixed $actual - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertNotEmpty($actual, $message = '') - { - self::assertThat($actual, self::logicalNot(self::isEmpty()), $message); - } - - /** - * Asserts that a static attribute of a class or an attribute of an object - * is not empty. - * - * @param string $haystackAttributeName - * @param mixed $haystackClassOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '') - { - self::assertNotEmpty( - self::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that a value is greater than another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertGreaterThan($expected, $actual, $message = '') - { - self::assertThat($actual, self::greaterThan($expected), $message); - } - - /** - * Asserts that an attribute is greater than another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertGreaterThan( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is greater than or equal to another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertGreaterThanOrEqual($expected, $actual, $message = '') - { - self::assertThat( - $actual, self::greaterThanOrEqual($expected), $message - ); - } - - /** - * Asserts that an attribute is greater than or equal to another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertGreaterThanOrEqual( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is smaller than another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertLessThan($expected, $actual, $message = '') - { - self::assertThat($actual, self::lessThan($expected), $message); - } - - /** - * Asserts that an attribute is smaller than another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertLessThan( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is smaller than or equal to another value. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertLessThanOrEqual($expected, $actual, $message = '') - { - self::assertThat($actual, self::lessThanOrEqual($expected), $message); - } - - /** - * Asserts that an attribute is smaller than or equal to another value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param string $actualClassOrObject - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertLessThanOrEqual( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @param string $expected - * @param string $actual - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.2.14 - */ - public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) - { - self::assertFileExists($expected, $message); - self::assertFileExists($actual, $message); - - self::assertEquals( - file_get_contents($expected), - file_get_contents($actual), - $message, - 0, - 10, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @param string $expected - * @param string $actual - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.2.14 - */ - public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false) - { - self::assertFileExists($expected, $message); - self::assertFileExists($actual, $message); - - self::assertNotEquals( - file_get_contents($expected), - file_get_contents($actual), - $message, - 0, - 10, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @param string $expectedFile - * @param string $actualString - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.3.0 - */ - public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) - { - self::assertFileExists($expectedFile, $message); - - self::assertEquals( - file_get_contents($expectedFile), - $actualString, - $message, - 0, - 10, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @param string $expectedFile - * @param string $actualString - * @param string $message - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @since Method available since Release 3.3.0 - */ - public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false) - { - self::assertFileExists($expectedFile, $message); - - self::assertNotEquals( - file_get_contents($expectedFile), - $actualString, - $message, - 0, - 10, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that a file exists. - * - * @param string $filename - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertFileExists($filename, $message = '') - { - if (!is_string($filename)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_FileExists; - - self::assertThat($filename, $constraint, $message); - } - - /** - * Asserts that a file does not exist. - * - * @param string $filename - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertFileNotExists($filename, $message = '') - { - if (!is_string($filename)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_FileExists - ); - - self::assertThat($filename, $constraint, $message); - } - - /** - * Asserts that a condition is true. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertTrue($condition, $message = '') - { - self::assertThat($condition, self::isTrue(), $message); - } - - /** - * Asserts that a condition is not true. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertNotTrue($condition, $message = '') - { - self::assertThat($condition, self::logicalNot(self::isTrue()), $message); - } - - /** - * Asserts that a condition is false. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertFalse($condition, $message = '') - { - self::assertThat($condition, self::isFalse(), $message); - } - - /** - * Asserts that a condition is not false. - * - * @param boolean $condition - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function assertNotFalse($condition, $message = '') - { - self::assertThat($condition, self::logicalNot(self::isFalse()), $message); - } - - /** - * Asserts that a variable is not null. - * - * @param mixed $actual - * @param string $message - */ - public static function assertNotNull($actual, $message = '') - { - self::assertThat($actual, self::logicalNot(self::isNull()), $message); - } - - /** - * Asserts that a variable is null. - * - * @param mixed $actual - * @param string $message - */ - public static function assertNull($actual, $message = '') - { - self::assertThat($actual, self::isNull(), $message); - } - - /** - * Asserts that a class has a specified attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertClassHasAttribute($attributeName, $className, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_string($className) || !class_exists($className, false)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name'); - } - - $constraint = new PHPUnit_Framework_Constraint_ClassHasAttribute( - $attributeName - ); - - self::assertThat($className, $constraint, $message); - } - - /** - * Asserts that a class does not have a specified attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertClassNotHasAttribute($attributeName, $className, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_string($className) || !class_exists($className, false)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_ClassHasAttribute($attributeName) - ); - - self::assertThat($className, $constraint, $message); - } - - /** - * Asserts that a class has a specified static attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertClassHasStaticAttribute($attributeName, $className, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_string($className) || !class_exists($className, false)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name'); - } - - $constraint = new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( - $attributeName - ); - - self::assertThat($className, $constraint, $message); - } - - /** - * Asserts that a class does not have a specified static attribute. - * - * @param string $attributeName - * @param string $className - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertClassNotHasStaticAttribute($attributeName, $className, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_string($className) || !class_exists($className, false)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( - $attributeName - ) - ); - - self::assertThat($className, $constraint, $message); - } - - /** - * Asserts that an object has a specified attribute. - * - * @param string $attributeName - * @param object $object - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertObjectHasAttribute($attributeName, $object, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_object($object)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object'); - } - - $constraint = new PHPUnit_Framework_Constraint_ObjectHasAttribute( - $attributeName - ); - - self::assertThat($object, $constraint, $message); - } - - /** - * Asserts that an object does not have a specified attribute. - * - * @param string $attributeName - * @param object $object - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertObjectNotHasAttribute($attributeName, $object, $message = '') - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name'); - } - - if (!is_object($object)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_ObjectHasAttribute($attributeName) - ); - - self::assertThat($object, $constraint, $message); - } - - /** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - */ - public static function assertSame($expected, $actual, $message = '') - { - if (is_bool($expected) && is_bool($actual)) { - self::assertEquals($expected, $actual, $message); - } else { - $constraint = new PHPUnit_Framework_Constraint_IsIdentical( - $expected - ); - - self::assertThat($actual, $constraint, $message); - } - } - - /** - * Asserts that a variable and an attribute of an object have the same type - * and value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param object $actualClassOrObject - * @param string $message - */ - public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertSame( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - */ - public static function assertNotSame($expected, $actual, $message = '') - { - if (is_bool($expected) && is_bool($actual)) { - self::assertNotEquals($expected, $actual, $message); - } else { - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_IsIdentical($expected) - ); - - self::assertThat($actual, $constraint, $message); - } - } - - /** - * Asserts that a variable and an attribute of an object do not have the - * same type and value. - * - * @param mixed $expected - * @param string $actualAttributeName - * @param object $actualClassOrObject - * @param string $message - */ - public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '') - { - self::assertNotSame( - $expected, - self::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a variable is of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertInstanceOf($expected, $actual, $message = '') - { - if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name'); - } - - $constraint = new PHPUnit_Framework_Constraint_IsInstanceOf( - $expected - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '') - { - self::assertInstanceOf( - $expected, - self::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is not of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertNotInstanceOf($expected, $actual, $message = '') - { - if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_IsInstanceOf($expected) - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '') - { - self::assertNotInstanceOf( - $expected, - self::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertInternalType($expected, $actual, $message = '') - { - if (!is_string($expected)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_IsType( - $expected - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '') - { - self::assertInternalType( - $expected, - self::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is not of a given type. - * - * @param string $expected - * @param mixed $actual - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertNotInternalType($expected, $actual, $message = '') - { - if (!is_string($expected)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_IsType($expected) - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param string $expected - * @param string $attributeName - * @param mixed $classOrObject - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '') - { - self::assertNotInternalType( - $expected, - self::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a string matches a given regular expression. - * - * @param string $pattern - * @param string $string - * @param string $message - */ - public static function assertRegExp($pattern, $string, $message = '') - { - if (!is_string($pattern)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_PCREMatch($pattern); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string does not match a given regular expression. - * - * @param string $pattern - * @param string $string - * @param string $message - * @since Method available since Release 2.1.0 - */ - public static function assertNotRegExp($pattern, $string, $message = '') - { - if (!is_string($pattern)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_PCREMatch($pattern) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @param array|Countable|Traversable $expected - * @param array|Countable|Traversable $actual - * @param string $message - */ - public static function assertSameSize($expected, $actual, $message = '') - { - if (!$expected instanceof Countable && - !$expected instanceof Traversable && - !is_array($expected)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable'); - } - - if (!$actual instanceof Countable && - !$actual instanceof Traversable && - !is_array($actual)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); - } - - self::assertThat( - $actual, - new PHPUnit_Framework_Constraint_SameSize($expected), - $message - ); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @param array|Countable|Traversable $expected - * @param array|Countable|Traversable $actual - * @param string $message - */ - public static function assertNotSameSize($expected, $actual, $message = '') - { - if (!$expected instanceof Countable && - !$expected instanceof Traversable && - !is_array($expected)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable'); - } - - if (!$actual instanceof Countable && - !$actual instanceof Traversable && - !is_array($actual)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_SameSize($expected) - ); - - self::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that a string matches a given format string. - * - * @param string $format - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertStringMatchesFormat($format, $string, $message = '') - { - if (!is_string($format)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_StringMatches($format); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string does not match a given format string. - * - * @param string $format - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertStringNotMatchesFormat($format, $string, $message = '') - { - if (!is_string($format)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_StringMatches($format) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string matches a given format file. - * - * @param string $formatFile - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertStringMatchesFormatFile($formatFile, $string, $message = '') - { - self::assertFileExists($formatFile, $message); - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_StringMatches( - file_get_contents($formatFile) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string does not match a given format string. - * - * @param string $formatFile - * @param string $string - * @param string $message - * @since Method available since Release 3.5.0 - */ - public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '') - { - self::assertFileExists($formatFile, $message); - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_StringMatches( - file_get_contents($formatFile) - ) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string starts with a given prefix. - * - * @param string $prefix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ - public static function assertStringStartsWith($prefix, $string, $message = '') - { - if (!is_string($prefix)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_StringStartsWith( - $prefix - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string starts not with a given prefix. - * - * @param string $prefix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ - public static function assertStringStartsNotWith($prefix, $string, $message = '') - { - if (!is_string($prefix)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_StringStartsWith($prefix) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string ends with a given suffix. - * - * @param string $suffix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ - public static function assertStringEndsWith($suffix, $string, $message = '') - { - if (!is_string($suffix)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_StringEndsWith($suffix); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that a string ends not with a given suffix. - * - * @param string $suffix - * @param string $string - * @param string $message - * @since Method available since Release 3.4.0 - */ - public static function assertStringEndsNotWith($suffix, $string, $message = '') - { - if (!is_string($suffix)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_string($string)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - $constraint = new PHPUnit_Framework_Constraint_Not( - new PHPUnit_Framework_Constraint_StringEndsWith($suffix) - ); - - self::assertThat($string, $constraint, $message); - } - - /** - * Asserts that two XML files are equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '') - { - self::assertFileExists($expectedFile); - self::assertFileExists($actualFile); - - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->load($expectedFile); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->load($actualFile); - - self::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML files are not equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '') - { - self::assertFileExists($expectedFile); - self::assertFileExists($actualFile); - - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->load($expectedFile); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->load($actualFile); - - self::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @param string $expectedFile - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.3.0 - */ - public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '') - { - self::assertFileExists($expectedFile); - - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->load($expectedFile); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->loadXML($actualXml); - - self::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @param string $expectedFile - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.3.0 - */ - public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '') - { - self::assertFileExists($expectedFile); - - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->load($expectedFile); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->loadXML($actualXml); - - self::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @param string $expectedXml - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '') - { - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->loadXML($expectedXml); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->loadXML($actualXml); - - self::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @param string $expectedXml - * @param string $actualXml - * @param string $message - * @since Method available since Release 3.1.0 - */ - public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '') - { - $expected = new DOMDocument; - $expected->preserveWhiteSpace = false; - $expected->loadXML($expectedXml); - - $actual = new DOMDocument; - $actual->preserveWhiteSpace = false; - $actual->loadXML($actualXml); - - self::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that a hierarchy of DOMElements matches. - * - * @param DOMElement $expectedElement - * @param DOMElement $actualElement - * @param boolean $checkAttributes - * @param string $message - * @author Mattis Stordalen Flister - * @since Method available since Release 3.3.0 - */ - public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '') - { - self::assertEquals( - $expectedElement->tagName, - $actualElement->tagName, - $message - ); - - if ($checkAttributes) { - self::assertEquals( - $expectedElement->attributes->length, - $actualElement->attributes->length, - sprintf( - '%s%sNumber of attributes on node "%s" does not match', - $message, - !empty($message) ? "\n" : '', - $expectedElement->tagName - ) - ); - - for ($i = 0 ; $i < $expectedElement->attributes->length; $i++) { - $expectedAttribute = $expectedElement->attributes->item($i); - $actualAttribute = $actualElement->attributes->getNamedItem( - $expectedAttribute->name - ); - - if (!$actualAttribute) { - self::fail( - sprintf( - '%s%sCould not find attribute "%s" on node "%s"', - $message, - !empty($message) ? "\n" : '', - $expectedAttribute->name, - $expectedElement->tagName - ) - ); - } - } - } - - PHPUnit_Util_XML::removeCharacterDataNodes($expectedElement); - PHPUnit_Util_XML::removeCharacterDataNodes($actualElement); - - self::assertEquals( - $expectedElement->childNodes->length, - $actualElement->childNodes->length, - sprintf( - '%s%sNumber of child nodes of "%s" differs', - $message, - !empty($message) ? "\n" : '', - $expectedElement->tagName - ) - ); - - for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { - self::assertEqualXMLStructure( - $expectedElement->childNodes->item($i), - $actualElement->childNodes->item($i), - $checkAttributes, - $message - ); - } - } - - /** - * Assert the presence, absence, or count of elements in a document matching - * the CSS $selector, regardless of the contents of those elements. - * - * The first argument, $selector, is the CSS selector used to match - * the elements in the $actual document. - * - * The second argument, $count, can be either boolean or numeric. - * When boolean, it asserts for presence of elements matching the selector - * (true) or absence of elements (false). - * When numeric, it asserts the count of elements. - * - * assertSelectCount("#binder", true, $xml); // any? - * assertSelectCount(".binder", 3, $xml); // exactly 3? - * - * @param array $selector - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true) - { - self::assertSelectEquals( - $selector, true, $count, $actual, $message, $isHtml - ); - } - - /** - * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any? - * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml); // 3? - * - * @param array $selector - * @param string $pattern - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true) - { - self::assertSelectEquals( - $selector, "regexp:$pattern", $count, $actual, $message, $isHtml - ); - } - - /** - * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any? - * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none? - * - * @param array $selector - * @param string $content - * @param integer $count - * @param mixed $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true) - { - $tags = PHPUnit_Util_XML::cssSelect( - $selector, $content, $actual, $isHtml - ); - - // assert specific number of elements - if (is_numeric($count)) { - $counted = $tags ? count($tags) : 0; - self::assertEquals($count, $counted, $message); - } - - // assert any elements exist if true, assert no elements exist if false - else if (is_bool($count)) { - $any = count($tags) > 0 && $tags[0] instanceof DOMNode; - - if ($count) { - self::assertTrue($any, $message); - } else { - self::assertFalse($any, $message); - } - } - - // check for range number of elements - else if (is_array($count) && - (isset($count['>']) || isset($count['<']) || - isset($count['>=']) || isset($count['<=']))) { - $counted = $tags ? count($tags) : 0; - - if (isset($count['>'])) { - self::assertTrue($counted > $count['>'], $message); - } - - if (isset($count['>='])) { - self::assertTrue($counted >= $count['>='], $message); - } - - if (isset($count['<'])) { - self::assertTrue($counted < $count['<'], $message); - } - - if (isset($count['<='])) { - self::assertTrue($counted <= $count['<='], $message); - } - } else { - throw new PHPUnit_Framework_Exception; - } - } - - /** - * Evaluate an HTML or XML string and assert its structure and/or contents. - * - * The first argument ($matcher) is an associative array that specifies the - * match criteria for the assertion: - * - * - `id` : the node with the given id attribute must match the - * corresponding value. - * - `tag` : the node type must match the corresponding value. - * - `attributes` : a hash. The node's attributes must match the - * corresponding values in the hash. - * - `content` : The text content must match the given value. - * - `parent` : a hash. The node's parent must match the - * corresponding hash. - * - `child` : a hash. At least one of the node's immediate children - * must meet the criteria described by the hash. - * - `ancestor` : a hash. At least one of the node's ancestors must - * meet the criteria described by the hash. - * - `descendant` : a hash. At least one of the node's descendants must - * meet the criteria described by the hash. - * - `children` : a hash, for counting children of a node. - * Accepts the keys: - * - `count` : a number which must equal the number of children - * that match - * - `less_than` : the number of matching children must be greater - * than this number - * - `greater_than` : the number of matching children must be less than - * this number - * - `only` : another hash consisting of the keys to use to match - * on the children, and only matching children will be - * counted - * - * - * // Matcher that asserts that there is an element with an id="my_id". - * $matcher = array('id' => 'my_id'); - * - * // Matcher that asserts that there is a "span" tag. - * $matcher = array('tag' => 'span'); - * - * // Matcher that asserts that there is a "span" tag with the content - * // "Hello World". - * $matcher = array('tag' => 'span', 'content' => 'Hello World'); - * - * // Matcher that asserts that there is a "span" tag with content matching - * // the regular expression pattern. - * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/'); - * - * // Matcher that asserts that there is a "span" with an "list" class - * // attribute. - * $matcher = array( - * 'tag' => 'span', - * 'attributes' => array('class' => 'list') - * ); - * - * // Matcher that asserts that there is a "span" inside of a "div". - * $matcher = array( - * 'tag' => 'span', - * 'parent' => array('tag' => 'div') - * ); - * - * // Matcher that asserts that there is a "span" somewhere inside a - * // "table". - * $matcher = array( - * 'tag' => 'span', - * 'ancestor' => array('tag' => 'table') - * ); - * - * // Matcher that asserts that there is a "span" with at least one "em" - * // child. - * $matcher = array( - * 'tag' => 'span', - * 'child' => array('tag' => 'em') - * ); - * - * // Matcher that asserts that there is a "span" containing a (possibly - * // nested) "strong" tag. - * $matcher = array( - * 'tag' => 'span', - * 'descendant' => array('tag' => 'strong') - * ); - * - * // Matcher that asserts that there is a "span" containing 5-10 "em" tags - * // as immediate children. - * $matcher = array( - * 'tag' => 'span', - * 'children' => array( - * 'less_than' => 11, - * 'greater_than' => 4, - * 'only' => array('tag' => 'em') - * ) - * ); - * - * // Matcher that asserts that there is a "div", with an "ul" ancestor and - * // a "li" parent (with class="enum"), and containing a "span" descendant - * // that contains an element with id="my_test" and the text "Hello World". - * $matcher = array( - * 'tag' => 'div', - * 'ancestor' => array('tag' => 'ul'), - * 'parent' => array( - * 'tag' => 'li', - * 'attributes' => array('class' => 'enum') - * ), - * 'descendant' => array( - * 'tag' => 'span', - * 'child' => array( - * 'id' => 'my_test', - * 'content' => 'Hello World' - * ) - * ) - * ); - * - * // Use assertTag() to apply a $matcher to a piece of $html. - * $this->assertTag($matcher, $html); - * - * // Use assertTag() to apply a $matcher to a piece of $xml. - * $this->assertTag($matcher, $xml, '', false); - * - * - * The second argument ($actual) is a string containing either HTML or - * XML text to be tested. - * - * The third argument ($message) is an optional message that will be - * used if the assertion fails. - * - * The fourth argument ($html) is an optional flag specifying whether - * to load the $actual string into a DOMDocument using the HTML or - * XML load strategy. It is true by default, which assumes the HTML - * load strategy. In many cases, this will be acceptable for XML as well. - * - * @param array $matcher - * @param string $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertTag($matcher, $actual, $message = '', $isHtml = true) - { - $dom = PHPUnit_Util_XML::load($actual, $isHtml); - $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml); - $matched = count($tags) > 0 && $tags[0] instanceof DOMNode; - - self::assertTrue($matched, $message); - } - - /** - * This assertion is the exact opposite of assertTag(). - * - * Rather than asserting that $matcher results in a match, it asserts that - * $matcher does not match. - * - * @param array $matcher - * @param string $actual - * @param string $message - * @param boolean $isHtml - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertNotTag($matcher, $actual, $message = '', $isHtml = true) - { - $dom = PHPUnit_Util_XML::load($actual, $isHtml); - $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml); - $matched = count($tags) > 0 && $tags[0] instanceof DOMNode; - - self::assertFalse($matched, $message); - } - - /** - * Evaluates a PHPUnit_Framework_Constraint matcher object. - * - * @param mixed $value - * @param PHPUnit_Framework_Constraint $constraint - * @param string $message - * @since Method available since Release 3.0.0 - */ - public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '') - { - self::$count += count($constraint); - - $constraint->evaluate($value, $message); - } - - /** - * Asserts that a string is a valid JSON string. - * - * @param string $actualJson - * @param string $message - * @since Method available since Release 3.7.20 - */ - public static function assertJson($actualJson, $message = '') - { - if (!is_string($actualJson)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - self::assertThat($actualJson, self::isJson(), $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @param string $expectedJson - * @param string $actualJson - * @param string $message - */ - public static function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '') - { - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - $expected = json_decode($expectedJson); - $actual = json_decode($actualJson); - - self::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @param string $expectedJson - * @param string $actualJson - * @param string $message - */ - public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '') - { - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - $expected = json_decode($expectedJson); - $actual = json_decode($actualJson); - - self::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @param string $expectedFile - * @param string $actualJson - * @param string $message - */ - public static function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '') - { - self::assertFileExists($expectedFile, $message); - $expectedJson = file_get_contents($expectedFile); - - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - // call constraint - $constraint = new PHPUnit_Framework_Constraint_JsonMatches( - $expectedJson - ); - - self::assertThat($actualJson, $constraint, $message); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @param string $expectedFile - * @param string $actualJson - * @param string $message - */ - public static function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '') - { - self::assertFileExists($expectedFile, $message); - $expectedJson = file_get_contents($expectedFile); - - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - // call constraint - $constraint = new PHPUnit_Framework_Constraint_JsonMatches( - $expectedJson - ); - - self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message); - } - - /** - * Asserts that two JSON files are not equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - */ - public static function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '') - { - self::assertFileExists($expectedFile, $message); - self::assertFileExists($actualFile, $message); - - $actualJson = file_get_contents($actualFile); - $expectedJson = file_get_contents($expectedFile); - - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - // call constraint - $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( - $expectedJson - ); - - $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); - - self::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message); - self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message); - } - - /** - * Asserts that two JSON files are equal. - * - * @param string $expectedFile - * @param string $actualFile - * @param string $message - */ - public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '') - { - self::assertFileExists($expectedFile, $message); - self::assertFileExists($actualFile, $message); - - $actualJson = file_get_contents($actualFile); - $expectedJson = file_get_contents($expectedFile); - - self::assertJson($expectedJson, $message); - self::assertJson($actualJson, $message); - - // call constraint - $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches( - $expectedJson - ); - - $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson); - - self::assertThat($expectedJson, $constraintActual, $message); - self::assertThat($actualJson, $constraintExpected, $message); - } - - /** - * Returns a PHPUnit_Framework_Constraint_And matcher object. - * - * @return PHPUnit_Framework_Constraint_And - * @since Method available since Release 3.0.0 - */ - public static function logicalAnd() - { - $constraints = func_get_args(); - - $constraint = new PHPUnit_Framework_Constraint_And; - $constraint->setConstraints($constraints); - - return $constraint; - } - - /** - * Returns a PHPUnit_Framework_Constraint_Or matcher object. - * - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.0.0 - */ - public static function logicalOr() - { - $constraints = func_get_args(); - - $constraint = new PHPUnit_Framework_Constraint_Or; - $constraint->setConstraints($constraints); - - return $constraint; - } - - /** - * Returns a PHPUnit_Framework_Constraint_Not matcher object. - * - * @param PHPUnit_Framework_Constraint $constraint - * @return PHPUnit_Framework_Constraint_Not - * @since Method available since Release 3.0.0 - */ - public static function logicalNot(PHPUnit_Framework_Constraint $constraint) - { - return new PHPUnit_Framework_Constraint_Not($constraint); - } - - /** - * Returns a PHPUnit_Framework_Constraint_Xor matcher object. - * - * @return PHPUnit_Framework_Constraint_Xor - * @since Method available since Release 3.0.0 - */ - public static function logicalXor() - { - $constraints = func_get_args(); - - $constraint = new PHPUnit_Framework_Constraint_Xor; - $constraint->setConstraints($constraints); - - return $constraint; - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object. - * - * @return PHPUnit_Framework_Constraint_IsAnything - * @since Method available since Release 3.0.0 - */ - public static function anything() - { - return new PHPUnit_Framework_Constraint_IsAnything; - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object. - * - * @return PHPUnit_Framework_Constraint_IsTrue - * @since Method available since Release 3.3.0 - */ - public static function isTrue() - { - return new PHPUnit_Framework_Constraint_IsTrue; - } - - /** - * Returns a PHPUnit_Framework_Constraint_Callback matcher object. - * - * @param callable $callback - * @return PHPUnit_Framework_Constraint_Callback - */ - public static function callback($callback) - { - return new PHPUnit_Framework_Constraint_Callback($callback); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object. - * - * @return PHPUnit_Framework_Constraint_IsFalse - * @since Method available since Release 3.3.0 - */ - public static function isFalse() - { - return new PHPUnit_Framework_Constraint_IsFalse; - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsJson matcher object. - * - * @return PHPUnit_Framework_Constraint_IsJson - * @since Method available since Release 3.7.20 - */ - public static function isJson() - { - return new PHPUnit_Framework_Constraint_IsJson; - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsNull matcher object. - * - * @return PHPUnit_Framework_Constraint_IsNull - * @since Method available since Release 3.3.0 - */ - public static function isNull() - { - return new PHPUnit_Framework_Constraint_IsNull; - } - - /** - * Returns a PHPUnit_Framework_Constraint_Attribute matcher object. - * - * @param PHPUnit_Framework_Constraint $constraint - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_Attribute - * @since Method available since Release 3.1.0 - */ - public static function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName) - { - return new PHPUnit_Framework_Constraint_Attribute( - $constraint, $attributeName - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher - * object. - * - * @param mixed $value - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @return PHPUnit_Framework_Constraint_TraversableContains - * @since Method available since Release 3.0.0 - */ - public static function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - return new PHPUnit_Framework_Constraint_TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity); - } - - /** - * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher - * object. - * - * @param string $type - * @return PHPUnit_Framework_Constraint_TraversableContainsOnly - * @since Method available since Release 3.1.4 - */ - public static function containsOnly($type) - { - return new PHPUnit_Framework_Constraint_TraversableContainsOnly($type); - } - - /** - * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher - * object. - * - * @param string $classname - * @return PHPUnit_Framework_Constraint_TraversableContainsOnly - */ - public static function containsOnlyInstancesOf($classname) - { - return new PHPUnit_Framework_Constraint_TraversableContainsOnly($classname, false); - } - - /** - * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object. - * - * @param mixed $key - * @return PHPUnit_Framework_Constraint_ArrayHasKey - * @since Method available since Release 3.0.0 - */ - public static function arrayHasKey($key) - { - return new PHPUnit_Framework_Constraint_ArrayHasKey($key); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object. - * - * @param mixed $value - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @return PHPUnit_Framework_Constraint_IsEqual - * @since Method available since Release 3.0.0 - */ - public static function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - return new PHPUnit_Framework_Constraint_IsEqual( - $value, $delta, $maxDepth, $canonicalize, $ignoreCase - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object - * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher - * object. - * - * @param string $attributeName - * @param mixed $value - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @return PHPUnit_Framework_Constraint_Attribute - * @since Method available since Release 3.1.0 - */ - public static function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - return self::attribute( - self::equalTo( - $value, $delta, $maxDepth, $canonicalize, $ignoreCase - ), - $attributeName - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object. - * - * @return PHPUnit_Framework_Constraint_IsEmpty - * @since Method available since Release 3.5.0 - */ - public static function isEmpty() - { - return new PHPUnit_Framework_Constraint_IsEmpty; - } - - /** - * Returns a PHPUnit_Framework_Constraint_FileExists matcher object. - * - * @return PHPUnit_Framework_Constraint_FileExists - * @since Method available since Release 3.0.0 - */ - public static function fileExists() - { - return new PHPUnit_Framework_Constraint_FileExists; - } - - /** - * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_GreaterThan - * @since Method available since Release 3.0.0 - */ - public static function greaterThan($value) - { - return new PHPUnit_Framework_Constraint_GreaterThan($value); - } - - /** - * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps - * a PHPUnit_Framework_Constraint_IsEqual and a - * PHPUnit_Framework_Constraint_GreaterThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.1.0 - */ - public static function greaterThanOrEqual($value) - { - return self::logicalOr( - new PHPUnit_Framework_Constraint_IsEqual($value), - new PHPUnit_Framework_Constraint_GreaterThan($value) - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ClassHasAttribute - * @since Method available since Release 3.1.0 - */ - public static function classHasAttribute($attributeName) - { - return new PHPUnit_Framework_Constraint_ClassHasAttribute( - $attributeName - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher - * object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute - * @since Method available since Release 3.1.0 - */ - public static function classHasStaticAttribute($attributeName) - { - return new PHPUnit_Framework_Constraint_ClassHasStaticAttribute( - $attributeName - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object. - * - * @param string $attributeName - * @return PHPUnit_Framework_Constraint_ObjectHasAttribute - * @since Method available since Release 3.0.0 - */ - public static function objectHasAttribute($attributeName) - { - return new PHPUnit_Framework_Constraint_ObjectHasAttribute( - $attributeName - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_IsIdentical - * @since Method available since Release 3.0.0 - */ - public static function identicalTo($value) - { - return new PHPUnit_Framework_Constraint_IsIdentical($value); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object. - * - * @param string $className - * @return PHPUnit_Framework_Constraint_IsInstanceOf - * @since Method available since Release 3.0.0 - */ - public static function isInstanceOf($className) - { - return new PHPUnit_Framework_Constraint_IsInstanceOf($className); - } - - /** - * Returns a PHPUnit_Framework_Constraint_IsType matcher object. - * - * @param string $type - * @return PHPUnit_Framework_Constraint_IsType - * @since Method available since Release 3.0.0 - */ - public static function isType($type) - { - return new PHPUnit_Framework_Constraint_IsType($type); - } - - /** - * Returns a PHPUnit_Framework_Constraint_LessThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_LessThan - * @since Method available since Release 3.0.0 - */ - public static function lessThan($value) - { - return new PHPUnit_Framework_Constraint_LessThan($value); - } - - /** - * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps - * a PHPUnit_Framework_Constraint_IsEqual and a - * PHPUnit_Framework_Constraint_LessThan matcher object. - * - * @param mixed $value - * @return PHPUnit_Framework_Constraint_Or - * @since Method available since Release 3.1.0 - */ - public static function lessThanOrEqual($value) - { - return self::logicalOr( - new PHPUnit_Framework_Constraint_IsEqual($value), - new PHPUnit_Framework_Constraint_LessThan($value) - ); - } - - /** - * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object. - * - * @param string $pattern - * @return PHPUnit_Framework_Constraint_PCREMatch - * @since Method available since Release 3.0.0 - */ - public static function matchesRegularExpression($pattern) - { - return new PHPUnit_Framework_Constraint_PCREMatch($pattern); - } - - /** - * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object. - * - * @param string $string - * @return PHPUnit_Framework_Constraint_StringMatches - * @since Method available since Release 3.5.0 - */ - public static function matches($string) - { - return new PHPUnit_Framework_Constraint_StringMatches($string); - } - - /** - * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object. - * - * @param mixed $prefix - * @return PHPUnit_Framework_Constraint_StringStartsWith - * @since Method available since Release 3.4.0 - */ - public static function stringStartsWith($prefix) - { - return new PHPUnit_Framework_Constraint_StringStartsWith($prefix); - } - - /** - * Returns a PHPUnit_Framework_Constraint_StringContains matcher object. - * - * @param string $string - * @param boolean $case - * @return PHPUnit_Framework_Constraint_StringContains - * @since Method available since Release 3.0.0 - */ - public static function stringContains($string, $case = true) - { - return new PHPUnit_Framework_Constraint_StringContains($string, $case); - } - - /** - * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object. - * - * @param mixed $suffix - * @return PHPUnit_Framework_Constraint_StringEndsWith - * @since Method available since Release 3.4.0 - */ - public static function stringEndsWith($suffix) - { - return new PHPUnit_Framework_Constraint_StringEndsWith($suffix); - } - - /** - * Returns a PHPUnit_Framework_Constraint_Count matcher object. - * - * @param int $count - * @return PHPUnit_Framework_Constraint_Count - */ - public static function countOf($count) - { - return new PHPUnit_Framework_Constraint_Count($count); - } - /** - * Fails a test with the given message. - * - * @param string $message - * @throws PHPUnit_Framework_AssertionFailedError - */ - public static function fail($message = '') - { - throw new PHPUnit_Framework_AssertionFailedError($message); - } - - /** - * Returns the value of an attribute of a class or an object. - * This also works for attributes that are declared protected or private. - * - * @param mixed $classOrObject - * @param string $attributeName - * @return mixed - * @throws PHPUnit_Framework_Exception - */ - public static function readAttribute($classOrObject, $attributeName) - { - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); - } - - if (is_string($classOrObject)) { - if (!class_exists($classOrObject)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'class name' - ); - } - - return self::getStaticAttribute( - $classOrObject, - $attributeName - ); - } elseif (is_object($classOrObject)) { - return self::getObjectAttribute( - $classOrObject, - $attributeName - ); - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'class name or object' - ); - } - } - - /** - * Returns the value of a static attribute. - * This also works for attributes that are declared protected or private. - * - * @param string $className - * @param string $attributeName - * @return mixed - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public static function getStaticAttribute($className, $attributeName) - { - if (!is_string($className)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!class_exists($className)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class name'); - } - - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); - } - - $class = new ReflectionClass($className); - - while ($class) { - $attributes = $class->getStaticProperties(); - - if (array_key_exists($attributeName, $attributes)) { - return $attributes[$attributeName]; - } - - $class = $class->getParentClass(); - } - - throw new PHPUnit_Framework_Exception( - sprintf( - 'Attribute "%s" not found in class.', - $attributeName - ) - ); - } - - /** - * Returns the value of an object's attribute. - * This also works for attributes that are declared protected or private. - * - * @param object $object - * @param string $attributeName - * @return mixed - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 4.0.0 - */ - public static function getObjectAttribute($object, $attributeName) - { - if (!is_object($object)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'object'); - } - - if (!is_string($attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string'); - } - - if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name'); - } - - try { - $attribute = new ReflectionProperty($object, $attributeName); - } catch (ReflectionException $e) { - $reflector = new ReflectionObject($object); - - while ($reflector = $reflector->getParentClass()) { - try { - $attribute = $reflector->getProperty($attributeName); - break; - } catch (ReflectionException $e) { - } - } - } - - if (isset($attribute)) { - if (!$attribute || $attribute->isPublic()) { - return $object->$attributeName; - } - - $attribute->setAccessible(true); - $value = $attribute->getValue($object); - $attribute->setAccessible(false); - - return $value; - } - - throw new PHPUnit_Framework_Exception( - sprintf( - 'Attribute "%s" not found in object.', - $attributeName - ) - ); - } - - /** - * Mark the test as incomplete. - * - * @param string $message - * @throws PHPUnit_Framework_IncompleteTestError - * @since Method available since Release 3.0.0 - */ - public static function markTestIncomplete($message = '') - { - throw new PHPUnit_Framework_IncompleteTestError($message); - } - - /** - * Mark the test as skipped. - * - * @param string $message - * @throws PHPUnit_Framework_SkippedTestError - * @since Method available since Release 3.0.0 - */ - public static function markTestSkipped($message = '') - { - throw new PHPUnit_Framework_SkippedTestError($message); - } - - /** - * Return the current assertion count. - * - * @return integer - * @since Method available since Release 3.3.3 - */ - public static function getCount() - { - return self::$count; - } - - /** - * Reset the assertion counter. - * - * @since Method available since Release 3.3.3 - */ - public static function resetCount() - { - self::$count = 0; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * A marker interface for marking a unit test as being skipped. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 3.0.0 - */ -interface PHPUnit_Framework_SkippedTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A warning. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_Warning extends PHPUnit_Framework_TestCase -{ - /** - * @var string - */ - protected $message = ''; - - /** - * @var boolean - */ - protected $backupGlobals = false; - - /** - * @var boolean - */ - protected $backupStaticAttributes = false; - - /** - * @var boolean - */ - protected $runTestInSeparateProcess = false; - - /** - * @var boolean - */ - protected $useErrorHandler = false; - - /** - * @param string $message - */ - public function __construct($message = '') - { - $this->message = $message; - parent::__construct('Warning'); - } - - /** - * @throws PHPUnit_Framework_Exception - */ - protected function runTest() - { - $this->fail($this->message); - } - - /** - * @return string - * @since Method available since Release 3.0.0 - */ - public function getMessage() - { - return $this->message; - } - - /** - * Returns a string representation of the test case. - * - * @return string - * @since Method available since Release 3.4.0 - */ - public function toString() - { - return 'Warning'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_TestSuite - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_TestSuite - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Framework_TestSuite_DataProvider extends PHPUnit_Framework_TestSuite -{ - /** - * Sets the dependencies of a TestCase. - * - * @param array $dependencies - */ - public function setDependencies(array $dependencies) - { - foreach ($this->tests as $test) { - $test->setDependencies($dependencies); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * A marker interface for marking any exception/error as result of an unit - * test as risky. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 4.0.0 - */ -interface PHPUnit_Framework_RiskyTest -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A TestCase defines the fixture to run multiple tests. - * - * To define a TestCase - * - * 1) Implement a subclass of PHPUnit_Framework_TestCase. - * 2) Define instance variables that store the state of the fixture. - * 3) Initialize the fixture state by overriding setUp(). - * 4) Clean-up after a test by overriding tearDown(). - * - * Each test runs in its own fixture so there can be no side effects - * among test runs. - * - * Here is an example: - * - * - * value1 = 2; - * $this->value2 = 3; - * } - * } - * ?> - * - * - * For each test implement a method which interacts with the fixture. - * Verify the expected results with assertions specified by calling - * assert with a boolean. - * - * - * assertTrue($this->value1 + $this->value2 == 5); - * } - * ?> - * - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing -{ - /** - * Enable or disable the backup and restoration of the $GLOBALS array. - * Overwrite this attribute in a child class of TestCase. - * Setting this attribute in setUp() has no effect! - * - * @var boolean - */ - protected $backupGlobals = null; - - /** - * @var array - */ - protected $backupGlobalsBlacklist = array(); - - /** - * Enable or disable the backup and restoration of static attributes. - * Overwrite this attribute in a child class of TestCase. - * Setting this attribute in setUp() has no effect! - * - * @var boolean - */ - protected $backupStaticAttributes = null; - - /** - * @var array - */ - protected $backupStaticAttributesBlacklist = array(); - - /** - * Whether or not this test is to be run in a separate PHP process. - * - * @var boolean - */ - protected $runTestInSeparateProcess = null; - - /** - * Whether or not this test should preserve the global state when - * running in a separate PHP process. - * - * @var boolean - */ - protected $preserveGlobalState = true; - - /** - * Whether or not this test is running in a separate PHP process. - * - * @var boolean - */ - private $inIsolation = false; - - /** - * @var array - */ - private $data = array(); - - /** - * @var string - */ - private $dataName = ''; - - /** - * @var boolean - */ - private $useErrorHandler = null; - - /** - * The name of the expected Exception. - * - * @var mixed - */ - private $expectedException = null; - - /** - * The message of the expected Exception. - * - * @var string - */ - private $expectedExceptionMessage = ''; - - /** - * The code of the expected Exception. - * - * @var integer - */ - private $expectedExceptionCode; - - /** - * The required preconditions for a test. - * - * @var array - */ - private $required = array( - 'PHP' => null, - 'PHPUnit' => null, - 'OS' => null, - 'functions' => array(), - 'extensions' => array() - ); - - /** - * The name of the test case. - * - * @var string - */ - private $name = null; - - /** - * @var array - */ - private $dependencies = array(); - - /** - * @var array - */ - private $dependencyInput = array(); - - /** - * @var array - */ - private $iniSettings = array(); - - /** - * @var array - */ - private $locale = array(); - - /** - * @var array - */ - private $mockObjects = array(); - - /** - * @var array - */ - private $mockObjectGenerator = null; - - /** - * @var integer - */ - private $status; - - /** - * @var string - */ - private $statusMessage = ''; - - /** - * @var integer - */ - private $numAssertions = 0; - - /** - * @var PHPUnit_Framework_TestResult - */ - private $result; - - /** - * @var mixed - */ - private $testResult; - - /** - * @var string - */ - private $output = ''; - - /** - * @var string - */ - private $outputExpectedRegex = null; - - /** - * @var string - */ - private $outputExpectedString = null; - - /** - * @var bool - */ - private $hasPerformedExpectationsOnOutput = false; - - /** - * @var mixed - */ - private $outputCallback = false; - - /** - * @var boolean - */ - private $outputBufferingActive = false; - - /** - * Constructs a test case with the given name. - * - * @param string $name - * @param array $data - * @param string $dataName - */ - public function __construct($name = null, array $data = array(), $dataName = '') - { - if ($name !== null) { - $this->setName($name); - } - - $this->data = $data; - $this->dataName = $dataName; - } - - /** - * Returns a string representation of the test case. - * - * @return string - */ - public function toString() - { - $class = new ReflectionClass($this); - - $buffer = sprintf( - '%s::%s', - - $class->name, - $this->getName(false) - ); - - return $buffer . $this->getDataSetAsString(); - } - - /** - * Counts the number of test cases executed by run(TestResult result). - * - * @return integer - */ - public function count() - { - return 1; - } - - /** - * Returns the annotations for this test. - * - * @return array - * @since Method available since Release 3.4.0 - */ - public function getAnnotations() - { - return PHPUnit_Util_Test::parseTestMethodAnnotations( - get_class($this), $this->name - ); - } - - /** - * Gets the name of a TestCase. - * - * @param boolean $withDataSet - * @return string - */ - public function getName($withDataSet = true) - { - if ($withDataSet) { - return $this->name . $this->getDataSetAsString(false); - } else { - return $this->name; - } - } - - /** - * Returns the size of the test. - * - * @return integer - * @since Method available since Release 3.6.0 - */ - public function getSize() - { - return PHPUnit_Util_Test::getSize( - get_class($this), $this->getName(false) - ); - } - - /** - * @return string - * @since Method available since Release 3.6.0 - */ - public function getActualOutput() - { - if (!$this->outputBufferingActive) { - return $this->output; - } else { - return ob_get_contents(); - } - } - - /** - * @return boolean - * @since Method available since Release 3.6.0 - */ - public function hasOutput() - { - if (strlen($this->output) === 0) { - return false; - } - - if ($this->outputExpectedString !== null || - $this->outputExpectedRegex !== null || - $this->hasPerformedExpectationsOnOutput) { - return false; - } - - return true; - } - - /** - * @param string $expectedRegex - * @since Method available since Release 3.6.0 - * @throws PHPUnit_Framework_Exception - */ - public function expectOutputRegex($expectedRegex) - { - if ($this->outputExpectedString !== null) { - throw new PHPUnit_Framework_Exception; - } - - if (is_string($expectedRegex) || is_null($expectedRegex)) { - $this->outputExpectedRegex = $expectedRegex; - } - } - - /** - * @param string $expectedString - * @since Method available since Release 3.6.0 - */ - public function expectOutputString($expectedString) - { - if ($this->outputExpectedRegex !== null) { - throw new PHPUnit_Framework_Exception; - } - - if (is_string($expectedString) || is_null($expectedString)) { - $this->outputExpectedString = $expectedString; - } - } - - /** - * @return bool - * @since Method available since Release 3.6.5 - */ - public function hasPerformedExpectationsOnOutput() - { - return $this->hasPerformedExpectationsOnOutput; - } - - /** - * @return string - * @since Method available since Release 3.2.0 - */ - public function getExpectedException() - { - return $this->expectedException; - } - - /** - * @param mixed $exceptionName - * @param string $exceptionMessage - * @param integer $exceptionCode - * @since Method available since Release 3.2.0 - */ - public function setExpectedException($exceptionName, $exceptionMessage = '', $exceptionCode = null) - { - $this->expectedException = $exceptionName; - $this->expectedExceptionMessage = $exceptionMessage; - $this->expectedExceptionCode = $exceptionCode; - } - - /** - * @since Method available since Release 3.4.0 - */ - protected function setExpectedExceptionFromAnnotation() - { - try { - $expectedException = PHPUnit_Util_Test::getExpectedException( - get_class($this), $this->name - ); - - if ($expectedException !== false) { - $this->setExpectedException( - $expectedException['class'], - $expectedException['message'], - $expectedException['code'] - ); - } - } catch (ReflectionException $e) { - } - } - - /** - * @param boolean $useErrorHandler - * @since Method available since Release 3.4.0 - */ - public function setUseErrorHandler($useErrorHandler) - { - $this->useErrorHandler = $useErrorHandler; - } - - /** - * @since Method available since Release 3.4.0 - */ - protected function setUseErrorHandlerFromAnnotation() - { - try { - $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings( - get_class($this), $this->name - ); - - if ($useErrorHandler !== null) { - $this->setUseErrorHandler($useErrorHandler); - } - } catch (ReflectionException $e) { - } - } - - /** - * @since Method available since Release 3.6.0 - */ - protected function setRequirementsFromAnnotation() - { - try { - $requirements = PHPUnit_Util_Test::getRequirements( - get_class($this), $this->name - ); - - if (isset($requirements['PHP'])) { - $this->required['PHP'] = $requirements['PHP']; - } - - if (isset($requirements['PHPUnit'])) { - $this->required['PHPUnit'] = $requirements['PHPUnit']; - } - - if (isset($requirements['OS'])) { - $this->required['OS'] = $requirements['OS']; - } - - if (isset($requirements['extensions'])) { - $this->required['extensions'] = $requirements['extensions']; - } - - if (isset($requirements['functions'])) { - $this->required['functions'] = $requirements['functions']; - } - } catch (ReflectionException $e) { - } - } - - /** - * @since Method available since Release 3.6.0 - */ - protected function checkRequirements() - { - $this->setRequirementsFromAnnotation(); - - $missingRequirements = array(); - - if ($this->required['PHP'] && - version_compare(PHP_VERSION, $this->required['PHP'], '<')) { - $missingRequirements[] = sprintf( - 'PHP %s (or later) is required.', - $this->required['PHP'] - ); - } - - $phpunitVersion = PHPUnit_Runner_Version::id(); - if ($this->required['PHPUnit'] && - version_compare($phpunitVersion, $this->required['PHPUnit'], '<')) { - $missingRequirements[] = sprintf( - 'PHPUnit %s (or later) is required.', - $this->required['PHPUnit'] - ); - } - - if ($this->required['OS'] && - !preg_match($this->required['OS'], PHP_OS)) { - $missingRequirements[] = sprintf( - 'Operating system matching %s is required.', - $this->required['OS'] - ); - } - - foreach ($this->required['functions'] as $requiredFunction) { - if (!function_exists($requiredFunction)) { - $missingRequirements[] = sprintf( - 'Function %s is required.', - $requiredFunction - ); - } - } - - foreach ($this->required['extensions'] as $requiredExtension) { - if (!extension_loaded($requiredExtension)) { - $missingRequirements[] = sprintf( - 'Extension %s is required.', - $requiredExtension - ); - } - } - - if ($missingRequirements) { - $this->markTestSkipped( - implode( - PHP_EOL, - $missingRequirements - ) - ); - } - } - - /** - * Returns the status of this test. - * - * @return integer - * @since Method available since Release 3.1.0 - */ - public function getStatus() - { - return $this->status; - } - - /** - * Returns the status message of this test. - * - * @return string - * @since Method available since Release 3.3.0 - */ - public function getStatusMessage() - { - return $this->statusMessage; - } - - /** - * Returns whether or not this test has failed. - * - * @return boolean - * @since Method available since Release 3.0.0 - */ - public function hasFailed() - { - $status = $this->getStatus(); - - return $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE || - $status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; - } - - /** - * Runs the test case and collects the results in a TestResult object. - * If no TestResult object is passed a new one will be created. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - * @throws PHPUnit_Framework_Exception - */ - public function run(PHPUnit_Framework_TestResult $result = null) - { - if ($result === null) { - $result = $this->createResult(); - } - - if (!$this instanceof PHPUnit_Framework_Warning) { - $this->setTestResultObject($result); - $this->setUseErrorHandlerFromAnnotation(); - } - - if ($this->useErrorHandler !== null) { - $oldErrorHandlerSetting = $result->getConvertErrorsToExceptions(); - $result->convertErrorsToExceptions($this->useErrorHandler); - } - - if (!$this instanceof PHPUnit_Framework_Warning && !$this->handleDependencies()) { - return; - } - - if ($this->runTestInSeparateProcess === true && - $this->inIsolation !== true && - !$this instanceof PHPUnit_Extensions_SeleniumTestCase && - !$this instanceof PHPUnit_Extensions_PhptTestCase) { - $class = new ReflectionClass($this); - - $template = new Text_Template( - __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' - ); - - if ($this->preserveGlobalState) { - $constants = PHPUnit_Util_GlobalState::getConstantsAsString(); - $globals = PHPUnit_Util_GlobalState::getGlobalsAsString(); - $includedFiles = PHPUnit_Util_GlobalState::getIncludedFilesAsString(); - $iniSettings = PHPUnit_Util_GlobalState::getIniSettingsAsString(); - } else { - $constants = ''; - $globals = ''; - $includedFiles = ''; - $iniSettings = ''; - } - - $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false'; - $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false'; - $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false'; - $isStrictAboutTestSize = $result->isStrictAboutTestSize() ? 'true' : 'false'; - - if (defined('PHPUNIT_COMPOSER_INSTALL')) { - $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); - } else { - $composerAutoload = '\'\''; - } - - if (defined('__PHPUNIT_PHAR__')) { - $phar = var_export(__PHPUNIT_PHAR__, true); - } else { - $phar = '\'\''; - } - - $data = var_export(serialize($this->data), true); - $dependencyInput = var_export(serialize($this->dependencyInput), true); - $includePath = var_export(get_include_path(), true); - // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC - // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences - $data = "'." . $data . ".'"; - $dependencyInput = "'." . $dependencyInput . ".'"; - $includePath = "'." . $includePath . ".'"; - - $template->setVar( - array( - 'composerAutoload' => $composerAutoload, - 'phar' => $phar, - 'filename' => $class->getFileName(), - 'className' => $class->getName(), - 'methodName' => $this->name, - 'collectCodeCoverageInformation' => $coverage, - 'data' => $data, - 'dataName' => $this->dataName, - 'dependencyInput' => $dependencyInput, - 'constants' => $constants, - 'globals' => $globals, - 'include_path' => $includePath, - 'included_files' => $includedFiles, - 'iniSettings' => $iniSettings, - 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything, - 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests, - 'isStrictAboutTestSize' => $isStrictAboutTestSize - ) - ); - - $this->prepareTemplate($template); - - $php = PHPUnit_Util_PHP::factory(); - $php->runTestJob($template->render(), $this, $result); - } else { - $result->run($this); - } - - if ($this->useErrorHandler !== null) { - $result->convertErrorsToExceptions($oldErrorHandlerSetting); - } - - $this->result = null; - - return $result; - } - - /** - * Runs the bare test sequence. - */ - public function runBare() - { - $this->numAssertions = 0; - - // Backup the $GLOBALS array and static attributes. - if ($this->runTestInSeparateProcess !== true && - $this->inIsolation !== true) { - if ($this->backupGlobals === null || - $this->backupGlobals === true) { - PHPUnit_Util_GlobalState::backupGlobals( - $this->backupGlobalsBlacklist - ); - } - - if ($this->backupStaticAttributes === true) { - PHPUnit_Util_GlobalState::backupStaticAttributes( - $this->backupStaticAttributesBlacklist - ); - } - } - - // Start output buffering. - ob_start(); - $this->outputBufferingActive = true; - - // Clean up stat cache. - clearstatcache(); - - // Backup the cwd - $currentWorkingDirectory = getcwd(); - - $hookMethods = PHPUnit_Util_Test::getHookMethods(get_class($this)); - - try { - $this->checkRequirements(); - - if ($this->inIsolation) { - foreach ($hookMethods['beforeClass'] as $method) { - $this->$method(); - } - } - - $this->setExpectedExceptionFromAnnotation(); - - foreach ($hookMethods['before'] as $method) { - $this->$method(); - } - - $this->assertPreConditions(); - $this->testResult = $this->runTest(); - $this->verifyMockObjects(); - $this->assertPostConditions(); - $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED; - } catch (PHPUnit_Framework_IncompleteTest $e) { - $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE; - $this->statusMessage = $e->getMessage(); - } catch (PHPUnit_Framework_SkippedTest $e) { - $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED; - $this->statusMessage = $e->getMessage(); - } catch (PHPUnit_Framework_AssertionFailedError $e) { - $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; - $this->statusMessage = $e->getMessage(); - } catch (Exception $e) { - $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; - $this->statusMessage = $e->getMessage(); - } - - // Clean up the mock objects. - $this->mockObjects = array(); - - // Tear down the fixture. An exception raised in tearDown() will be - // caught and passed on when no exception was raised before. - try { - foreach ($hookMethods['after'] as $method) { - $this->$method(); - } - - if ($this->inIsolation) { - foreach ($hookMethods['afterClass'] as $method) { - $this->$method(); - } - } - } catch (Exception $_e) { - if (!isset($e)) { - $e = $_e; - } - } - - // Stop output buffering. - if ($this->outputCallback === false) { - $this->output = ob_get_contents(); - } else { - $this->output = call_user_func_array( - $this->outputCallback, array(ob_get_contents()) - ); - } - - ob_end_clean(); - $this->outputBufferingActive = false; - - // Clean up stat cache. - clearstatcache(); - - // Restore the cwd if it was changed by the test - if ($currentWorkingDirectory != getcwd()) { - chdir($currentWorkingDirectory); - } - - // Restore the $GLOBALS array and static attributes. - if ($this->runTestInSeparateProcess !== true && - $this->inIsolation !== true) { - if ($this->backupGlobals === null || - $this->backupGlobals === true) { - PHPUnit_Util_GlobalState::restoreGlobals( - $this->backupGlobalsBlacklist - ); - } - - if ($this->backupStaticAttributes === true) { - PHPUnit_Util_GlobalState::restoreStaticAttributes(); - } - } - - // Clean up INI settings. - foreach ($this->iniSettings as $varName => $oldValue) { - ini_set($varName, $oldValue); - } - - $this->iniSettings = array(); - - // Clean up locale settings. - foreach ($this->locale as $category => $locale) { - setlocale($category, $locale); - } - - // Perform assertion on output. - if (!isset($e)) { - try { - if ($this->outputExpectedRegex !== null) { - $this->hasPerformedExpectationsOnOutput = true; - $this->assertRegExp($this->outputExpectedRegex, $this->output); - $this->outputExpectedRegex = null; - } elseif ($this->outputExpectedString !== null) { - $this->hasPerformedExpectationsOnOutput = true; - $this->assertEquals($this->outputExpectedString, $this->output); - $this->outputExpectedString = null; - } - } catch (Exception $_e) { - $e = $_e; - } - } - - // Workaround for missing "finally". - if (isset($e)) { - $this->onNotSuccessfulTest($e); - } - } - - /** - * Override to run the test and assert its state. - * - * @return mixed - * @throws Exception|PHPUnit_Framework_Exception - * @throws PHPUnit_Framework_Exception - */ - protected function runTest() - { - if ($this->name === null) { - throw new PHPUnit_Framework_Exception( - 'PHPUnit_Framework_TestCase::$name must not be null.' - ); - } - - try { - $class = new ReflectionClass($this); - $method = $class->getMethod($this->name); - } catch (ReflectionException $e) { - $this->fail($e->getMessage()); - } - - try { - $testResult = $method->invokeArgs( - $this, array_merge($this->data, $this->dependencyInput) - ); - } catch (Exception $e) { - $checkException = false; - - if (is_string($this->expectedException)) { - $checkException = true; - - if ($e instanceof PHPUnit_Framework_Exception) { - $checkException = false; - } - - $reflector = new ReflectionClass($this->expectedException); - - if ($this->expectedException == 'PHPUnit_Framework_Exception' || - $reflector->isSubclassOf('PHPUnit_Framework_Exception')) { - $checkException = true; - } - } - - if ($checkException) { - $this->assertThat( - $e, - new PHPUnit_Framework_Constraint_Exception( - $this->expectedException - ) - ); - - if (is_string($this->expectedExceptionMessage) && - !empty($this->expectedExceptionMessage)) { - $this->assertThat( - $e, - new PHPUnit_Framework_Constraint_ExceptionMessage( - $this->expectedExceptionMessage - ) - ); - } - - if ($this->expectedExceptionCode !== null) { - $this->assertThat( - $e, - new PHPUnit_Framework_Constraint_ExceptionCode( - $this->expectedExceptionCode - ) - ); - } - - return; - } else { - throw $e; - } - } - - if ($this->expectedException !== null) { - $this->assertThat( - null, - new PHPUnit_Framework_Constraint_Exception( - $this->expectedException - ) - ); - } - - return $testResult; - } - - /** - * Verifies the mock object expectations. - * - * @since Method available since Release 3.5.0 - */ - protected function verifyMockObjects() - { - foreach ($this->mockObjects as $mockObject) { - if ($mockObject->__phpunit_hasMatchers()) { - $this->numAssertions++; - } - - $mockObject->__phpunit_verify(); - } - } - - /** - * Sets the name of a TestCase. - * - * @param string - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Sets the dependencies of a TestCase. - * - * @param array $dependencies - * @since Method available since Release 3.4.0 - */ - public function setDependencies(array $dependencies) - { - $this->dependencies = $dependencies; - } - - /** - * Returns true if the tests has dependencies - * - * @return boolean - * @since Method available since Release 4.0.0 - */ - public function hasDependencies() - { - return count($this->dependencies) > 0; - } - - /** - * Sets - * - * @param array $dependencyInput - * @since Method available since Release 3.4.0 - */ - public function setDependencyInput(array $dependencyInput) - { - $this->dependencyInput = $dependencyInput; - } - - /** - * Calling this method in setUp() has no effect! - * - * @param boolean $backupGlobals - * @since Method available since Release 3.3.0 - */ - public function setBackupGlobals($backupGlobals) - { - if (is_null($this->backupGlobals) && is_bool($backupGlobals)) { - $this->backupGlobals = $backupGlobals; - } - } - - /** - * Calling this method in setUp() has no effect! - * - * @param boolean $backupStaticAttributes - * @since Method available since Release 3.4.0 - */ - public function setBackupStaticAttributes($backupStaticAttributes) - { - if (is_null($this->backupStaticAttributes) && - is_bool($backupStaticAttributes)) { - $this->backupStaticAttributes = $backupStaticAttributes; - } - } - - /** - * @param boolean $runTestInSeparateProcess - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.4.0 - */ - public function setRunTestInSeparateProcess($runTestInSeparateProcess) - { - if (is_bool($runTestInSeparateProcess)) { - if ($this->runTestInSeparateProcess === null) { - $this->runTestInSeparateProcess = $runTestInSeparateProcess; - } - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - } - - /** - * @param boolean $preserveGlobalState - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.4.0 - */ - public function setPreserveGlobalState($preserveGlobalState) - { - if (is_bool($preserveGlobalState)) { - $this->preserveGlobalState = $preserveGlobalState; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - } - - /** - * @param boolean $inIsolation - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.4.0 - */ - public function setInIsolation($inIsolation) - { - if (is_bool($inIsolation)) { - $this->inIsolation = $inIsolation; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - } - - /** - * @return mixed - * @since Method available since Release 3.4.0 - */ - public function getResult() - { - return $this->testResult; - } - - /** - * @param mixed $result - * @since Method available since Release 3.4.0 - */ - public function setResult($result) - { - $this->testResult = $result; - } - - /** - * @param callable $callback - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.6.0 - */ - public function setOutputCallback($callback) - { - if (!is_callable($callback)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback'); - } - - $this->outputCallback = $callback; - } - - /** - * @return PHPUnit_Framework_TestResult - * @since Method available since Release 3.5.7 - */ - public function getTestResultObject() - { - return $this->result; - } - - /** - * @param PHPUnit_Framework_TestResult $result - * @since Method available since Release 3.6.0 - */ - public function setTestResultObject(PHPUnit_Framework_TestResult $result) - { - $this->result = $result; - } - - /** - * This method is a wrapper for the ini_set() function that automatically - * resets the modified php.ini setting to its original value after the - * test is run. - * - * @param string $varName - * @param string $newValue - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.0.0 - */ - protected function iniSet($varName, $newValue) - { - if (!is_string($varName)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - $currentValue = ini_set($varName, $newValue); - - if ($currentValue !== false) { - $this->iniSettings[$varName] = $currentValue; - } else { - throw new PHPUnit_Framework_Exception( - sprintf( - 'INI setting "%s" could not be set to "%s".', - $varName, - $newValue - ) - ); - } - } - - /** - * This method is a wrapper for the setlocale() function that automatically - * resets the locale to its original value after the test is run. - * - * @param integer $category - * @param string $locale - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.1.0 - */ - protected function setLocale() - { - $args = func_get_args(); - - if (count($args) < 2) { - throw new PHPUnit_Framework_Exception; - } - - $category = $args[0]; - $locale = $args[1]; - - $categories = array( - LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME - ); - - if (defined('LC_MESSAGES')) { - $categories[] = LC_MESSAGES; - } - - if (!in_array($category, $categories)) { - throw new PHPUnit_Framework_Exception; - } - - if (!is_array($locale) && !is_string($locale)) { - throw new PHPUnit_Framework_Exception; - } - - $this->locale[$category] = setlocale($category, null); - - $result = call_user_func_array( 'setlocale', $args ); - - if ($result === false) { - throw new PHPUnit_Framework_Exception( - 'The locale functionality is not implemented on your platform, ' . - 'the specified locale does not exist or the category name is ' . - 'invalid.' - ); - } - } - - /** - * Returns a mock object for the specified class. - * - * @param string $originalClassName Name of the class to mock. - * @param array|null $methods When provided, only methods whose names are in the array - * are replaced with a configurable test double. The behavior - * of the other methods is not changed. - * Providing null means that no methods will be replaced. - * @param array $arguments Parameters to pass to the original class' constructor. - * @param string $mockClassName Class name for the generated test double class. - * @param boolean $callOriginalConstructor Can be used to disable the call to the original class' constructor. - * @param boolean $callOriginalClone Can be used to disable the call to the original class' clone constructor. - * @param boolean $callAutoload Can be used to disable __autoload() during the generation of the test double class. - * @param boolean $cloneArguments - * @param boolean $callOriginalMethods - * @return PHPUnit_Framework_MockObject_MockObject - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.0.0 - */ - public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false) - { - $mockObject = $this->getMockObjectGenerator()->getMock( - $originalClassName, - $methods, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods - ); - - $this->mockObjects[] = $mockObject; - - return $mockObject; - } - - /** - * Returns a builder object to create mock objects using a fluent interface. - * - * @param string $className - * @return PHPUnit_Framework_MockObject_MockBuilder - * @since Method available since Release 3.5.0 - */ - public function getMockBuilder($className) - { - return new PHPUnit_Framework_MockObject_MockBuilder( - $this, $className - ); - } - - /** - * Mocks the specified class and returns the name of the mocked class. - * - * @param string $originalClassName - * @param array $methods - * @param array $arguments - * @param string $mockClassName - * @param boolean $callOriginalConstructor - * @param boolean $callOriginalClone - * @param boolean $callAutoload - * @param boolean $cloneArguments - * @return string - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.5.0 - */ - protected function getMockClass($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false) - { - $mock = $this->getMock( - $originalClassName, - $methods, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments - ); - - return get_class($mock); - } - - /** - * Returns a mock object for the specified abstract class with all abstract - * methods of the class mocked. Concrete methods to mock can be specified with - * the last parameter - * - * @param string $originalClassName - * @param array $arguments - * @param string $mockClassName - * @param boolean $callOriginalConstructor - * @param boolean $callOriginalClone - * @param boolean $callAutoload - * @param array $mockedMethods - * @param boolean $cloneArguments - * @return PHPUnit_Framework_MockObject_MockObject - * @since Method available since Release 3.4.0 - * @throws PHPUnit_Framework_Exception - */ - public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false) - { - $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass( - $originalClassName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments - ); - - $this->mockObjects[] = $mockObject; - - return $mockObject; - } - - /** - * Returns a mock object based on the given WSDL file. - * - * @param string $wsdlFile - * @param string $originalClassName - * @param string $mockClassName - * @param array $methods - * @param boolean $callOriginalConstructor - * @param array $options An array of options passed to SOAPClient::_construct - * @return PHPUnit_Framework_MockObject_MockObject - * @since Method available since Release 3.4.0 - */ - protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = array(), $callOriginalConstructor = true, array $options = array()) - { - if ($originalClassName === '') { - $originalClassName = str_replace( - '.wsdl', '', basename($wsdlFile) - ); - } - - if (!class_exists($originalClassName)) { - eval( - $this->getMockObjectGenerator()->generateClassFromWsdl( - $wsdlFile, $originalClassName, $methods, $options - ) - ); - } - - return $this->getMock( - $originalClassName, - $methods, - array('', $options), - $mockClassName, - $callOriginalConstructor, - false, - false - ); - } - - /** - * Returns a mock object for the specified trait with all abstract methods - * of the trait mocked. Concrete methods to mock can be specified with the - * `$mockedMethods` parameter. - * - * @param string $traitName - * @param array $arguments - * @param string $mockClassName - * @param boolean $callOriginalConstructor - * @param boolean $callOriginalClone - * @param boolean $callAutoload - * @param array $mockedMethods - * @param boolean $cloneArguments - * @return PHPUnit_Framework_MockObject_MockObject - * @since Method available since Release 4.0.0 - * @throws PHPUnit_Framework_Exception - */ - public function getMockForTrait($traitName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false) - { - $mockObject = $this->getMockObjectGenerator()->getMockForTrait( - $traitName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments - ); - - $this->mockObjects[] = $mockObject; - - return $mockObject; - } - - /** - * Returns an object for the specified trait. - * - * @param string $traitName - * @param array $arguments - * @param string $traitClassName - * @param boolean $callOriginalConstructor - * @param boolean $callOriginalClone - * @param boolean $callAutoload - * @param boolean $cloneArguments - * @return object - * @since Method available since Release 3.6.0 - * @throws PHPUnit_Framework_Exception - */ - protected function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false) - { - return $this->getMockObjectGenerator()->getObjectForTrait( - $traitName, - $arguments, - $traitClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments - ); - } - - /** - * Adds a value to the assertion counter. - * - * @param integer $count - * @since Method available since Release 3.3.3 - */ - public function addToAssertionCount($count) - { - $this->numAssertions += $count; - } - - /** - * Returns the number of assertions performed by this test. - * - * @return integer - * @since Method available since Release 3.3.0 - */ - public function getNumAssertions() - { - return $this->numAssertions; - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is executed zero or more times. - * - * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount - * @since Method available since Release 3.0.0 - */ - public static function any() - { - return new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount; - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is never executed. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ - public static function never() - { - return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(0); - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is executed at least once. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce - * @since Method available since Release 3.0.0 - */ - public static function atLeastOnce() - { - return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce; - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is executed exactly once. - * - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ - public static function once() - { - return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(1); - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is executed exactly $count times. - * - * @param integer $count - * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount - * @since Method available since Release 3.0.0 - */ - public static function exactly($count) - { - return new PHPUnit_Framework_MockObject_Matcher_InvokedCount($count); - } - - /** - * Returns a matcher that matches when the method it is evaluated for - * is invoked at the given $index. - * - * @param integer $index - * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex - * @since Method available since Release 3.0.0 - */ - public static function at($index) - { - return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index); - } - - /** - * - * - * @param mixed $value - * @return PHPUnit_Framework_MockObject_Stub_Return - * @since Method available since Release 3.0.0 - */ - public static function returnValue($value) - { - return new PHPUnit_Framework_MockObject_Stub_Return($value); - } - - /** - * - * - * @param array $valueMap - * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap - * @since Method available since Release 3.6.0 - */ - public static function returnValueMap(array $valueMap) - { - return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap); - } - - /** - * - * - * @param integer $argumentIndex - * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument - * @since Method available since Release 3.3.0 - */ - public static function returnArgument($argumentIndex) - { - return new PHPUnit_Framework_MockObject_Stub_ReturnArgument( - $argumentIndex - ); - } - - /** - * - * - * @param mixed $callback - * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback - * @since Method available since Release 3.3.0 - */ - public static function returnCallback($callback) - { - return new PHPUnit_Framework_MockObject_Stub_ReturnCallback($callback); - } - - /** - * Returns the current object. - * - * This method is useful when mocking a fluent interface. - * - * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf - * @since Method available since Release 3.6.0 - */ - public static function returnSelf() - { - return new PHPUnit_Framework_MockObject_Stub_ReturnSelf(); - } - - /** - * - * - * @param Exception $exception - * @return PHPUnit_Framework_MockObject_Stub_Exception - * @since Method available since Release 3.1.0 - */ - public static function throwException(Exception $exception) - { - return new PHPUnit_Framework_MockObject_Stub_Exception($exception); - } - - /** - * @param mixed $value, ... - * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls - * @since Method available since Release 3.0.0 - */ - public static function onConsecutiveCalls() - { - $args = func_get_args(); - - return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args); - } - - /** - * @param mixed $data - * @return string - * @since Method available since Release 3.2.1 - */ - protected function dataToString($data) - { - $result = array(); - - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); - }, E_WARNING); - - foreach ($data as $key => $_data) { - try { - // Detect array-recursions by using count - // http://php.net/manual/en/function.count.php - $iRecursiveCheck = count($_data, COUNT_RECURSIVE); - - if (is_array($_data)) { - $result[] = 'array(' . $this->dataToString($_data) . ')'; - } elseif (is_object($_data)) { - $object = new ReflectionObject($_data); - - if ($object->hasMethod('__toString')) { - $result[] = (string) $_data; - } else { - $result[] = get_class($_data); - } - } elseif (is_resource($_data)) { - $result[] = ''; - } else { - $result[] = var_export($_data, true); - } - } catch (ErrorException $e) { - $result[] = '*RECURSION*'; - } - } - - restore_error_handler(); - - return join(', ', $result); - } - - /** - * Gets the data set description of a TestCase. - * - * @param boolean $includeData - * @return string - * @since Method available since Release 3.3.0 - */ - protected function getDataSetAsString($includeData = true) - { - $buffer = ''; - - if (!empty($this->data)) { - if (is_int($this->dataName)) { - $buffer .= sprintf(' with data set #%d', $this->dataName); - } else { - $buffer .= sprintf(' with data set "%s"', $this->dataName); - } - - if ($includeData) { - $buffer .= sprintf(' (%s)', $this->dataToString($this->data)); - } - } - - return $buffer; - } - - /** - * Creates a default TestResult object. - * - * @return PHPUnit_Framework_TestResult - */ - protected function createResult() - { - return new PHPUnit_Framework_TestResult; - } - - /** - * @since Method available since Release 3.5.4 - */ - protected function handleDependencies() - { - if (!empty($this->dependencies) && !$this->inIsolation) { - $className = get_class($this); - $passed = $this->result->passed(); - $passedKeys = array_keys($passed); - $numKeys = count($passedKeys); - - for ($i = 0; $i < $numKeys; $i++) { - $pos = strpos($passedKeys[$i], ' with data set'); - - if ($pos !== false) { - $passedKeys[$i] = substr($passedKeys[$i], 0, $pos); - } - } - - $passedKeys = array_flip(array_unique($passedKeys)); - - foreach ($this->dependencies as $dependency) { - if (strpos($dependency, '::') === false) { - $dependency = $className . '::' . $dependency; - } - - if (!isset($passedKeys[$dependency])) { - $this->result->addError( - $this, - new PHPUnit_Framework_SkippedTestError( - sprintf( - 'This test depends on "%s" to pass.', $dependency - ) - ), - 0 - ); - - return false; - } - - if (isset($passed[$dependency])) { - if ($passed[$dependency]['size'] > $this->getSize()) { - $this->result->addError( - $this, - new PHPUnit_Framework_SkippedTestError( - 'This test depends on a test that is larger than itself.' - ), - 0 - ); - - return false; - } - - $this->dependencyInput[] = $passed[$dependency]['result']; - } else { - $this->dependencyInput[] = null; - } - } - } - - return true; - } - - /** - * This method is called before the first test of this test class is run. - * - * @since Method available since Release 3.4.0 - */ - public static function setUpBeforeClass() - { - } - - /** - * Sets up the fixture, for example, open a network connection. - * This method is called before a test is executed. - * - */ - protected function setUp() - { - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called before the execution of a test starts - * and after setUp() is called. - * - * @since Method available since Release 3.2.8 - */ - protected function assertPreConditions() - { - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called before the execution of a test ends - * and before tearDown() is called. - * - * @since Method available since Release 3.2.8 - */ - protected function assertPostConditions() - { - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * This method is called after the last test of this test class is run. - * - * @since Method available since Release 3.4.0 - */ - public static function tearDownAfterClass() - { - } - - /** - * This method is called when a test method did not execute successfully. - * - * @param Exception $e - * @since Method available since Release 3.4.0 - * @throws Exception - */ - protected function onNotSuccessfulTest(Exception $e) - { - throw $e; - } - - /** - * Performs custom preparations on the process isolation template. - * - * @param Text_Template $template - * @since Method available since Release 3.4.0 - */ - protected function prepareTemplate(Text_Template $template) - { - } - - /** - * Get the mock object generator, creating it if it doesn't exist. - * - * @return PHPUnit_Framework_MockObject_Generator - */ - protected function getMockObjectGenerator() - { - if (null === $this->mockObjectGenerator) { - $this->mockObjectGenerator = new PHPUnit_Framework_MockObject_Generator; - } - - return $this->mockObjectGenerator; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A TestSuite is a composite of Tests. It runs a collection of test cases. - * - * Here is an example using the dynamic test definition. - * - * - * addTest(new MathTest('testPass')); - * ?> - * - * - * Alternatively, a TestSuite can extract the tests to be run automatically. - * To do so you pass a ReflectionClass instance for your - * PHPUnit_Framework_TestCase class to the PHPUnit_Framework_TestSuite - * constructor. - * - * - * - * - * - * This constructor creates a suite with all the methods starting with - * "test" that take no arguments. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing, IteratorAggregate -{ - /** - * Enable or disable the backup and restoration of the $GLOBALS array. - * - * @var boolean - */ - protected $backupGlobals = null; - - /** - * Enable or disable the backup and restoration of static attributes. - * - * @var boolean - */ - protected $backupStaticAttributes = null; - - /** - * @var boolean - */ - protected $runTestInSeparateProcess = false; - - /** - * The name of the test suite. - * - * @var string - */ - protected $name = ''; - - /** - * The test groups of the test suite. - * - * @var array - */ - protected $groups = array(); - - /** - * The tests in the test suite. - * - * @var array - */ - protected $tests = array(); - - /** - * The number of tests in the test suite. - * - * @var integer - */ - protected $numTests = -1; - - /** - * @var boolean - */ - protected $testCase = false; - - /** - * @var PHPUnit_Runner_Filter_Factory - */ - private $iteratorFilter = null; - - /** - * Constructs a new TestSuite: - * - * - PHPUnit_Framework_TestSuite() constructs an empty TestSuite. - * - * - PHPUnit_Framework_TestSuite(ReflectionClass) constructs a - * TestSuite from the given class. - * - * - PHPUnit_Framework_TestSuite(ReflectionClass, String) - * constructs a TestSuite from the given class with the given - * name. - * - * - PHPUnit_Framework_TestSuite(String) either constructs a - * TestSuite from the given class (if the passed string is the - * name of an existing class) or constructs an empty TestSuite - * with the given name. - * - * @param mixed $theClass - * @param string $name - * @throws PHPUnit_Framework_Exception - */ - public function __construct($theClass = '', $name = '') - { - $argumentsValid = false; - - if (is_object($theClass) && - $theClass instanceof ReflectionClass) { - $argumentsValid = true; - } elseif (is_string($theClass) && - $theClass !== '' && - class_exists($theClass, false)) { - $argumentsValid = true; - - if ($name == '') { - $name = $theClass; - } - - $theClass = new ReflectionClass($theClass); - } elseif (is_string($theClass)) { - $this->setName($theClass); - - return; - } - - if (!$argumentsValid) { - throw new PHPUnit_Framework_Exception; - } - - if (!$theClass->isSubclassOf('PHPUnit_Framework_TestCase')) { - throw new PHPUnit_Framework_Exception( - 'Class "' . $theClass->name . '" does not extend PHPUnit_Framework_TestCase.' - ); - } - - if ($name != '') { - $this->setName($name); - } else { - $this->setName($theClass->getName()); - } - - $constructor = $theClass->getConstructor(); - - if ($constructor !== null && - !$constructor->isPublic()) { - $this->addTest( - self::warning( - sprintf( - 'Class "%s" has no public constructor.', - - $theClass->getName() - ) - ) - ); - - return; - } - - foreach ($theClass->getMethods() as $method) { - $this->addTestMethod($theClass, $method); - } - - if (empty($this->tests)) { - $this->addTest( - self::warning( - sprintf( - 'No tests found in class "%s".', - - $theClass->getName() - ) - ) - ); - } - - $this->testCase = true; - } - - /** - * Returns a string representation of the test suite. - * - * @return string - */ - public function toString() - { - return $this->getName(); - } - - /** - * Adds a test to the suite. - * - * @param PHPUnit_Framework_Test $test - * @param array $groups - */ - public function addTest(PHPUnit_Framework_Test $test, $groups = array()) - { - $class = new ReflectionClass($test); - - if (!$class->isAbstract()) { - $this->tests[] = $test; - $this->numTests = -1; - - if ($test instanceof PHPUnit_Framework_TestSuite && - empty($groups)) { - $groups = $test->getGroups(); - } - - if (empty($groups)) { - $groups = array('__nogroup__'); - } - - foreach ($groups as $group) { - if (!isset($this->groups[$group])) { - $this->groups[$group] = array($test); - } else { - $this->groups[$group][] = $test; - } - } - } - } - - /** - * Adds the tests from the given class to the suite. - * - * @param mixed $testClass - * @throws PHPUnit_Framework_Exception - */ - public function addTestSuite($testClass) - { - if (is_string($testClass) && class_exists($testClass)) { - $testClass = new ReflectionClass($testClass); - } - - if (!is_object($testClass)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'class name or object' - ); - } - - if ($testClass instanceof PHPUnit_Framework_TestSuite) { - $this->addTest($testClass); - } elseif ($testClass instanceof ReflectionClass) { - $suiteMethod = false; - - if (!$testClass->isAbstract()) { - if ($testClass->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { - $method = $testClass->getMethod( - PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME - ); - - if ($method->isStatic()) { - $this->addTest( - $method->invoke(null, $testClass->getName()) - ); - - $suiteMethod = true; - } - } - } - - if (!$suiteMethod && !$testClass->isAbstract()) { - $this->addTest(new PHPUnit_Framework_TestSuite($testClass)); - } - } else { - throw new PHPUnit_Framework_Exception; - } - } - - /** - * Wraps both addTest() and addTestSuite - * as well as the separate import statements for the user's convenience. - * - * If the named file cannot be read or there are no new tests that can be - * added, a PHPUnit_Framework_Warning will be created instead, - * leaving the current test run untouched. - * - * @param string $filename - * @param array $phptOptions Array with ini settings for the php instance - * run, key being the name if the setting, - * value the ini value. - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 2.3.0 - * @author Stefano F. Rausch - */ - public function addTestFile($filename, $phptOptions = array()) - { - if (!is_string($filename)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (file_exists($filename) && substr($filename, -5) == '.phpt') { - $this->addTest( - new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions) - ); - - return; - } - - $classes = get_declared_classes(); - $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename); - $newClasses = array_values(array_diff(get_declared_classes(), $classes)); - $baseName = str_replace('.php', '', basename($filename)); - - foreach ($newClasses as $className) { - if (substr($className, 0 - strlen($baseName)) == $baseName) { - $class = new ReflectionClass($className); - - if ($class->getFileName() == $filename) { - $newClasses = array($className); - break; - } - } - } - - foreach ($newClasses as $className) { - $class = new ReflectionClass($className); - - if (!$class->isAbstract()) { - if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) { - $method = $class->getMethod( - PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME - ); - - if ($method->isStatic()) { - $this->addTest($method->invoke(null, $className)); - } - } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) { - $this->addTestSuite($class); - } - } - } - - $this->numTests = -1; - } - - /** - * Wrapper for addTestFile() that adds multiple test files. - * - * @param array|Iterator $filenames - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 2.3.0 - */ - public function addTestFiles($filenames) - { - if (!(is_array($filenames) || - (is_object($filenames) && $filenames instanceof Iterator))) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'array or iterator' - ); - } - - foreach ($filenames as $filename) { - $this->addTestFile((string) $filename); - } - } - - /** - * Counts the number of test cases that will be run by this test. - * - * @return integer - */ - public function count() - { - $numTests = 0; - - foreach ($this as $test) { - $numTests += count($test); - } - - return $numTests; - } - - /** - * @param ReflectionClass $theClass - * @param string $name - * @return PHPUnit_Framework_Test - * @throws PHPUnit_Framework_Exception - */ - public static function createTest(ReflectionClass $theClass, $name) - { - $className = $theClass->getName(); - - if (!$theClass->isInstantiable()) { - return self::warning( - sprintf('Cannot instantiate class "%s".', $className) - ); - } - - $backupSettings = PHPUnit_Util_Test::getBackupSettings( - $className, $name - ); - $preserveGlobalState = PHPUnit_Util_Test::getPreserveGlobalStateSettings( - $className, $name - ); - $runTestInSeparateProcess = PHPUnit_Util_Test::getProcessIsolationSettings( - $className, $name - ); - - $constructor = $theClass->getConstructor(); - - if ($constructor !== null) { - $parameters = $constructor->getParameters(); - - // TestCase() or TestCase($name) - if (count($parameters) < 2) { - $test = new $className; - } - - // TestCase($name, $data) - else { - try { - $data = PHPUnit_Util_Test::getProvidedData( - $className, $name - ); - } catch (Exception $e) { - $message = sprintf( - 'The data provider specified for %s::%s is invalid.', - $className, - $name - ); - - $_message = $e->getMessage(); - - if (!empty($_message)) { - $message .= "\n" . $_message; - } - - $data = self::warning($message); - } - - // Test method with @dataProvider. - if (isset($data)) { - $test = new PHPUnit_Framework_TestSuite_DataProvider( - $className . '::' . $name - ); - - if (empty($data)) { - $data = self::warning( - sprintf( - 'No tests found in suite "%s".', - $test->getName() - ) - ); - } - - $groups = PHPUnit_Util_Test::getGroups($className, $name); - - if ($data instanceof PHPUnit_Framework_Warning) { - $test->addTest($data, $groups); - } else { - foreach ($data as $_dataName => $_data) { - $_test = new $className($name, $_data, $_dataName); - - if ($runTestInSeparateProcess) { - $_test->setRunTestInSeparateProcess(true); - - if ($preserveGlobalState !== null) { - $_test->setPreserveGlobalState($preserveGlobalState); - } - } - - if ($backupSettings['backupGlobals'] !== null) { - $_test->setBackupGlobals( - $backupSettings['backupGlobals'] - ); - } - - if ($backupSettings['backupStaticAttributes'] !== null) { - $_test->setBackupStaticAttributes( - $backupSettings['backupStaticAttributes'] - ); - } - - $test->addTest($_test, $groups); - } - } - } else { - $test = new $className; - } - } - } - - if (!isset($test)) { - throw new PHPUnit_Framework_Exception('No valid test provided.'); - } - - if ($test instanceof PHPUnit_Framework_TestCase) { - $test->setName($name); - - if ($runTestInSeparateProcess) { - $test->setRunTestInSeparateProcess(true); - - if ($preserveGlobalState !== null) { - $test->setPreserveGlobalState($preserveGlobalState); - } - } - - if ($backupSettings['backupGlobals'] !== null) { - $test->setBackupGlobals($backupSettings['backupGlobals']); - } - - if ($backupSettings['backupStaticAttributes'] !== null) { - $test->setBackupStaticAttributes( - $backupSettings['backupStaticAttributes'] - ); - } - } - - return $test; - } - - /** - * Creates a default TestResult object. - * - * @return PHPUnit_Framework_TestResult - */ - protected function createResult() - { - return new PHPUnit_Framework_TestResult; - } - - /** - * Returns the name of the suite. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Returns the test groups of the suite. - * - * @return array - * @since Method available since Release 3.2.0 - */ - public function getGroups() - { - return array_keys($this->groups); - } - - public function getGroupDetails() - { - return $this->groups; - } - - /** - * Set tests groups of the test case - * - * @param array $groups - * @since Method available since Release 4.0.0 - */ - public function setGroupDetails(array $groups) - { - $this->groups = $groups; - } - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - */ - public function run(PHPUnit_Framework_TestResult $result = null) - { - if ($result === null) { - $result = $this->createResult(); - } - - if (count($this) == 0) { - return $result; - } - - $hookMethods = PHPUnit_Util_Test::getHookMethods($this->name); - - $result->startTestSuite($this); - - try { - $this->setUp(); - - foreach ($hookMethods['beforeClass'] as $beforeClassMethod) { - if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $beforeClassMethod)) { - call_user_func(array($this->name, $beforeClassMethod)); - } - } - } catch (PHPUnit_Framework_SkippedTestSuiteError $e) { - $numTests = count($this); - - for ($i = 0; $i < $numTests; $i++) { - $result->addFailure($this, $e, 0); - } - - return $result; - } catch (Exception $e) { - $numTests = count($this); - - for ($i = 0; $i < $numTests; $i++) { - $result->addError($this, $e, 0); - } - - return $result; - } - - foreach ($this as $test) { - if ($result->shouldStop()) { - break; - } - - if ($test instanceof PHPUnit_Framework_TestCase || - $test instanceof PHPUnit_Framework_TestSuite) { - $test->setBackupGlobals($this->backupGlobals); - $test->setBackupStaticAttributes($this->backupStaticAttributes); - $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess); - } - - $test->run($result); - } - - foreach ($hookMethods['afterClass'] as $afterClassMethod) { - if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $afterClassMethod)) { - call_user_func(array($this->name, $afterClassMethod)); - } - } - - $this->tearDown(); - - $result->endTestSuite($this); - - return $result; - } - - /** - * @param boolean $runTestInSeparateProcess - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.7.0 - */ - public function setRunTestInSeparateProcess($runTestInSeparateProcess) - { - if (is_bool($runTestInSeparateProcess)) { - $this->runTestInSeparateProcess = $runTestInSeparateProcess; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - } - - /** - * Runs a test. - * - * @deprecated - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_TestResult $result - */ - public function runTest(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result) - { - $test->run($result); - } - - /** - * Sets the name of the suite. - * - * @param string - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Returns the test at the given index. - * - * @param integer - * @return PHPUnit_Framework_Test - */ - public function testAt($index) - { - if (isset($this->tests[$index])) { - return $this->tests[$index]; - } else { - return false; - } - } - - /** - * Returns the tests as an enumeration. - * - * @return array - */ - public function tests() - { - return $this->tests; - } - - /** - * Set tests of the test suite - * - * @param array $tests - * @since Method available since Release 4.0.0 - */ - public function setTests(array $tests) - { - $this->tests = $tests; - } - - /** - * Mark the test suite as skipped. - * - * @param string $message - * @throws PHPUnit_Framework_SkippedTestSuiteError - * @since Method available since Release 3.0.0 - */ - public function markTestSuiteSkipped($message = '') - { - throw new PHPUnit_Framework_SkippedTestSuiteError($message); - } - - /** - * @param ReflectionClass $class - * @param ReflectionMethod $method - */ - protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method) - { - if (!$this->isTestMethod($method)) - return; - - $name = $method->getName(); - - if (!$method->isPublic()) { - $this->addTest( - self::warning( - sprintf( - 'Test method "%s" in test class "%s" is not public.', - $name, - $class->getName() - ) - ) - ); - - return; - } - - $test = self::createTest($class, $name); - - if ($test instanceof PHPUnit_Framework_TestCase || - $test instanceof PHPUnit_Framework_TestSuite_DataProvider) { - $test->setDependencies( - PHPUnit_Util_Test::getDependencies($class->getName(), $name) - ); - } - - $this->addTest( - $test, - PHPUnit_Util_Test::getGroups($class->getName(), $name) - ); - } - - /** - * @param ReflectionMethod $method - * @return boolean - */ - public static function isTestMethod(ReflectionMethod $method) - { - if (strpos($method->name, 'test') === 0) { - return true; - } - - // @scenario on TestCase::testMethod() - // @test on TestCase::testMethod() - $doc_comment = $method->getDocComment(); - - return strpos($doc_comment, '@test') !== false || - strpos($doc_comment, '@scenario') !== false; - } - - /** - * @param string $message - * @return PHPUnit_Framework_Warning - */ - protected static function warning($message) - { - return new PHPUnit_Framework_Warning($message); - } - - /** - * @param boolean $backupGlobals - * @since Method available since Release 3.3.0 - */ - public function setBackupGlobals($backupGlobals) - { - if (is_null($this->backupGlobals) && is_bool($backupGlobals)) { - $this->backupGlobals = $backupGlobals; - } - } - - /** - * @param boolean $backupStaticAttributes - * @since Method available since Release 3.4.0 - */ - public function setBackupStaticAttributes($backupStaticAttributes) - { - if (is_null($this->backupStaticAttributes) && - is_bool($backupStaticAttributes)) { - $this->backupStaticAttributes = $backupStaticAttributes; - } - } - - /** - * Returns an iterator for this test suite. - * - * @return RecursiveIteratorIterator - * @since Method available since Release 3.1.0 - */ - public function getIterator() - { - $iterator = new PHPUnit_Util_TestSuiteIterator($this); - - if ($this->iteratorFilter !== null) { - $iterator = $this->iteratorFilter->factory($iterator, $this); - } - - return $iterator; - } - - public function injectFilter(PHPUnit_Runner_Filter_Factory $filter) - { - $this->iteratorFilter = $filter; - foreach ($this as $test) { - if ($test instanceof PHPUnit_Framework_TestSuite) { - $test->injectFilter($filter); - } - } - } - - /** - * Template Method that is called before the tests - * of this test suite are run. - * - * @since Method available since Release 3.1.0 - */ - protected function setUp() - { - } - - /** - * Template Method that is called after the tests - * of this test suite have finished running. - * - * @since Method available since Release 3.1.0 - */ - protected function tearDown() - { - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Thrown when an assertion failed. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Framework_AssertionFailedError extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing -{ - /** - * Wrapper for getMessage() which is declared as final. - * - * @return string - */ - public function toString() - { - return $this->getMessage(); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A Test can be run and collect its results. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 2.0.0 - */ -interface PHPUnit_Framework_Test extends Countable -{ - /** - * Runs a test and collects its result in a TestResult instance. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - */ - public function run(PHPUnit_Framework_TestResult $result = null); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a test that printed output. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.0 - */ -class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.2.0 - */ - -/** - * Wrapper for PHP errors. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.2.0 - */ -class PHPUnit_Framework_Error extends Exception -{ - /** - * Constructor. - * - * @param string $message - * @param integer $code - * @param string $file - * @param integer $line - * @param Exception $previous - */ - public function __construct($message, $code, $file, $line, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - - $this->file = $file; - $this->line = $line; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Logical XOR. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint[] - */ - protected $constraints = array(); - - /** - * @param PHPUnit_Framework_Constraint[] $constraints - */ - public function setConstraints(array $constraints) - { - $this->constraints = array(); - - foreach ($constraints as $constraint) { - if (!($constraint instanceof PHPUnit_Framework_Constraint)) { - $constraint = new PHPUnit_Framework_Constraint_IsEqual( - $constraint - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = true; - $lastResult = null; - $constraint = null; - - foreach ($this->constraints as $constraint) { - $result = $constraint->evaluate($other, $description, true); - - if ($result === $lastResult) { - $success = false; - break; - } - - $lastResult = $result; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' xor '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.4.0 - */ - public function count() - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += count($constraint); - } - - return $count; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.0 - */ - -/** - * Constraint that asserts that the class it is evaluated for has a given - * attribute. - * - * The attribute name is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.0 - */ -class PHPUnit_Framework_Constraint_ClassHasAttribute extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $attributeName; - - /** - * @param string $attributeName - */ - public function __construct($attributeName) - { - parent::__construct(); - $this->attributeName = $attributeName; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - $class = new ReflectionClass($other); - - return $class->hasProperty($this->attributeName); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return sprintf( - 'has attribute "%s"', - - $this->attributeName - ); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - '%sclass "%s" %s', - - is_object($other) ? 'object of ' : '', - is_object($other) ? get_class($other) : $other, - $this->toString() - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.0 - */ - -/** - * Constraint that checks whether a variable is empty(). - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.0 - */ -class PHPUnit_Framework_Constraint_IsEmpty extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - if ($other instanceof Countable) { - return count($other) === 0; - } - - return empty($other); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is empty'; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - $type = gettype($other); - - return sprintf( - '%s %s %s', - - $type[0] == 'a' || $type[0] == 'o' ? 'an' : 'a', - $type, - $this->toString() - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.0 - */ -class PHPUnit_Framework_Constraint_Count extends PHPUnit_Framework_Constraint -{ - /** - * @var integer - */ - protected $expectedCount = 0; - - /** - * @param integer $expected - */ - public function __construct($expected) - { - parent::__construct(); - $this->expectedCount = $expected; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other - * @return boolean - */ - protected function matches($other) - { - return $this->expectedCount === $this->getCountOf($other); - } - - /** - * @param mixed $other - * @return boolean - */ - protected function getCountOf($other) - { - if ($other instanceof Countable || is_array($other)) { - return count($other); - } - - else if ($other instanceof Traversable) { - if ($other instanceof IteratorAggregate) { - $iterator = $other->getIterator(); - } else { - $iterator = $other; - } - - $key = $iterator->key(); - $count = iterator_count($iterator); - - // manually rewind $iterator to previous key, since iterator_count - // moves pointer - if ($key !== null) { - $iterator->rewind(); - while ($key !== $iterator->key()) { - $iterator->next(); - } - } - - return $count; - } - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - 'actual size %d matches expected size %d', - - $this->getCountOf($other), - $this->expectedCount - ); - } - - /** - * @return string - */ - public function toString() - { - return 'count matches '; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * Constraint that asserts that the string it is evaluated for begins with a - * given prefix. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Framework_Constraint_StringStartsWith extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $prefix; - - /** - * @param string $prefix - */ - public function __construct($prefix) - { - parent::__construct(); - $this->prefix = $prefix; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return strpos($other, $this->prefix) === 0; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'starts with "' . $this->prefix . '"'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.0 - */ -class PHPUnit_Framework_Constraint_SameSize extends PHPUnit_Framework_Constraint_Count -{ - /** - * @var integer - */ - protected $expectedCount; - - /** - * @param integer $expected - */ - public function __construct($expected) - { - parent::__construct($this->getCountOf($expected)); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Kore Nordmann - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that checks if one value is equal to another. - * - * Equality is checked with PHP's == operator, the operator is explained in - * detail at {@url http://www.php.net/manual/en/types.comparisons.php}. - * Two values are equal if they have the same value disregarding type. - * - * The expected value is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Kore Nordmann - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_IsEqual extends PHPUnit_Framework_Constraint -{ - /** - * @var mixed - */ - protected $value; - - /** - * @var float - */ - protected $delta = 0.0; - - /** - * @var integer - */ - protected $maxDepth = 10; - - /** - * @var boolean - */ - protected $canonicalize = false; - - /** - * @var boolean - */ - protected $ignoreCase = false; - - /** - * @var SebastianBergmann\Comparator\ComparisonFailure - */ - protected $lastFailure; - - /** - * @param mixed $value - * @param float $delta - * @param integer $maxDepth - * @param boolean $canonicalize - * @param boolean $ignoreCase - * @throws PHPUnit_Framework_Exception - */ - public function __construct($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false) - { - parent::__construct(); - - if (!is_numeric($delta)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'numeric'); - } - - if (!is_int($maxDepth)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'integer'); - } - - if (!is_bool($canonicalize)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean'); - } - - if (!is_bool($ignoreCase)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'boolean'); - } - - $this->value = $value; - $this->delta = $delta; - $this->maxDepth = $maxDepth; - $this->canonicalize = $canonicalize; - $this->ignoreCase = $ignoreCase; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $comparatorFactory = new SebastianBergmann\Comparator\Factory; - - try { - $comparator = $comparatorFactory->getComparatorFor( - $other, $this->value - ); - - $comparator->assertEquals( - $this->value, - $other, - $this->delta, - $this->canonicalize, - $this->ignoreCase - ); - } catch (SebastianBergmann\Comparator\ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new PHPUnit_Framework_ExpectationFailedException( - trim($description . "\n" . $f->getMessage()), - $f - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - $delta = ''; - - if (is_string($this->value)) { - if (strpos($this->value, "\n") !== false) { - return 'is equal to '; - } else { - return sprintf( - 'is equal to ', - - $this->value - ); - } - } else { - if ($this->delta != 0) { - $delta = sprintf( - ' with delta <%F>', - - $this->delta - ); - } - - return sprintf( - 'is equal to %s%s', - - $this->exporter->export($this->value), - $delta - ); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Logical OR. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_Or extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint[] - */ - protected $constraints = array(); - - /** - * @param PHPUnit_Framework_Constraint[] $constraints - */ - public function setConstraints(array $constraints) - { - $this->constraints = array(); - - foreach ($constraints as $constraint) { - if (!($constraint instanceof PHPUnit_Framework_Constraint)) { - $constraint = new PHPUnit_Framework_Constraint_IsEqual( - $constraint - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = false; - $constraint = null; - - foreach ($this->constraints as $constraint) { - if ($constraint->evaluate($other, $description, true)) { - $success = true; - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' or '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.4.0 - */ - public function count() - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += count($constraint); - } - - return $count; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the string it is evaluated for contains - * a given string. - * - * Uses strpos() to find the position of the string in the input, if not found - * the evaluation fails. - * - * The sub-string is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_StringContains extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $string; - - /** - * @var boolean - */ - protected $ignoreCase; - - /** - * @param string $string - * @param boolean $ignoreCase - */ - public function __construct($string, $ignoreCase = false) - { - parent::__construct(); - - $this->string = $string; - $this->ignoreCase = $ignoreCase; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - if ($this->ignoreCase) { - return stripos($other, $this->string) !== false; - } else { - return strpos($other, $this->string) !== false; - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - if ($this->ignoreCase) { - $string = strtolower($this->string); - } else { - $string = $this->string; - } - - return sprintf( - 'contains "%s"', - - $string - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.0 - */ - -abstract class PHPUnit_Framework_Constraint_Composite extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint - */ - protected $innerConstraint; - - /** - * @param PHPUnit_Framework_Constraint $innerConstraint - * @param string $attributeName - */ - public function __construct(PHPUnit_Framework_Constraint $innerConstraint) - { - parent::__construct(); - $this->innerConstraint = $innerConstraint; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - try { - return $this->innerConstraint->evaluate( - $other, - $description, - $returnResult - ); - } catch (PHPUnit_Framework_ExpectationFailedException $e) { - $this->fail($other, $description); - } - } - - /** - * Counts the number of constraint elements. - * - * @return integer - */ - public function count() - { - return count($this->innerConstraint); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.6 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.6 - */ -class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Constraint -{ - /** - * @var integer - */ - protected $expectedMessage; - - /** - * @param string $expected - */ - public function __construct($expected) - { - parent::__construct(); - $this->expectedMessage = $expected; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param Exception $other - * @return boolean - */ - protected function matches($other) - { - return strpos($other->getMessage(), $this->expectedMessage) !== false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - "exception message '%s' contains '%s'", - $other->getMessage(), - $this->expectedMessage - ); - } - - /** - * @return string - */ - public function toString() - { - return 'exception message contains '; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Constraint that accepts null. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Constraint_IsNull extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $other === null; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is null'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.0 - */ - -use SebastianBergmann\Diff\Differ; - -/** - * ... - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.0 - */ -class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch -{ - /** - * @var string - */ - protected $string; - - /** - * @param string $string - */ - public function __construct($string) - { - parent::__construct($string); - - $this->pattern = $this->createPatternFromFormat( - preg_replace('/\r\n/', "\n", $string) - ); - - $this->string = $string; - } - - protected function failureDescription($other) - { - return "format description matches text"; - } - - protected function additionalFailureDescription($other) - { - $from = preg_split('(\r\n|\r|\n)', $this->string); - $to = preg_split('(\r\n|\r|\n)', $other); - - foreach ($from as $index => $line) { - if (isset($to[$index]) && $line !== $to[$index]) { - $line = $this->createPatternFromFormat($line); - - if (preg_match($line, $to[$index]) > 0) { - $from[$index] = $to[$index]; - } - } - } - - $this->string = join("\n", $from); - $other = join("\n", $to); - - $differ = new Differ("--- Expected\n+++ Actual\n"); - - return $differ->diff($this->string, $other); - } - - protected function createPatternFromFormat($string) - { - $string = str_replace( - array( - '%e', - '%s', - '%S', - '%a', - '%A', - '%w', - '%i', - '%d', - '%x', - '%f', - '%c' - ), - array( - '\\' . DIRECTORY_SEPARATOR, - '[^\r\n]+', - '[^\r\n]*', - '.+', - '.*', - '\s*', - '[+-]?\d+', - '\d+', - '[0-9a-fA-F]+', - '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', - '.' - ), - preg_quote($string, '/') - ); - - return '/^' . $string . '$/s'; - } - -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the value it is evaluated for is of a - * specified type. - * - * The expected value is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_IsType extends PHPUnit_Framework_Constraint -{ - const TYPE_ARRAY = 'array'; - const TYPE_BOOL = 'bool'; - const TYPE_FLOAT = 'float'; - const TYPE_INT = 'int'; - const TYPE_null = 'null'; - const TYPE_NUMERIC = 'numeric'; - const TYPE_OBJECT = 'object'; - const TYPE_RESOURCE = 'resource'; - const TYPE_STRING = 'string'; - const TYPE_SCALAR = 'scalar'; - const TYPE_CALLABLE = 'callable'; - - /** - * @var array - */ - protected $types = array( - 'array' => true, - 'boolean' => true, - 'bool' => true, - 'float' => true, - 'integer' => true, - 'int' => true, - 'null' => true, - 'numeric' => true, - 'object' => true, - 'resource' => true, - 'string' => true, - 'scalar' => true, - 'callable' => true - ); - - /** - * @var string - */ - protected $type; - - /** - * @param string $type - * @throws PHPUnit_Framework_Exception - */ - public function __construct($type) - { - parent::__construct(); - - if (!isset($this->types[$type])) { - throw new PHPUnit_Framework_Exception( - sprintf( - 'Type specified for PHPUnit_Framework_Constraint_IsType <%s> ' . - 'is not a valid type.', - $type - ) - ); - } - - $this->type = $type; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - switch ($this->type) { - case 'numeric': { - return is_numeric($other); - } - - case 'integer': - case 'int': { - return is_integer($other); - } - - case 'float': { - return is_float($other); - } - - case 'string': { - return is_string($other); - } - - case 'boolean': - case 'bool': { - return is_bool($other); - } - - case 'null': { - return is_null($other); - } - - case 'array': { - return is_array($other); - } - - case 'object': { - return is_object($other); - } - - case 'resource': { - return is_resource($other); - } - - case 'scalar': { - return is_scalar($other); - } - - case 'callable': { - return is_callable($other); - } - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return sprintf( - 'is of type "%s"', - - $this->type - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the object it is evaluated for is an instance - * of a given class. - * - * The expected class name is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_IsInstanceOf extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $className; - - /** - * @param string $className - */ - public function __construct($className) - { - parent::__construct(); - $this->className = $className; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return ($other instanceof $this->className); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - '%s is an instance of %s "%s"', - $this->exporter->shortenedExport($other), - $this->getType(), - $this->className - ); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return sprintf( - 'is instance of %s "%s"', - $this->getType(), - $this->className - ); - } - - private function getType() - { - try { - $reflection = new ReflectionClass($this->className); - if ($reflection->isInterface()) { - return 'interface'; - } - } catch (ReflectionException $e) { - } - - return 'class'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Constraint that accepts true. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $other === true; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is true'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Constraint that accepts false. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Constraint_IsFalse extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $other === false; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is false'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.6 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.6 - */ -class PHPUnit_Framework_Constraint_ExceptionCode extends PHPUnit_Framework_Constraint -{ - /** - * @var integer - */ - protected $expectedCode; - - /** - * @param integer $expected - */ - public function __construct($expected) - { - parent::__construct(); - $this->expectedCode = $expected; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param Exception $other - * @return boolean - */ - protected function matches($other) - { - return (string) $other->getCode() == (string) $this->expectedCode; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - '%s is equal to expected exception code %s', - $this->exporter->export($other->getCode()), - $this->exporter->export($this->expectedCode) - ); - } - - /** - * @return string - */ - public function toString() - { - return 'exception code is '; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.7.20 - */ - -/** - * Constraint that asserts that a string is valid JSON. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.7.20 - */ -class PHPUnit_Framework_Constraint_IsJson extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - json_decode($other); - if (json_last_error()) { - return false; - } - - return true; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - json_decode($other); - $error = PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError( - json_last_error() - ); - - return sprintf( - '%s is valid JSON (%s)', - - $this->exporter->shortenedExport($other), - $error - ); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is valid JSON'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Logical NOT. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ - -class PHPUnit_Framework_Constraint_Not extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint - */ - protected $constraint; - - /** - * @param PHPUnit_Framework_Constraint $constraint - */ - public function __construct($constraint) - { - parent::__construct(); - - if (!($constraint instanceof PHPUnit_Framework_Constraint)) { - $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint); - } - - $this->constraint = $constraint; - } - - /** - * @param string $string - * @return string - */ - public static function negate($string) - { - return str_replace( - array( - 'contains ', - 'exists', - 'has ', - 'is ', - 'are ', - 'matches ', - 'starts with ', - 'ends with ', - 'reference ', - 'not not ' - ), - array( - 'does not contain ', - 'does not exist', - 'does not have ', - 'is not ', - 'are not ', - 'does not match ', - 'starts not with ', - 'ends not with ', - 'don\'t reference ', - 'not ' - ), - $string - ); - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = !$this->constraint->evaluate($other, $description, true); - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - switch (get_class($this->constraint)) { - case 'PHPUnit_Framework_Constraint_And': - case 'PHPUnit_Framework_Constraint_Not': - case 'PHPUnit_Framework_Constraint_Or': { - return 'not( ' . $this->constraint->failureDescription($other) . ' )'; - } - break; - - default: { - return self::negate( - $this->constraint->failureDescription($other) - ); - } - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - switch (get_class($this->constraint)) { - case 'PHPUnit_Framework_Constraint_And': - case 'PHPUnit_Framework_Constraint_Not': - case 'PHPUnit_Framework_Constraint_Or': { - return 'not( ' . $this->constraint->toString() . ' )'; - } - break; - - default: { - return self::negate( - $this->constraint->toString() - ); - } - } - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.4.0 - */ - public function count() - { - return count($this->constraint); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the array it is evaluated for has a given key. - * - * Uses array_key_exists() to check if the key is found in the input array, if - * not found the evaluation fails. - * - * The array key is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_ArrayHasKey extends PHPUnit_Framework_Constraint -{ - /** - * @var integer|string - */ - protected $key; - - /** - * @param integer|string $key - */ - public function __construct($key) - { - parent::__construct(); - $this->key = $key; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - if (is_array($other)) { - return array_key_exists($this->key, $other); - } - - if ($other instanceof ArrayAccess) { - return $other->offsetExists($this->key); - } - - return false; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'has the key ' . $this->exporter->export($this->key); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return 'an array ' . $this->toString(); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the string it is evaluated for matches - * a regular expression. - * - * Checks a given value using the Perl Compatible Regular Expression extension - * in PHP. The pattern is matched by executing preg_match(). - * - * The pattern string passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_PCREMatch extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $pattern; - - /** - * @param string $pattern - */ - public function __construct($pattern) - { - parent::__construct(); - $this->pattern = $pattern; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return preg_match($this->pattern, $other) > 0; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return sprintf( - 'matches PCRE pattern "%s"', - - $this->pattern - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Logical AND. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_And extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint[] - */ - protected $constraints = array(); - - /** - * @var PHPUnit_Framework_Constraint - */ - protected $lastConstraint = null; - - /** - * @param PHPUnit_Framework_Constraint[] $constraints - * @throws PHPUnit_Framework_Exception - */ - public function setConstraints(array $constraints) - { - $this->constraints = array(); - - foreach ($constraints as $constraint) { - if (!($constraint instanceof PHPUnit_Framework_Constraint)) { - throw new PHPUnit_Framework_Exception( - 'All parameters to ' . __CLASS__ . - ' must be a constraint object.' - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = true; - $constraint = null; - - foreach ($this->constraints as $constraint) { - if (!$constraint->evaluate($other, $description, true)) { - $success = false; - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' and '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.4.0 - */ - public function count() - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += count($constraint); - } - - return $count; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - */ - -/** - * Constraint that evaluates against a specified closure. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Timon Rapp - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - */ -class PHPUnit_Framework_Constraint_Callback extends PHPUnit_Framework_Constraint -{ - private $callback; - - /** - * @param callable $callback - * @throws PHPUnit_Framework_Exception - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 1, 'callable' - ); - } - - parent::__construct(); - - $this->callback = $callback; - } - - /** - * Evaluates the constraint for parameter $value. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return call_user_func($this->callback, $other); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is accepted by specified callback'; - } - - private function callbackToString($callback) - { - if (!is_array($callback)) { - return $callback; - } - if (empty($callback)) { - return "empty array"; - } - if (!isset($callback[0]) || !isset($callback[1])) { - return "array without indexes 0 and 1 set"; - } - if (is_object($callback[0])) { - $callback[0] = get_class($callback[0]); - } - - return $callback[0] . '::' . $callback[1]; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.4 - */ - -/** - * Constraint that asserts that the Traversable it is applied to contains - * only values of a given type. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.4 - */ -class PHPUnit_Framework_Constraint_TraversableContainsOnly extends PHPUnit_Framework_Constraint -{ - /** - * @var PHPUnit_Framework_Constraint - */ - protected $constraint; - - /** - * @var string - */ - protected $type; - - /** - * @param string $type - * @param boolean $isNativeType - */ - public function __construct($type, $isNativeType = true) - { - parent::__construct(); - - if ($isNativeType) { - $this->constraint = new PHPUnit_Framework_Constraint_IsType($type); - } else { - $this->constraint = new PHPUnit_Framework_Constraint_IsInstanceOf( - $type - ); - } - - $this->type = $type; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - $success = true; - - foreach ($other as $item) { - if (!$this->constraint->evaluate($item, '', true)) { - $success = false; - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'contains only values of type "' . $this->type . '"'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.0 - */ - -class PHPUnit_Framework_Constraint_Attribute extends PHPUnit_Framework_Constraint_Composite -{ - /** - * @var string - */ - protected $attributeName; - - /** - * @param PHPUnit_Framework_Constraint $constraint - * @param string $attributeName - */ - public function __construct(PHPUnit_Framework_Constraint $constraint, $attributeName) - { - parent::__construct($constraint); - - $this->attributeName = $attributeName; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - return parent::evaluate( - PHPUnit_Framework_Assert::readAttribute( - $other, $this->attributeName - ), - $description, - $returnResult - ); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'attribute "' . $this->attributeName . '" ' . - $this->innerConstraint->toString(); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return $this->toString(); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the value it is evaluated for is less than - * a given value. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_LessThan extends PHPUnit_Framework_Constraint -{ - /** - * @var numeric - */ - protected $value; - - /** - * @param numeric $value - */ - public function __construct($value) - { - parent::__construct(); - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $this->value > $other; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is less than ' . $this->exporter->export($this->value); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bastian Feder - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause - * @link http://www.phpunit.de/ - * @since File available since Release 3.7.0 - */ - -/** - * Asserts whether or not two JSON objects are equal. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bastian Feder - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause - * @link http://www.phpunit.de/ - * @since Class available since Release 3.7.0 - */ -class PHPUnit_Framework_Constraint_JsonMatches extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $value; - - /** - * Creates a new constraint. - * - * @param string $value - */ - public function __construct($value) - { - parent::__construct(); - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - $decodedOther = json_decode($other); - if (json_last_error()) { - return false; - } - - $decodedValue = json_decode($this->value); - if (json_last_error()) { - return false; - } - - return $decodedOther == $decodedValue; - } - - /** - * Returns a string representation of the object. - * - * @return string - */ - public function toString() - { - return sprintf( - 'matches JSON string "%s"', - $this->value - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the value it is evaluated for is greater - * than a given value. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_GreaterThan extends PHPUnit_Framework_Constraint -{ - /** - * @var numeric - */ - protected $value; - - /** - * @param numeric $value - */ - public function __construct($value) - { - parent::__construct(); - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $this->value < $other; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is greater than ' . $this->exporter->export($this->value); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the Traversable it is applied to contains - * a given value. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_TraversableContains extends PHPUnit_Framework_Constraint -{ - /** - * @var boolean - */ - protected $checkForObjectIdentity; - - /** - * @var boolean - */ - protected $checkForNonObjectIdentity; - - /** - * @var mixed - */ - protected $value; - - /** - * @param mixed $value - * @param boolean $checkForObjectIdentity - * @param boolean $checkForNonObjectIdentity - * @throws PHPUnit_Framework_Exception - */ - public function __construct($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false) - { - parent::__construct(); - - if (!is_bool($checkForObjectIdentity)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean'); - } - - if (!is_bool($checkForNonObjectIdentity)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean'); - } - - $this->checkForObjectIdentity = $checkForObjectIdentity; - $this->checkForNonObjectIdentity = $checkForNonObjectIdentity; - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - if ($other instanceof SplObjectStorage) { - return $other->contains($this->value); - } - - if (is_object($this->value)) { - foreach ($other as $element) { - if (($this->checkForObjectIdentity && - $element === $this->value) || - (!$this->checkForObjectIdentity && - $element == $this->value)) { - return true; - } - } - } else { - foreach ($other as $element) { - if (($this->checkForNonObjectIdentity && - $element === $this->value) || - (!$this->checkForNonObjectIdentity && - $element == $this->value)) { - return true; - } - } - } - - return false; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - if (is_string($this->value) && strpos($this->value, "\n") !== false) { - return 'contains "' . $this->value . '"'; - } else { - return 'contains ' . $this->exporter->export($this->value); - } - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - '%s %s', - - is_array($other) ? 'an array' : 'a traversable', - $this->toString() - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that checks if the file(name) that it is evaluated for exists. - * - * The file path to check is passed as $other in evaluate(). - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_FileExists extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return file_exists($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - return sprintf( - 'file "%s" exists', - - $other - ); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'file exists'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that accepts any input value. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_IsAnything extends PHPUnit_Framework_Constraint -{ - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - return $returnResult ? true : null; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'is anything'; - } - - /** - * Counts the number of constraint elements. - * - * @return integer - * @since Method available since Release 3.5.0 - */ - public function count() - { - return 0; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that the object it is evaluated for has a given - * attribute. - * - * The attribute name is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_ObjectHasAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - $object = new ReflectionObject($other); - - return $object->hasProperty($this->attributeName); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bastian Feder - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause - * @link http://www.phpunit.de/ - * @since File available since Release 3.7.0 - */ - -/** - * Provides human readable messages for each JSON error. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Bastian Feder - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause - * @link http://www.phpunit.de/ - * @since Class available since Release 3.7.0 - */ -class PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider -{ - /** - * Translates JSON error to a human readable string. - * - * @param string $error - * @return string - */ - public static function determineJsonError($error, $prefix = '') - { - switch ($error) { - case JSON_ERROR_NONE: - return; - case JSON_ERROR_DEPTH: - return $prefix . 'Maximum stack depth exceeded'; - case JSON_ERROR_STATE_MISMATCH: - return $prefix . 'Underflow or the modes mismatch'; - case JSON_ERROR_CTRL_CHAR: - return $prefix . 'Unexpected control character found'; - case JSON_ERROR_SYNTAX: - return $prefix . 'Syntax error, malformed JSON'; - case JSON_ERROR_UTF8: - return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded'; - default: - return $prefix . 'Unknown error'; - } - } - - /** - * Translates a given type to a human readable message prefix. - * - * @param string $type - * @return string - */ - public static function translateTypeToPrefix($type) - { - switch (strtolower($type)) { - case 'expected': - $prefix = 'Expected value JSON decode error - '; - break; - case 'actual': - $prefix = 'Actual value JSON decode error - '; - break; - default: - $prefix = ''; - break; - } - - return $prefix; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.0 - */ - -/** - * Constraint that asserts that the class it is evaluated for has a given - * static attribute. - * - * The attribute name is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.0 - */ -class PHPUnit_Framework_Constraint_ClassHasStaticAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - $class = new ReflectionClass($other); - - if ($class->hasProperty($this->attributeName)) { - $attribute = $class->getProperty($this->attributeName); - - return $attribute->isStatic(); - } else { - return false; - } - } - - /** - * Returns a string representation of the constraint. - * - * @return string - * @since Method available since Release 3.3.0 - */ - public function toString() - { - return sprintf( - 'has static attribute "%s"', - - $this->attributeName - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.6 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.6 - */ -class PHPUnit_Framework_Constraint_Exception extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $className; - - /** - * @param string $className - */ - public function __construct($className) - { - parent::__construct(); - $this->className = $className; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return $other instanceof $this->className; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - if ($other !== null) { - $message = ''; - if ($other instanceof Exception) { - $message = '. Message was: "' . $other->getMessage() . '" at' - . "\n" . $other->getTraceAsString(); - } - - return sprintf( - 'exception of type "%s" matches expected exception "%s"%s', - - get_class($other), - $this->className, - $message - ); - } - - return sprintf( - 'exception of type "%s" is thrown', - - $this->className - ); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return sprintf( - 'exception of type "%s"', - - $this->className - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * Constraint that asserts that the string it is evaluated for ends with a given - * suffix. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Framework_Constraint_StringEndsWith extends PHPUnit_Framework_Constraint -{ - /** - * @var string - */ - protected $suffix; - - /** - * @param string $suffix - */ - public function __construct($suffix) - { - parent::__construct(); - $this->suffix = $suffix; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other Value or object to evaluate. - * @return bool - */ - protected function matches($other) - { - return substr($other, 0 - strlen($this->suffix)) == $this->suffix; - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - return 'ends with "' . $this->suffix . '"'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Constraint that asserts that one value is identical to another. - * - * Identical check is performed with PHP's === operator, the operator is - * explained in detail at - * {@url http://www.php.net/manual/en/types.comparisons.php}. - * Two values are identical if they have the same value and are of the same - * type. - * - * The expected value is passed in the constructor. - * - * @package PHPUnit - * @subpackage Framework_Constraint - * @author Sebastian Bergmann - * @author Bernhard Schussek - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Framework_Constraint_IsIdentical extends PHPUnit_Framework_Constraint -{ - /** - * @var float - */ - const EPSILON = 0.0000000001; - - /** - * @var mixed - */ - protected $value; - - /** - * @param mixed $value - */ - public function __construct($value) - { - parent::__construct(); - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @param mixed $other Value or object to evaluate. - * @param string $description Additional information about the test - * @param bool $returnResult Whether to return a result or throw an exception - * @return mixed - * @throws PHPUnit_Framework_ExpectationFailedException - */ - public function evaluate($other, $description = '', $returnResult = false) - { - if (is_double($this->value) && is_double($other) && - !is_infinite($this->value) && !is_infinite($other) && - !is_nan($this->value) && !is_nan($other)) { - $success = abs($this->value - $other) < self::EPSILON; - } else { - $success = $this->value === $other; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $f = null; - - // if both values are strings, make sure a diff is generated - if (is_string($this->value) && is_string($other)) { - $f = new SebastianBergmann\Comparator\ComparisonFailure( - $this->value, - $other, - $this->value, - $other - ); - } - - $this->fail($other, $description, $f); - } - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other Evaluated value or object. - * @return string - */ - protected function failureDescription($other) - { - if (is_object($this->value) && is_object($other)) { - return 'two variables reference the same object'; - } - - if (is_string($this->value) && is_string($other)) { - return 'two strings are identical'; - } - - return parent::failureDescription($other); - } - - /** - * Returns a string representation of the constraint. - * - * @return string - */ - public function toString() - { - if (is_object($this->value)) { - return 'is identical to an object of class "' . - get_class($this->value) . '"'; - } else { - return 'is identical to ' . - $this->exporter->export($this->value); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Wrapper for PHP deprecated errors. - * You can disable deprecated-to-exception conversion by setting - * - * - * PHPUnit_Framework_Error_Deprecated::$enabled = false; - * - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error -{ - public static $enabled = true; -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Wrapper for PHP notices. - * You can disable notice-to-exception conversion by setting - * - * - * PHPUnit_Framework_Error_Notice::$enabled = false; - * - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error -{ - public static $enabled = true; -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * Wrapper for PHP warnings. - * You can disable notice-to-exception conversion by setting - * - * - * PHPUnit_Framework_Error_Warning::$enabled = false; - * - * - * @package PHPUnit - * @subpackage Framework_Error - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error -{ - public static $enabled = true; -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Framework_Exception extends RuntimeException implements PHPUnit_Exception -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Giorgio Sironi - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * An empty Listener that can be extended to implement TestListener - * with just a few lines of code. - * @see PHPUnit_Framework_TestListener for documentation on the API methods. - * - * @package PHPUnit - * @subpackage Framework - * @author Giorgio Sironi - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -abstract class PHPUnit_Framework_BaseTestListener implements PHPUnit_Framework_TestListener -{ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) {} - - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) {} - - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) {} - - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) {} - - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) {} - - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {} - - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {} - - public function startTest(PHPUnit_Framework_Test $test) {} - - public function endTest(PHPUnit_Framework_Test $test, $time) {} -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * Extension to PHPUnit_Framework_AssertionFailedError to mark the special - * case of a test test that unintentionally covers code. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Framework_UnintentionallyCoveredCodeError extends PHPUnit_Framework_RiskyTestError -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * A TestListener that generates a logfile of the - * test execution using the Test Anything Protocol (TAP). - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Log_TAP extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener -{ - /** - * @var integer - */ - protected $testNumber = 0; - - /** - * @var integer - */ - protected $testSuiteLevel = 0; - - /** - * @var boolean - */ - protected $testSuccessful = true; - - /** - * Constructor. - * - * @param mixed $out - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.3.4 - */ - public function __construct($out = null) - { - parent::__construct($out); - $this->write("TAP version 13\n"); - } - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeNotOk($test, 'Error'); - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - $this->writeNotOk($test, 'Failure'); - - $message = explode( - "\n", PHPUnit_Framework_TestFailure::exceptionToString($e) - ); - - $diagnostic = array( - 'message' => $message[0], - 'severity' => 'fail' - ); - - if ($e instanceof PHPUnit_Framework_ExpectationFailedException) { - $cf = $e->getComparisonFailure(); - - if ($cf !== null) { - $diagnostic['data'] = array( - 'got' => $cf->getActual(), - 'expected' => $cf->getExpected() - ); - } - } - - $yaml = new Symfony\Component\Yaml\Dumper; - - $this->write( - sprintf( - " ---\n%s ...\n", - $yaml->dump($diagnostic, 2, 2) - ) - ); - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeNotOk($test, '', 'TODO Incomplete Test'); - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->write( - sprintf( - "ok %d - # RISKY%s\n", - - $this->testNumber, - $e->getMessage() != '' ? ' ' . $e->getMessage() : '' - ) - ); - - $this->testSuccessful = false; - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->write( - sprintf( - "ok %d - # SKIP%s\n", - - $this->testNumber, - $e->getMessage() != '' ? ' ' . $e->getMessage() : '' - ) - ); - - $this->testSuccessful = false; - } - - /** - * A testsuite started. - * - * @param PHPUnit_Framework_TestSuite $suite - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $this->testSuiteLevel++; - } - - /** - * A testsuite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $this->testSuiteLevel--; - - if ($this->testSuiteLevel == 0) { - $this->write(sprintf("1..%d\n", $this->testNumber)); - } - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - $this->testNumber++; - $this->testSuccessful = true; - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if ($this->testSuccessful === true) { - $this->write( - sprintf( - "ok %d - %s\n", - - $this->testNumber, - PHPUnit_Util_Test::describe($test) - ) - ); - } - } - - /** - * @param PHPUnit_Framework_Test $test - * @param string $prefix - * @param string $directive - */ - protected function writeNotOk(PHPUnit_Framework_Test $test, $prefix = '', $directive = '') - { - $this->write( - sprintf( - "not ok %d - %s%s%s\n", - - $this->testNumber, - $prefix != '' ? $prefix . ': ' : '', - PHPUnit_Util_Test::describe($test), - $directive != '' ? ' # ' . $directive : '' - ) - ); - - $this->testSuccessful = false; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -if (!defined('JSON_PRETTY_PRINT')) { - define('JSON_PRETTY_PRINT', 128); -} - -/** - * A TestListener that generates JSON messages. - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener -{ - /** - * @var string - */ - protected $currentTestSuiteName = ''; - - /** - * @var string - */ - protected $currentTestName = ''; - - /** - * @var boolean - * @access private - */ - protected $currentTestPass = true; - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeCase( - 'error', - $time, - PHPUnit_Util_Filter::getFilteredStacktrace($e, false), - $e->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - $this->writeCase( - 'fail', - $time, - PHPUnit_Util_Filter::getFilteredStacktrace($e, false), - $e->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeCase( - 'error', - $time, - PHPUnit_Util_Filter::getFilteredStacktrace($e, false), - 'Incomplete Test: ' . $e->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeCase( - 'error', - $time, - PHPUnit_Util_Filter::getFilteredStacktrace($e, false), - 'Risky Test: ' . $e->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeCase( - 'error', - $time, - PHPUnit_Util_Filter::getFilteredStacktrace($e, false), - 'Skipped Test: ' . $e->getMessage(), - $test - ); - - $this->currentTestPass = false; - } - - /** - * A testsuite started. - * - * @param PHPUnit_Framework_TestSuite $suite - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $this->currentTestSuiteName = $suite->getName(); - $this->currentTestName = ''; - - $this->write( - array( - 'event' => 'suiteStart', - 'suite' => $this->currentTestSuiteName, - 'tests' => count($suite) - ) - ); - } - - /** - * A testsuite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $this->currentTestSuiteName = ''; - $this->currentTestName = ''; - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - $this->currentTestName = PHPUnit_Util_Test::describe($test); - $this->currentTestPass = true; - - $this->write( - array( - 'event' => 'testStart', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName - ) - ); - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if ($this->currentTestPass) { - $this->writeCase('pass', $time, array(), '', $test); - } - } - - /** - * @param string $status - * @param float $time - * @param array $trace - * @param string $message - */ - protected function writeCase($status, $time, array $trace = array(), $message = '', $test = null) - { - $output = ''; - // take care of TestSuite producing error (e.g. by running into exception) as TestSuite doesn't have hasOutput - if ($test !== null && method_exists($test, 'hasOutput') && $test->hasOutput()) { - $output = $test->getActualOutput(); - } - $this->write( - array( - 'event' => 'test', - 'suite' => $this->currentTestSuiteName, - 'test' => $this->currentTestName, - 'status' => $status, - 'time' => $time, - 'trace' => $trace, - 'message' => PHPUnit_Util_String::convertToUtf8($message), - 'output' => $output, - ) - ); - } - - /** - * @param string $buffer - */ - public function write($buffer) - { - array_walk_recursive($buffer, function (&$input) { - if (is_string($input)) { - $input = PHPUnit_Util_String::convertToUtf8($input); - } - }); - - parent::write(json_encode($buffer, JSON_PRETTY_PRINT)); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * A TestListener that generates a logfile of the test execution in XML markup. - * - * The XML markup used is the same as the one that is used by the JUnit Ant task. - * - * @package PHPUnit - * @subpackage Util_Log - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.1.0 - */ -class PHPUnit_Util_Log_JUnit extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener -{ - /** - * @var DOMDocument - */ - protected $document; - - /** - * @var DOMElement - */ - protected $root; - - /** - * @var boolean - */ - protected $logIncompleteSkipped = false; - - /** - * @var boolean - */ - protected $writeDocument = true; - - /** - * @var DOMElement[] - */ - protected $testSuites = array(); - - /** - * @var integer[] - */ - protected $testSuiteTests = array(0); - - /** - * @var integer[] - */ - protected $testSuiteAssertions = array(0); - - /** - * @var integer[] - */ - protected $testSuiteErrors = array(0); - - /** - * @var integer[] - */ - protected $testSuiteFailures = array(0); - - /** - * @var integer[] - */ - protected $testSuiteTimes = array(0); - - /** - * @var integer - */ - protected $testSuiteLevel = 0; - - /** - * @var DOMElement - */ - protected $currentTestCase = null; - - /** - * @var boolean - */ - protected $attachCurrentTestCase = true; - - /** - * Constructor. - * - * @param mixed $out - * @param boolean $logIncompleteSkipped - */ - public function __construct($out = null, $logIncompleteSkipped = false) - { - $this->document = new DOMDocument('1.0', 'UTF-8'); - $this->document->formatOutput = true; - - $this->root = $this->document->createElement('testsuites'); - $this->document->appendChild($this->root); - - parent::__construct($out); - - $this->logIncompleteSkipped = $logIncompleteSkipped; - } - - /** - * Flush buffer and close output. - * - */ - public function flush() - { - if ($this->writeDocument === true) { - $this->write($this->getXML()); - } - - parent::flush(); - } - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($this->currentTestCase !== null) { - if ($test instanceof PHPUnit_Framework_SelfDescribing) { - $buffer = $test->toString() . "\n"; - } else { - $buffer = ''; - } - - $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) . - "\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e); - - $error = $this->document->createElement( - 'error', PHPUnit_Util_XML::prepareString($buffer) - ); - - $error->setAttribute('type', get_class($e)); - - $this->currentTestCase->appendChild($error); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - if ($this->currentTestCase !== null) { - if (!$test instanceof PHPUnit_Framework_Warning) { - if ($test instanceof PHPUnit_Framework_SelfDescribing) { - $buffer = $test->toString() . "\n"; - } else { - $buffer = ''; - } - - $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) . - "\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e); - - $failure = $this->document->createElement( - 'failure', PHPUnit_Util_XML::prepareString($buffer) - ); - - $failure->setAttribute('type', get_class($e)); - - $this->currentTestCase->appendChild($failure); - - $this->testSuiteFailures[$this->testSuiteLevel]++; - } - } - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { - $error = $this->document->createElement( - 'error', - PHPUnit_Util_XML::prepareString( - "Incomplete Test\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e) - ) - ); - - $error->setAttribute('type', get_class($e)); - - $this->currentTestCase->appendChild($error); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } else { - $this->attachCurrentTestCase = false; - } - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { - $error = $this->document->createElement( - 'error', - PHPUnit_Util_XML::prepareString( - "Risky Test\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e) - ) - ); - - $error->setAttribute('type', get_class($e)); - - $this->currentTestCase->appendChild($error); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } else { - $this->attachCurrentTestCase = false; - } - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($this->logIncompleteSkipped && $this->currentTestCase !== null) { - $error = $this->document->createElement( - 'error', - PHPUnit_Util_XML::prepareString( - "Skipped Test\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e) - ) - ); - - $error->setAttribute('type', get_class($e)); - - $this->currentTestCase->appendChild($error); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } else { - $this->attachCurrentTestCase = false; - } - } - - /** - * A testsuite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $testSuite = $this->document->createElement('testsuite'); - $testSuite->setAttribute('name', $suite->getName()); - - if (class_exists($suite->getName(), false)) { - try { - $class = new ReflectionClass($suite->getName()); - - $testSuite->setAttribute('file', $class->getFileName()); - } catch (ReflectionException $e) { - } - } - - if ($this->testSuiteLevel > 0) { - $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); - } else { - $this->root->appendChild($testSuite); - } - - $this->testSuiteLevel++; - $this->testSuites[$this->testSuiteLevel] = $testSuite; - $this->testSuiteTests[$this->testSuiteLevel] = 0; - $this->testSuiteAssertions[$this->testSuiteLevel] = 0; - $this->testSuiteErrors[$this->testSuiteLevel] = 0; - $this->testSuiteFailures[$this->testSuiteLevel] = 0; - $this->testSuiteTimes[$this->testSuiteLevel] = 0; - } - - /** - * A testsuite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'tests', $this->testSuiteTests[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'assertions', $this->testSuiteAssertions[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'failures', $this->testSuiteFailures[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'errors', $this->testSuiteErrors[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'time', sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) - ); - - if ($this->testSuiteLevel > 1) { - $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; - $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; - $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; - $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; - $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; - } - - $this->testSuiteLevel--; - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - if (!$test instanceof PHPUnit_Framework_Warning) { - $testCase = $this->document->createElement('testcase'); - $testCase->setAttribute('name', $test->getName()); - - if ($test instanceof PHPUnit_Framework_TestCase) { - $class = new ReflectionClass($test); - $methodName = $test->getName(); - - if ($class->hasMethod($methodName)) { - $method = $class->getMethod($test->getName()); - - $testCase->setAttribute('class', $class->getName()); - $testCase->setAttribute('file', $class->getFileName()); - $testCase->setAttribute('line', $method->getStartLine()); - } - } - - $this->currentTestCase = $testCase; - } - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if (!$test instanceof PHPUnit_Framework_Warning) { - if ($this->attachCurrentTestCase) { - if ($test instanceof PHPUnit_Framework_TestCase) { - $numAssertions = $test->getNumAssertions(); - $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; - - $this->currentTestCase->setAttribute( - 'assertions', $numAssertions - ); - } - - $this->currentTestCase->setAttribute( - 'time', sprintf('%F', $time) - ); - - $this->testSuites[$this->testSuiteLevel]->appendChild( - $this->currentTestCase - ); - - $this->testSuiteTests[$this->testSuiteLevel]++; - $this->testSuiteTimes[$this->testSuiteLevel] += $time; - - if (method_exists($test, 'hasOutput') && $test->hasOutput()) { - $systemOut = $this->document->createElement('system-out'); - $systemOut->appendChild( - $this->document->createTextNode($test->getActualOutput()) - ); - $this->currentTestCase->appendChild($systemOut); - } - } - } - - $this->attachCurrentTestCase = true; - $this->currentTestCase = null; - } - - /** - * Returns the XML as a string. - * - * @return string - * @since Method available since Release 2.2.0 - */ - public function getXML() - { - return $this->document->saveXML(); - } - - /** - * Enables or disables the writing of the document - * in flush(). - * - * This is a "hack" needed for the integration of - * PHPUnit with Phing. - * - * @return string - * @since Method available since Release 2.2.0 - */ - public function setWriteDocument($flag) - { - if (is_bool($flag)) { - $this->writeDocument = $flag; - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * Utility methods for PHP sub-processes. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -abstract class PHPUnit_Util_PHP -{ - /** - * @return PHPUnit_Util_PHP - * @since Method available since Release 3.5.12 - */ - public static function factory() - { - if (DIRECTORY_SEPARATOR == '\\') { - return new PHPUnit_Util_PHP_Windows; - } - - return new PHPUnit_Util_PHP_Default; - } - - /** - * Runs a single test in a separate PHP process. - * - * @param string $job - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_TestResult $result - * @throws PHPUnit_Framework_Exception - */ - public function runTestJob($job, PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result) - { - $result->startTest($test); - - $_result = $this->runJob($job); - - $this->processChildResult( - $test, $result, $_result['stdout'], $_result['stderr'] - ); - } - - /** - * Runs a single job (PHP code) using a separate PHP process. - * - * @param string $job - * @param array $settings - * @return array - * @throws PHPUnit_Framework_Exception - */ - abstract public function runJob($job, array $settings = array()); - - /** - * @param array $settings - * @return string - * @since Method available since Release 4.0.0 - */ - protected function settingsToParameters(array $settings) - { - $buffer = ''; - - foreach ($settings as $setting) { - $buffer .= ' -d ' . $setting; - } - - return $buffer; - } - - /** - * Processes the TestResult object from an isolated process. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_TestResult $result - * @param string $stdout - * @param string $stderr - * @since Method available since Release 3.5.0 - */ - private function processChildResult(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result, $stdout, $stderr) - { - $time = 0; - - if (!empty($stderr)) { - $result->addError( - $test, - new PHPUnit_Framework_Exception(trim($stderr)), $time - ); - } else { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); - }); - try { - if (strpos($stdout, "#!/usr/bin/env php\n") === 0) { - $stdout = substr($stdout, 19); - } - - $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout)); - restore_error_handler(); - } catch (ErrorException $e) { - restore_error_handler(); - $childResult = false; - - $result->addError( - $test, new PHPUnit_Framework_Exception(trim($stdout), 0, $e), $time - ); - } - - if ($childResult !== false) { - if (!empty($childResult['output'])) { - print $childResult['output']; - } - - $test->setResult($childResult['testResult']); - $test->addToAssertionCount($childResult['numAssertions']); - - $childResult = $childResult['result']; - - if ($result->getCollectCodeCoverageInformation()) { - $result->getCodeCoverage()->merge( - $childResult->getCodeCoverage() - ); - } - - $time = $childResult->time(); - $notImplemented = $childResult->notImplemented(); - $risky = $childResult->risky(); - $skipped = $childResult->skipped(); - $errors = $childResult->errors(); - $failures = $childResult->failures(); - - if (!empty($notImplemented)) { - $result->addError( - $test, $this->getException($notImplemented[0]), $time - ); - } elseif (!empty($risky)) { - $result->addError( - $test, $this->getException($risky[0]), $time - ); - } elseif (!empty($skipped)) { - $result->addError( - $test, $this->getException($skipped[0]), $time - ); - } elseif (!empty($errors)) { - $result->addError( - $test, $this->getException($errors[0]), $time - ); - } elseif (!empty($failures)) { - $result->addFailure( - $test, $this->getException($failures[0]), $time - ); - } - } - } - - $result->endTest($test, $time); - } - - /** - * Gets the thrown exception from a PHPUnit_Framework_TestFailure. - * - * @param PHPUnit_Framework_TestFailure $error - * @return Exception - * @since Method available since Release 3.6.0 - * @see https://github.com/sebastianbergmann/phpunit/issues/74 - */ - private function getException(PHPUnit_Framework_TestFailure $error) - { - $exception = $error->thrownException(); - - if ($exception instanceof __PHP_Incomplete_Class) { - $exceptionArray = array(); - foreach ((array) $exception as $key => $value) { - $key = substr($key, strrpos($key, "\0") + 1); - $exceptionArray[$key] = $value; - } - - $exception = new PHPUnit_Framework_SyntheticError( - sprintf( - '%s: %s', - $exceptionArray['_PHP_Incomplete_Class_Name'], - $exceptionArray['message'] - ), - $exceptionArray['code'], - $exceptionArray['file'], - $exceptionArray['line'], - $exceptionArray['trace'] - ); - } - - return $exception; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.2.0 - */ - -/** - * XML helpers. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.2.0 - */ -class PHPUnit_Util_XML -{ - /** - * Escapes a string for the use in XML documents - * Any Unicode character is allowed, excluding the surrogate blocks, FFFE, - * and FFFF (not even as character reference). - * See http://www.w3.org/TR/xml/#charsets - * - * @param string $string - * @return string - * @author Kore Nordmann - * @since Method available since Release 3.4.6 - */ - public static function prepareString($string) - { - return preg_replace( - '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/', - '', - htmlspecialchars( - PHPUnit_Util_String::convertToUtf8($string), ENT_QUOTES, 'UTF-8' - ) - ); - } - - /** - * Loads an XML (or HTML) file into a DOMDocument object. - * - * @param string $filename - * @param boolean $isHtml - * @param boolean $xinclude - * @return DOMDocument - * @since Method available since Release 3.3.0 - */ - public static function loadFile($filename, $isHtml = false, $xinclude = false) - { - $reporting = error_reporting(0); - $contents = file_get_contents($filename); - error_reporting($reporting); - - if ($contents === false) { - throw new PHPUnit_Framework_Exception( - sprintf( - 'Could not read "%s".', - $filename - ) - ); - } - - return self::load($contents, $isHtml, $filename, $xinclude); - } - - /** - * Load an $actual document into a DOMDocument. This is called - * from the selector assertions. - * - * If $actual is already a DOMDocument, it is returned with - * no changes. Otherwise, $actual is loaded into a new DOMDocument - * as either HTML or XML, depending on the value of $isHtml. If $isHtml is - * false and $xinclude is true, xinclude is performed on the loaded - * DOMDocument. - * - * Note: prior to PHPUnit 3.3.0, this method loaded a file and - * not a string as it currently does. To load a file into a - * DOMDocument, use loadFile() instead. - * - * @param string|DOMDocument $actual - * @param boolean $isHtml - * @param string $filename - * @param boolean $xinclude - * @return DOMDocument - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - * @author Tobias Schlitt - */ - public static function load($actual, $isHtml = false, $filename = '', $xinclude = false) - { - if ($actual instanceof DOMDocument) { - return $actual; - } - - $document = new DOMDocument; - - $internal = libxml_use_internal_errors(true); - $message = ''; - $reporting = error_reporting(0); - - if ($isHtml) { - $loaded = $document->loadHTML($actual); - } else { - $loaded = $document->loadXML($actual); - } - - if ('' !== $filename) { - // Necessary for xinclude - $document->documentURI = $filename; - } - - if (!$isHtml && $xinclude) { - $document->xinclude(); - } - - foreach (libxml_get_errors() as $error) { - $message .= $error->message; - } - - libxml_use_internal_errors($internal); - error_reporting($reporting); - - if ($loaded === false) { - if ($filename != '') { - throw new PHPUnit_Framework_Exception( - sprintf( - 'Could not load "%s".%s', - - $filename, - $message != '' ? "\n" . $message : '' - ) - ); - } else { - throw new PHPUnit_Framework_Exception($message); - } - } - - return $document; - } - - /** - * - * - * @param DOMNode $node - * @return string - * @since Method available since Release 3.4.0 - */ - public static function nodeToText(DOMNode $node) - { - if ($node->childNodes->length == 1) { - return $node->nodeValue; - } - - $result = ''; - - foreach ($node->childNodes as $childNode) { - $result .= $node->ownerDocument->saveXML($childNode); - } - - return $result; - } - - /** - * - * - * @param DOMNode $node - * @since Method available since Release 3.3.0 - * @author Mattis Stordalen Flister - */ - public static function removeCharacterDataNodes(DOMNode $node) - { - if ($node->hasChildNodes()) { - for ($i = $node->childNodes->length - 1; $i >= 0; $i--) { - if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) { - $node->removeChild($child); - } - } - } - } - - /** - * "Convert" a DOMElement object into a PHP variable. - * - * @param DOMElement $element - * @return mixed - * @since Method available since Release 3.4.0 - */ - public static function xmlToVariable(DOMElement $element) - { - $variable = null; - - switch ($element->tagName) { - case 'array': { - $variable = array(); - - foreach ($element->getElementsByTagName('element') as $element) { - $value = self::xmlToVariable($element->childNodes->item(1)); - - if ($element->hasAttribute('key')) { - $variable[(string) $element->getAttribute('key')] = $value; - } else { - $variable[] = $value; - } - } - } - break; - - case 'object': { - $className = $element->getAttribute('class'); - - if ($element->hasChildNodes()) { - $arguments = $element->childNodes->item(1)->childNodes; - $constructorArgs = array(); - - foreach ($arguments as $argument) { - if ($argument instanceof DOMElement) { - $constructorArgs[] = self::xmlToVariable($argument); - } - } - - $class = new ReflectionClass($className); - $variable = $class->newInstanceArgs($constructorArgs); - } else { - $variable = new $className; - } - } - break; - - case 'boolean': { - $variable = $element->nodeValue == 'true' ? true : false; - } - break; - - case 'integer': - case 'double': - case 'string': { - $variable = $element->nodeValue; - - settype($variable, $element->tagName); - } - break; - } - - return $variable; - } - - /** - * Validate list of keys in the associative array. - * - * @param array $hash - * @param array $validKeys - * @return array - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function assertValidKeys(array $hash, array $validKeys) - { - $valids = array(); - - // Normalize validation keys so that we can use both indexed and - // associative arrays. - foreach ($validKeys as $key => $val) { - is_int($key) ? $valids[$val] = null : $valids[$key] = $val; - } - - $validKeys = array_keys($valids); - - // Check for invalid keys. - foreach ($hash as $key => $value) { - if (!in_array($key, $validKeys)) { - $unknown[] = $key; - } - } - - if (!empty($unknown)) { - throw new PHPUnit_Framework_Exception( - 'Unknown key(s): ' . implode(', ', $unknown) - ); - } - - // Add default values for any valid keys that are empty. - foreach ($valids as $key => $value) { - if (!isset($hash[$key])) { - $hash[$key] = $value; - } - } - - return $hash; - } - - /** - * Parse a CSS selector into an associative array suitable for - * use with findNodes(). - * - * @param string $selector - * @param mixed $content - * @return array - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - public static function convertSelectToTag($selector, $content = true) - { - $selector = trim(preg_replace("/\s+/", " ", $selector)); - - // substitute spaces within attribute value - while (preg_match('/\[[^\]]+"[^"]+\s[^"]+"\]/', $selector)) { - $selector = preg_replace( - '/(\[[^\]]+"[^"]+)\s([^"]+"\])/', "$1__SPACE__$2", $selector - ); - } - - if (strstr($selector, ' ')) { - $elements = explode(' ', $selector); - } else { - $elements = array($selector); - } - - $previousTag = array(); - - foreach (array_reverse($elements) as $element) { - $element = str_replace('__SPACE__', ' ', $element); - - // child selector - if ($element == '>') { - $previousTag = array('child' => $previousTag['descendant']); - continue; - } - - // adjacent-sibling selector - if ($element == '+') { - $previousTag = array('adjacent-sibling' => $previousTag['descendant']); - continue; - } - - $tag = array(); - - // match element tag - preg_match("/^([^\.#\[]*)/", $element, $eltMatches); - - if (!empty($eltMatches[1])) { - $tag['tag'] = $eltMatches[1]; - } - - // match attributes (\[[^\]]*\]*), ids (#[^\.#\[]*), - // and classes (\.[^\.#\[]*)) - preg_match_all( - "/(\[[^\]]*\]*|#[^\.#\[]*|\.[^\.#\[]*)/", $element, $matches - ); - - if (!empty($matches[1])) { - $classes = array(); - $attrs = array(); - - foreach ($matches[1] as $match) { - // id matched - if (substr($match, 0, 1) == '#') { - $tag['id'] = substr($match, 1); - } - - // class matched - else if (substr($match, 0, 1) == '.') { - $classes[] = substr($match, 1); - } - - // attribute matched - else if (substr($match, 0, 1) == '[' && - substr($match, -1, 1) == ']') { - $attribute = substr($match, 1, strlen($match) - 2); - $attribute = str_replace('"', '', $attribute); - - // match single word - if (strstr($attribute, '~=')) { - list($key, $value) = explode('~=', $attribute); - $value = "regexp:/.*\b$value\b.*/"; - } - - // match substring - else if (strstr($attribute, '*=')) { - list($key, $value) = explode('*=', $attribute); - $value = "regexp:/.*$value.*/"; - } - - // exact match - else { - list($key, $value) = explode('=', $attribute); - } - - $attrs[$key] = $value; - } - } - - if ($classes) { - $tag['class'] = join(' ', $classes); - } - - if ($attrs) { - $tag['attributes'] = $attrs; - } - } - - // tag content - if (is_string($content)) { - $tag['content'] = $content; - } - - // determine previous child/descendants - if (!empty($previousTag['descendant'])) { - $tag['descendant'] = $previousTag['descendant']; - } elseif (!empty($previousTag['child'])) { - $tag['child'] = $previousTag['child']; - } elseif (!empty($previousTag['adjacent-sibling'])) { - $tag['adjacent-sibling'] = $previousTag['adjacent-sibling']; - unset($tag['content']); - } - - $previousTag = array('descendant' => $tag); - } - - return $tag; - } - - /** - * Parse an $actual document and return an array of DOMNodes - * matching the CSS $selector. If an error occurs, it will - * return false. - * - * To only return nodes containing a certain content, give - * the $content to match as a string. Otherwise, setting - * $content to true will return all nodes matching $selector. - * - * The $actual document may be a DOMDocument or a string - * containing XML or HTML, identified by $isHtml. - * - * @param array $selector - * @param string $content - * @param mixed $actual - * @param boolean $isHtml - * @return boolean|array - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - * @author Tobias Schlitt - */ - public static function cssSelect($selector, $content, $actual, $isHtml = true) - { - $matcher = self::convertSelectToTag($selector, $content); - $dom = self::load($actual, $isHtml); - $tags = self::findNodes($dom, $matcher, $isHtml); - - return $tags; - } - - /** - * Parse out the options from the tag using DOM object tree. - * - * @param DOMDocument $dom - * @param array $options - * @param boolean $isHtml - * @return array - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - * @author Tobias Schlitt - */ - public static function findNodes(DOMDocument $dom, array $options, $isHtml = true) - { - $valid = array( - 'id', 'class', 'tag', 'content', 'attributes', 'parent', - 'child', 'ancestor', 'descendant', 'children', 'adjacent-sibling' - ); - - $filtered = array(); - $options = self::assertValidKeys($options, $valid); - - // find the element by id - if ($options['id']) { - $options['attributes']['id'] = $options['id']; - } - - if ($options['class']) { - $options['attributes']['class'] = $options['class']; - } - - // find the element by a tag type - if ($options['tag']) { - if ($isHtml) { - $elements = self::getElementsByCaseInsensitiveTagName( - $dom, $options['tag'] - ); - } else { - $elements = $dom->getElementsByTagName($options['tag']); - } - - foreach ($elements as $element) { - $nodes[] = $element; - } - - if (empty($nodes)) { - return false; - } - } - - // no tag selected, get them all - else { - $tags = array( - 'a', 'abbr', 'acronym', 'address', 'area', 'b', 'base', 'bdo', - 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'cite', - 'code', 'col', 'colgroup', 'dd', 'del', 'div', 'dfn', 'dl', - 'dt', 'em', 'fieldset', 'form', 'frame', 'frameset', 'h1', 'h2', - 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe', - 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link', - 'map', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup', - 'option', 'p', 'param', 'pre', 'q', 'samp', 'script', 'select', - 'small', 'span', 'strong', 'style', 'sub', 'sup', 'table', - 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', - 'tr', 'tt', 'ul', 'var', - // HTML5 - 'article', 'aside', 'audio', 'bdi', 'canvas', 'command', - 'datalist', 'details', 'dialog', 'embed', 'figure', 'figcaption', - 'footer', 'header', 'hgroup', 'keygen', 'mark', 'meter', 'nav', - 'output', 'progress', 'ruby', 'rt', 'rp', 'track', 'section', - 'source', 'summary', 'time', 'video', 'wbr' - ); - - foreach ($tags as $tag) { - if ($isHtml) { - $elements = self::getElementsByCaseInsensitiveTagName( - $dom, $tag - ); - } else { - $elements = $dom->getElementsByTagName($tag); - } - - foreach ($elements as $element) { - $nodes[] = $element; - } - } - - if (empty($nodes)) { - return false; - } - } - - // filter by attributes - if ($options['attributes']) { - foreach ($nodes as $node) { - $invalid = false; - - foreach ($options['attributes'] as $name => $value) { - // match by regexp if like "regexp:/foo/i" - if (preg_match('/^regexp\s*:\s*(.*)/i', $value, $matches)) { - if (!preg_match($matches[1], $node->getAttribute($name))) { - $invalid = true; - } - } - - // class can match only a part - else if ($name == 'class') { - // split to individual classes - $findClasses = explode( - ' ', preg_replace("/\s+/", " ", $value) - ); - - $allClasses = explode( - ' ', - preg_replace("/\s+/", " ", $node->getAttribute($name)) - ); - - // make sure each class given is in the actual node - foreach ($findClasses as $findClass) { - if (!in_array($findClass, $allClasses)) { - $invalid = true; - } - } - } - - // match by exact string - else { - if ($node->getAttribute($name) != $value) { - $invalid = true; - } - } - } - - // if every attribute given matched - if (!$invalid) { - $filtered[] = $node; - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by content - if ($options['content'] !== null) { - foreach ($nodes as $node) { - $invalid = false; - - // match by regexp if like "regexp:/foo/i" - if (preg_match('/^regexp\s*:\s*(.*)/i', $options['content'], $matches)) { - if (!preg_match($matches[1], self::getNodeText($node))) { - $invalid = true; - } - } - - // match empty string - else if ($options['content'] === '') { - if (self::getNodeText($node) !== '') { - $invalid = true; - } - } - - // match by exact string - else if (strstr(self::getNodeText($node), $options['content']) === false) { - $invalid = true; - } - - if (!$invalid) { - $filtered[] = $node; - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by parent node - if ($options['parent']) { - $parentNodes = self::findNodes($dom, $options['parent'], $isHtml); - $parentNode = isset($parentNodes[0]) ? $parentNodes[0] : null; - - foreach ($nodes as $node) { - if ($parentNode !== $node->parentNode) { - continue; - } - - $filtered[] = $node; - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by child node - if ($options['child']) { - $childNodes = self::findNodes($dom, $options['child'], $isHtml); - $childNodes = !empty($childNodes) ? $childNodes : array(); - - foreach ($nodes as $node) { - foreach ($node->childNodes as $child) { - foreach ($childNodes as $childNode) { - if ($childNode === $child) { - $filtered[] = $node; - } - } - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by adjacent-sibling - if ($options['adjacent-sibling']) { - $adjacentSiblingNodes = self::findNodes($dom, $options['adjacent-sibling'], $isHtml); - $adjacentSiblingNodes = !empty($adjacentSiblingNodes) ? $adjacentSiblingNodes : array(); - - foreach ($nodes as $node) { - $sibling = $node; - - while ($sibling = $sibling->nextSibling) { - if ($sibling->nodeType !== XML_ELEMENT_NODE) { - continue; - } - - foreach ($adjacentSiblingNodes as $adjacentSiblingNode) { - if ($sibling === $adjacentSiblingNode) { - $filtered[] = $node; - break; - } - } - - break; - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by ancestor - if ($options['ancestor']) { - $ancestorNodes = self::findNodes($dom, $options['ancestor'], $isHtml); - $ancestorNode = isset($ancestorNodes[0]) ? $ancestorNodes[0] : null; - - foreach ($nodes as $node) { - $parent = $node->parentNode; - - while ($parent && $parent->nodeType != XML_HTML_DOCUMENT_NODE) { - if ($parent === $ancestorNode) { - $filtered[] = $node; - } - - $parent = $parent->parentNode; - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by descendant - if ($options['descendant']) { - $descendantNodes = self::findNodes($dom, $options['descendant'], $isHtml); - $descendantNodes = !empty($descendantNodes) ? $descendantNodes : array(); - - foreach ($nodes as $node) { - foreach (self::getDescendants($node) as $descendant) { - foreach ($descendantNodes as $descendantNode) { - if ($descendantNode === $descendant) { - $filtered[] = $node; - } - } - } - } - - $nodes = $filtered; - $filtered = array(); - - if (empty($nodes)) { - return false; - } - } - - // filter by children - if ($options['children']) { - $validChild = array('count', 'greater_than', 'less_than', 'only'); - $childOptions = self::assertValidKeys( - $options['children'], $validChild - ); - - foreach ($nodes as $node) { - $childNodes = $node->childNodes; - - foreach ($childNodes as $childNode) { - if ($childNode->nodeType !== XML_CDATA_SECTION_NODE && - $childNode->nodeType !== XML_TEXT_NODE) { - $children[] = $childNode; - } - } - - // we must have children to pass this filter - if (!empty($children)) { - // exact count of children - if ($childOptions['count'] !== null) { - if (count($children) !== $childOptions['count']) { - break; - } - } - - // range count of children - else if ($childOptions['less_than'] !== null && - $childOptions['greater_than'] !== null) { - if (count($children) >= $childOptions['less_than'] || - count($children) <= $childOptions['greater_than']) { - break; - } - } - - // less than a given count - else if ($childOptions['less_than'] !== null) { - if (count($children) >= $childOptions['less_than']) { - break; - } - } - - // more than a given count - else if ($childOptions['greater_than'] !== null) { - if (count($children) <= $childOptions['greater_than']) { - break; - } - } - - // match each child against a specific tag - if ($childOptions['only']) { - $onlyNodes = self::findNodes( - $dom, $childOptions['only'], $isHtml - ); - - // try to match each child to one of the 'only' nodes - foreach ($children as $child) { - $matched = false; - - foreach ($onlyNodes as $onlyNode) { - if ($onlyNode === $child) { - $matched = true; - } - } - - if (!$matched) { - break 2; - } - } - } - - $filtered[] = $node; - } - } - - $nodes = $filtered; - - if (empty($nodes)) { - return; - } - } - - // return the first node that matches all criteria - return !empty($nodes) ? $nodes : array(); - } - - /** - * Recursively get flat array of all descendants of this node. - * - * @param DOMNode $node - * @return array - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - protected static function getDescendants(DOMNode $node) - { - $allChildren = array(); - $childNodes = $node->childNodes ? $node->childNodes : array(); - - foreach ($childNodes as $child) { - if ($child->nodeType === XML_CDATA_SECTION_NODE || - $child->nodeType === XML_TEXT_NODE) { - continue; - } - - $children = self::getDescendants($child); - $allChildren = array_merge($allChildren, $children, array($child)); - } - - return isset($allChildren) ? $allChildren : array(); - } - - /** - * Gets elements by case insensitive tagname. - * - * @param DOMDocument $dom - * @param string $tag - * @return DOMNodeList - * @since Method available since Release 3.4.0 - */ - protected static function getElementsByCaseInsensitiveTagName(DOMDocument $dom, $tag) - { - $elements = $dom->getElementsByTagName(strtolower($tag)); - - if ($elements->length == 0) { - $elements = $dom->getElementsByTagName(strtoupper($tag)); - } - - return $elements; - } - - /** - * Get the text value of this node's child text node. - * - * @param DOMNode $node - * @return string - * @since Method available since Release 3.3.0 - * @author Mike Naberezny - * @author Derek DeVries - */ - protected static function getNodeText(DOMNode $node) - { - if (!$node->childNodes instanceof DOMNodeList) { - return ''; - } - - $result = ''; - - foreach ($node->childNodes as $childNode) { - if ($childNode->nodeType === XML_TEXT_NODE || - $childNode->nodeType === XML_CDATA_SECTION_NODE) { - $result .= trim($childNode->data) . ' '; - } else { - $result .= self::getNodeText($childNode); - } - } - - return str_replace(' ', ' ', $result); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Command-line options parsing class. - * - * @package PHPUnit - * @subpackage Util - * @author Andrei Zmievski - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Getopt -{ - public static function getopt(array $args, $short_options, $long_options = null) - { - if (empty($args)) { - return array(array(), array()); - } - - $opts = array(); - $non_opts = array(); - - if ($long_options) { - sort($long_options); - } - - if (isset($args[0][0]) && $args[0][0] != '-') { - array_shift($args); - } - - reset($args); - array_map('trim', $args); - - while (list($i, $arg) = each($args)) { - if ($arg == '') { - continue; - } - - if ($arg == '--') { - $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); - break; - } - - if ($arg[0] != '-' || - (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) { - $non_opts = array_merge($non_opts, array_slice($args, $i)); - break; - } elseif (strlen($arg) > 1 && $arg[1] == '-') { - self::parseLongOption( - substr($arg, 2), $long_options, $opts, $args - ); - } else { - self::parseShortOption( - substr($arg, 1), $short_options, $opts, $args - ); - } - } - - return array($opts, $non_opts); - } - - protected static function parseShortOption($arg, $short_options, &$opts, &$args) - { - $argLen = strlen($arg); - - for ($i = 0; $i < $argLen; $i++) { - $opt = $arg[$i]; - $opt_arg = null; - - if (($spec = strstr($short_options, $opt)) === false || - $arg[$i] == ':') { - throw new PHPUnit_Framework_Exception( - "unrecognized option -- $opt" - ); - } - - if (strlen($spec) > 1 && $spec[1] == ':') { - if (strlen($spec) > 2 && $spec[2] == ':') { - if ($i + 1 < $argLen) { - $opts[] = array($opt, substr($arg, $i + 1)); - break; - } - } else { - if ($i + 1 < $argLen) { - $opts[] = array($opt, substr($arg, $i + 1)); - break; - } elseif (list(, $opt_arg) = each($args)) { - } else { - throw new PHPUnit_Framework_Exception( - "option requires an argument -- $opt" - ); - } - } - } - - $opts[] = array($opt, $opt_arg); - } - } - - protected static function parseLongOption($arg, $long_options, &$opts, &$args) - { - $count = count($long_options); - $list = explode('=', $arg); - $opt = $list[0]; - $opt_arg = null; - - if (count($list) > 1) { - $opt_arg = $list[1]; - } - - $opt_len = strlen($opt); - - for ($i = 0; $i < $count; $i++) { - $long_opt = $long_options[$i]; - $opt_start = substr($long_opt, 0, $opt_len); - - if ($opt_start != $opt) { - continue; - } - - $opt_rest = substr($long_opt, $opt_len); - - if ($opt_rest != '' && $opt[0] != '=' && $i + 1 < $count && - $opt == substr($long_options[$i+1], 0, $opt_len)) { - throw new PHPUnit_Framework_Exception( - "option --$opt is ambiguous" - ); - } - - if (substr($long_opt, -1) == '=') { - if (substr($long_opt, -2) != '==') { - if (!strlen($opt_arg) && - !(list(, $opt_arg) = each($args))) { - throw new PHPUnit_Framework_Exception( - "option --$opt requires an argument" - ); - } - } - } elseif ($opt_arg) { - throw new PHPUnit_Framework_Exception( - "option --$opt doesn't allow an argument" - ); - } - - $opts[] = array('--' . $opt, $opt_arg); - - return; - } - - throw new PHPUnit_Framework_Exception("unrecognized option --$opt"); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.12 - */ - -/** - * Windows utility for PHP sub-processes. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.12 - */ -class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default -{ - /** - * @var string - */ - private $tempFile; - - /** - * @param resource $pipe - * @param string $job - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.5.12 - */ - protected function process($pipe, $job) - { - if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) || - file_put_contents($this->tempFile, $job) === false) { - throw new PHPUnit_Framework_Exception( - 'Unable to write temporary file' - ); - } - - fwrite( - $pipe, - "tempFile, true) . "; ?>" - ); - } - - /** - * @since Method available since Release 3.5.12 - */ - protected function cleanup() - { - unlink($this->tempFile); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.12 - */ - -use SebastianBergmann\Environment\Runtime; - -/** - * Default utility for PHP sub-processes. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.12 - */ -class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP -{ - /** - * Runs a single job (PHP code) using a separate PHP process. - * - * @param string $job - * @param array $settings - * @return array - * @throws PHPUnit_Framework_Exception - */ - public function runJob($job, array $settings = array()) - { - $runtime = new Runtime; - - $process = proc_open( - $runtime->getBinary() . $this->settingsToParameters($settings), - array( - 0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'w') - ), - $pipes - ); - - if (!is_resource($process)) { - throw new PHPUnit_Framework_Exception( - 'Unable to spawn worker process' - ); - } - - $this->process($pipes[0], $job); - fclose($pipes[0]); - - $stdout = stream_get_contents($pipes[1]); - fclose($pipes[1]); - - $stderr = stream_get_contents($pipes[2]); - fclose($pipes[2]); - - proc_close($process); - $this->cleanup(); - - return array('stdout' => $stdout, 'stderr' => $stderr); - } - - /** - * @param resource $pipe - * @param string $job - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.5.12 - */ - protected function process($pipe, $job) - { - fwrite($pipe, $job); - } - - /** - * @since Method available since Release 3.5.12 - */ - protected function cleanup() - { - } -} -setCodeCoverage(new PHP_CodeCoverage); - } - - $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); - $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); - $result->beStrictAboutTestSize({isStrictAboutTestSize}); - - $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}'); - $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(TRUE); - - ob_end_clean(); - ob_start(); - $test->run($result); - $output = ob_get_clean(); - - print serialize( - array( - 'testResult' => $test->getResult(), - 'numAssertions' => $test->getNumAssertions(), - 'result' => $result, - 'output' => $output - ) - ); - - ob_start(); -} - -{constants} -{included_files} -{globals} - -if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; - unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); -} - -__phpunit_run_isolated_test(); -ob_end_clean(); -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Filesystem helpers. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Filesystem -{ - /** - * @var array - */ - protected static $buffer = array(); - - /** - * Maps class names to source file names: - * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php - * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php - * - * @param string $className - * @return string - * @since Method available since Release 3.4.0 - */ - public static function classNameToFilename($className) - { - return str_replace( - array('_', '\\'), - DIRECTORY_SEPARATOR, - $className - ) . '.php'; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * Utility class for textual type (and value) representation. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Type -{ - public static function isType($type) - { - return in_array( - $type, - array( - 'numeric', - 'integer', - 'int', - 'float', - 'string', - 'boolean', - 'bool', - 'null', - 'array', - 'object', - 'resource', - 'scalar' - ) - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Ralph Schindler - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.7 - */ - -/** - * Class to hold the information about a deprecated feature that was used - * - * @package PHPUnit - * @subpackage Framework - * @author Ralph Schindler - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 3.5.7 - */ -class PHPUnit_Util_DeprecatedFeature -{ - /** - * @var array - */ - protected $traceInfo = array(); - - /** - * @var string - */ - protected $message = null; - - /** - * @param string $message - * @param array $traceInfo - */ - public function __construct($message, array $traceInfo = array()) - { - $this->message = $message; - $this->traceInfo = $traceInfo; - } - - /** - * @return string - * @since Method available since Release 4.0.0 - */ - public function getMessage() - { - return $this->message; - } - - /** - * @return string - * @since Method available since Release 4.0.0 - */ - public function getSource() - { - $source = ''; - - if (isset($this->traceInfo['file'])) { - $source .= $this->traceInfo['file']; - - if (isset($this->traceInfo['line'])) { - $source .= ':' . $this->traceInfo['line']; - } - } - - return $source; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Utility class for code filtering. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Util_Filter -{ - /** - * Filters stack frames from PHPUnit classes. - * - * @param Exception $e - * @param boolean $asString - * @return string - */ - public static function getFilteredStacktrace(Exception $e, $asString = true) - { - $prefix = false; - $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); - - if (defined('__PHPUNIT_PHAR_ROOT__')) { - $prefix = __PHPUNIT_PHAR_ROOT__; - } - - if ($asString === true) { - $filteredStacktrace = ''; - } else { - $filteredStacktrace = array(); - } - - if ($e instanceof PHPUnit_Framework_SyntheticError) { - $eTrace = $e->getSyntheticTrace(); - $eFile = $e->getSyntheticFile(); - $eLine = $e->getSyntheticLine(); - } else { - if ($e->getPrevious()) { - $eTrace = $e->getPrevious()->getTrace(); - } else { - $eTrace = $e->getTrace(); - } - $eFile = $e->getFile(); - $eLine = $e->getLine(); - } - - if (!self::frameExists($eTrace, $eFile, $eLine)) { - array_unshift( - $eTrace, array('file' => $eFile, 'line' => $eLine) - ); - } - - $blacklist = new PHPUnit_Util_Blacklist; - - foreach ($eTrace as $frame) { - if (isset($frame['file']) && is_file($frame['file']) && - !$blacklist->isBlacklisted($frame['file']) && - ($prefix === false || strpos($frame['file'], $prefix) !== 0) && - $frame['file'] !== $script) { - if ($asString === true) { - $filteredStacktrace .= sprintf( - "%s:%s\n", - - $frame['file'], - isset($frame['line']) ? $frame['line'] : '?' - ); - } else { - $filteredStacktrace[] = $frame; - } - } - } - - return $filteredStacktrace; - } - - /** - * @param array $trace - * @param string $file - * @param int $line - * @return boolean - * @since Method available since Release 3.3.2 - */ - private static function frameExists(array $trace, $file, $line) - { - foreach ($trace as $frame) { - if (isset($frame['file']) && $frame['file'] == $file && - isset($frame['line']) && $frame['line'] == $line) { - return true; - } - } - - return false; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Ralph Schindler - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.5.7 - */ - -/** - * Test Listener that tracks the usage of deprecated features. - * - * @package PHPUnit - * @subpackage Framework - * @author Ralph Schindler - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.5.7 - */ -class PHPUnit_Util_DeprecatedFeature_Logger implements PHPUnit_Framework_TestListener -{ - /** - * @var PHPUnit_Framework_TestCase - */ - protected static $currentTest = null; - - /** - * This is the publicly accessible API for notifying the system that a - * deprecated feature has been used. - * - * If it is run via a TestRunner and the test extends - * PHPUnit_Framework_TestCase, then this will inject the result into the - * test runner for display, if not, it will throw the notice to STDERR. - * - * @param string $message - * @param int|bool $backtraceDepth - */ - public static function log($message, $backtraceDepth = 2) - { - if ($backtraceDepth !== false) { - $trace = debug_backtrace(false); - - if (is_int($backtraceDepth)) { - $traceItem = $trace[$backtraceDepth]; - } - - if (!isset($traceItem['file'])) { - $reflectionClass = new ReflectionClass($traceItem['class']); - $traceItem['file'] = $reflectionClass->getFileName(); - } - - if (!isset($traceItem['line']) && - isset($traceItem['class']) && - isset($traceItem['function'])) { - if (!isset($reflectionClass)) { - $reflectionClass = new ReflectionClass($traceItem['class']); - } - - $method = $reflectionClass->getMethod($traceItem['function']); - $traceItem['line'] = $method->getStartLine() . '-' . $method->getEndLine(); - } - } - - $deprecatedFeature = new PHPUnit_Util_DeprecatedFeature( - $message, $traceItem - ); - - if (self::$currentTest instanceof PHPUnit_Framework_TestCase) { - $result = self::$currentTest->getTestResultObject(); - $result->addDeprecatedFeature($deprecatedFeature); - } else { - file_put_contents('php://stderr', $deprecatedFeature); - } - } - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * A test suite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test suite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - self::$currentTest = $test; - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - self::$currentTest = null; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.6.0 - */ - -/** - * String helpers. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.6.0 - */ -class PHPUnit_Util_String -{ - /** - * Converts a string to UTF-8 encoding. - * - * @param string $string - * @return string - */ - public static function convertToUtf8($string) - { - if (!self::isUtf8($string)) { - if (function_exists('mb_convert_encoding')) { - $string = mb_convert_encoding($string, 'UTF-8'); - } else { - $string = utf8_encode($string); - } - } - - return $string; - } - - /** - * Checks a string for UTF-8 encoding. - * - * @param string $string - * @return boolean - */ - protected static function isUtf8($string) - { - $length = strlen($string); - - for ($i = 0; $i < $length; $i++) { - if (ord($string[$i]) < 0x80) { - $n = 0; - } elseif ((ord($string[$i]) & 0xE0) == 0xC0) { - $n = 1; - } elseif ((ord($string[$i]) & 0xF0) == 0xE0) { - $n = 2; - } elseif ((ord($string[$i]) & 0xF0) == 0xF0) { - $n = 3; - } else { - return false; - } - - for ($j = 0; $j < $n; $j++) { - if ((++$i == $length) || ((ord($string[$i]) & 0xC0) != 0x80)) { - return false; - } - } - } - - return true; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.0 - */ - -/** - * Iterator for test suites. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.0 - */ -class PHPUnit_Util_TestSuiteIterator implements RecursiveIterator -{ - /** - * @var integer - */ - protected $position; - - /** - * @var PHPUnit_Framework_Test[] - */ - protected $tests; - - /** - * Constructor. - * - * @param PHPUnit_Framework_TestSuite $suite - */ - public function __construct(PHPUnit_Framework_TestSuite $testSuite) - { - $this->tests = $testSuite->tests(); - } - - /** - * Rewinds the Iterator to the first element. - * - */ - public function rewind() - { - $this->position = 0; - } - - /** - * Checks if there is a current element after calls to rewind() or next(). - * - * @return boolean - */ - public function valid() - { - return $this->position < count($this->tests); - } - - /** - * Returns the key of the current element. - * - * @return integer - */ - public function key() - { - return $this->position; - } - - /** - * Returns the current element. - * - * @return PHPUnit_Framework_Test - */ - public function current() - { - return $this->valid() ? $this->tests[$this->position] : null; - } - - /** - * Moves forward to next element. - * - */ - public function next() - { - $this->position++; - } - - /** - * Returns the sub iterator for the current element. - * - * @return PHPUnit_Util_TestSuiteIterator - */ - public function getChildren() - { - return new PHPUnit_Util_TestSuiteIterator( - $this->tests[$this->position] - ); - } - - /** - * Checks whether the current element has children. - * - * @return boolean - */ - public function hasChildren() - { - return $this->tests[$this->position] instanceof PHPUnit_Framework_TestSuite; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Util_GlobalState -{ - /** - * @var array - */ - protected static $globals = array(); - - /** - * @var array - */ - protected static $staticAttributes = array(); - - /** - * @var array - */ - protected static $superGlobalArrays = array( - '_ENV', - '_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_FILES', - '_REQUEST' - ); - - /** - * @var array - */ - protected static $superGlobalArraysLong = array( - 'HTTP_ENV_VARS', - 'HTTP_POST_VARS', - 'HTTP_GET_VARS', - 'HTTP_COOKIE_VARS', - 'HTTP_SERVER_VARS', - 'HTTP_POST_FILES' - ); - - public static function backupGlobals(array $blacklist) - { - self::$globals = array(); - $superGlobalArrays = self::getSuperGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - if (!in_array($superGlobalArray, $blacklist)) { - self::backupSuperGlobalArray($superGlobalArray); - } - } - - foreach (array_keys($GLOBALS) as $key) { - if ($key != 'GLOBALS' && - !in_array($key, $superGlobalArrays) && - !in_array($key, $blacklist) && - !$GLOBALS[$key] instanceof Closure) { - self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]); - } - } - } - - public static function restoreGlobals(array $blacklist) - { - if (ini_get('register_long_arrays') == '1') { - $superGlobalArrays = array_merge( - self::$superGlobalArrays, self::$superGlobalArraysLong - ); - } else { - $superGlobalArrays = self::$superGlobalArrays; - } - - foreach ($superGlobalArrays as $superGlobalArray) { - if (!in_array($superGlobalArray, $blacklist)) { - self::restoreSuperGlobalArray($superGlobalArray); - } - } - - foreach (array_keys($GLOBALS) as $key) { - if ($key != 'GLOBALS' && - !in_array($key, $superGlobalArrays) && - !in_array($key, $blacklist)) { - if (isset(self::$globals['GLOBALS'][$key])) { - $GLOBALS[$key] = unserialize( - self::$globals['GLOBALS'][$key] - ); - } else { - unset($GLOBALS[$key]); - } - } - } - - self::$globals = array(); - } - - protected static function backupSuperGlobalArray($superGlobalArray) - { - self::$globals[$superGlobalArray] = array(); - - if (isset($GLOBALS[$superGlobalArray]) && - is_array($GLOBALS[$superGlobalArray])) { - foreach ($GLOBALS[$superGlobalArray] as $key => $value) { - self::$globals[$superGlobalArray][$key] = serialize($value); - } - } - } - - protected static function restoreSuperGlobalArray($superGlobalArray) - { - if (isset($GLOBALS[$superGlobalArray]) && - is_array($GLOBALS[$superGlobalArray]) && - isset(self::$globals[$superGlobalArray])) { - $keys = array_keys( - array_merge( - $GLOBALS[$superGlobalArray], self::$globals[$superGlobalArray] - ) - ); - - foreach ($keys as $key) { - if (isset(self::$globals[$superGlobalArray][$key])) { - $GLOBALS[$superGlobalArray][$key] = unserialize( - self::$globals[$superGlobalArray][$key] - ); - } else { - unset($GLOBALS[$superGlobalArray][$key]); - } - } - } - - self::$globals[$superGlobalArray] = array(); - } - - public static function getIncludedFilesAsString() - { - $blacklist = new PHPUnit_Util_Blacklist; - $files = get_included_files(); - $prefix = false; - $result = ''; - - if (defined('__PHPUNIT_PHAR__')) { - $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; - } - - for ($i = count($files) - 1; $i > 0; $i--) { - $file = $files[$i]; - - if ($prefix !== false && strpos($file, $prefix) === 0) { - continue; - } - - if (!$blacklist->isBlacklisted($file) && is_file($file)) { - $result = 'require_once \'' . $file . "';\n" . $result; - } - } - - return $result; - } - - public static function getIniSettingsAsString() - { - $result = ''; - $iniSettings = ini_get_all(null, false); - - foreach ($iniSettings as $key => $value) { - $result .= sprintf( - '@ini_set(%s, %s);' . "\n", - self::exportVariable($key), - self::exportVariable($value) - ); - } - - return $result; - } - - public static function getConstantsAsString() - { - $constants = get_defined_constants(true); - $result = ''; - - if (isset($constants['user'])) { - foreach ($constants['user'] as $name => $value) { - $result .= sprintf( - 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", - $name, - $name, - self::exportVariable($value) - ); - } - } - - return $result; - } - - public static function getGlobalsAsString() - { - $result = ''; - $superGlobalArrays = self::getSuperGlobalArrays(); - - foreach ($superGlobalArrays as $superGlobalArray) { - if (isset($GLOBALS[$superGlobalArray]) && - is_array($GLOBALS[$superGlobalArray])) { - foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) { - if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { - continue; - } - - $result .= sprintf( - '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", - $superGlobalArray, - $key, - self::exportVariable($GLOBALS[$superGlobalArray][$key]) - ); - } - } - } - - $blacklist = $superGlobalArrays; - $blacklist[] = 'GLOBALS'; - - foreach (array_keys($GLOBALS) as $key) { - if (!in_array($key, $blacklist) && !$GLOBALS[$key] instanceof Closure) { - $result .= sprintf( - '$GLOBALS[\'%s\'] = %s;' . "\n", - $key, - self::exportVariable($GLOBALS[$key]) - ); - } - } - - return $result; - } - - protected static function getSuperGlobalArrays() - { - if (ini_get('register_long_arrays') == '1') { - return array_merge( - self::$superGlobalArrays, self::$superGlobalArraysLong - ); - } else { - return self::$superGlobalArrays; - } - } - - public static function backupStaticAttributes(array $blacklist) - { - self::$staticAttributes = array(); - $declaredClasses = get_declared_classes(); - $declaredClassesNum = count($declaredClasses); - - for ($i = $declaredClassesNum - 1; $i >= 0; $i--) { - if (strpos($declaredClasses[$i], 'PHPUnit') !== 0 && - strpos($declaredClasses[$i], 'File_Iterator') !== 0 && - strpos($declaredClasses[$i], 'PHP_CodeCoverage') !== 0 && - strpos($declaredClasses[$i], 'PHP_Invoker') !== 0 && - strpos($declaredClasses[$i], 'PHP_Timer') !== 0 && - strpos($declaredClasses[$i], 'PHP_Token_Stream') !== 0 && - strpos($declaredClasses[$i], 'Symfony') !== 0 && - strpos($declaredClasses[$i], 'Text_Template') !== 0) { - $class = new ReflectionClass($declaredClasses[$i]); - - if ($class->isSubclassOf('PHPUnit_Framework_Test')) { - continue; - } - - if (!$class->isUserDefined()) { - break; - } - - $backup = array(); - - foreach ($class->getProperties() as $attribute) { - if ($attribute->isStatic()) { - $name = $attribute->getName(); - - if (!isset($blacklist[$declaredClasses[$i]]) || - !in_array($name, $blacklist[$declaredClasses[$i]])) { - $attribute->setAccessible(true); - $value = $attribute->getValue(); - - if (!$value instanceof Closure) { - $backup[$name] = serialize($value); - } - } - } - } - - if (!empty($backup)) { - self::$staticAttributes[$declaredClasses[$i]] = $backup; - } - } - } - } - - public static function restoreStaticAttributes() - { - foreach (self::$staticAttributes as $className => $staticAttributes) { - foreach ($staticAttributes as $name => $value) { - $reflector = new ReflectionProperty($className, $name); - $reflector->setAccessible(true); - $reflector->setValue(unserialize($value)); - } - } - - self::$staticAttributes = array(); - } - - protected static function exportVariable($variable) - { - if (is_scalar($variable) || is_null($variable) || - (is_array($variable) && self::arrayOnlyContainsScalars($variable))) { - return var_export($variable, true); - } - - return 'unserialize(\'' . - str_replace("'", "\'", serialize($variable)) . - '\')'; - } - - protected static function arrayOnlyContainsScalars(array $array) - { - $result = true; - - foreach ($array as $element) { - if (is_array($element)) { - $result = self::arrayOnlyContainsScalars($element); - } elseif (!is_scalar($element) && !is_null($element)) { - $result = false; - } - - if ($result === false) { - break; - } - } - - return $result; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * Utility methods to load PHP sourcefiles. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.3.0 - */ -class PHPUnit_Util_Fileloader -{ - /** - * Checks if a PHP sourcefile is readable. - * The sourcefile is loaded through the load() method. - * - * @param string $filename - * @return string - * @throws PHPUnit_Framework_Exception - */ - public static function checkAndLoad($filename) - { - $includePathFilename = stream_resolve_include_path($filename); - - if (!$includePathFilename || !is_readable($includePathFilename)) { - throw new PHPUnit_Framework_Exception( - sprintf('Cannot open file "%s".' . "\n", $filename) - ); - } - - self::load($includePathFilename); - - return $includePathFilename; - } - - /** - * Loads a PHP sourcefile. - * - * @param string $filename - * @return mixed - * @since Method available since Release 3.0.0 - */ - public static function load($filename) - { - $oldVariableNames = array_keys(get_defined_vars()); - - include_once $filename; - - $newVariables = get_defined_vars(); - $newVariableNames = array_diff( - array_keys($newVariables), $oldVariableNames - ); - - foreach ($newVariableNames as $variableName) { - if ($variableName != 'oldVariableNames') { - $GLOBALS[$variableName] = $newVariables[$variableName]; - } - } - - return $filename; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -if (!function_exists('trait_exists')) { - function trait_exists($traitname, $autoload = true) - { - return false; - } -} - -/** - * Test helpers. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_Util_Test -{ - const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; - const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m'; - const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; - const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P.+?)[ \t]*\r?$/m'; - const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^ ]+?))[ \t]*\r?$/m'; - - const SMALL = 0; - const MEDIUM = 1; - const LARGE = 2; - - private static $annotationCache = array(); - - private static $templateMethods = array( - 'setUp', 'assertPreConditions', 'assertPostConditions', 'tearDown' - ); - - private static $hookMethods = array(); - - /** - * @param PHPUnit_Framework_Test $test - * @param boolean $asString - * @return mixed - */ - public static function describe(PHPUnit_Framework_Test $test, $asString = true) - { - if ($asString) { - if ($test instanceof PHPUnit_Framework_SelfDescribing) { - return $test->toString(); - } else { - return get_class($test); - } - } else { - if ($test instanceof PHPUnit_Framework_TestCase) { - return array( - get_class($test), $test->getName() - ); - } elseif ($test instanceof PHPUnit_Framework_SelfDescribing) { - return array('', $test->toString()); - } else { - return array('', get_class($test)); - } - } - } - - /** - * @param string $className - * @param string $methodName - * @return array|bool - * @throws PHPUnit_Framework_CodeCoverageException - * @since Method available since Release 4.0.0 - */ - public static function getLinesToBeCovered($className, $methodName) - { - $codeToCoverList = array(); - - $class = new ReflectionClass($className); - - try { - $method = new ReflectionMethod($className, $methodName); - } catch (ReflectionException $e) { - return array(); - } - - $docComment = self::getDocCommentsOfTestClassAndTestMethodAndTemplateMethods($class, $method); - - if (strpos($docComment, '@coversNothing') !== false) { - return false; - } - - $classShortcut = preg_match_all( - '(@coversDefaultClass\s+(?P[^\s]++)\s*$)m', - $class->getDocComment(), - $matches - ); - - if ($classShortcut) { - if ($classShortcut > 1) { - throw new PHPUnit_Framework_CodeCoverageException( - sprintf( - 'More than one @coversClass annotation in class or interface "%s".', - $className - ) - ); - } - - $classShortcut = $matches['coveredClass'][0]; - } - - $match = preg_match_all( - '(@covers\s+(?P[^\s()]++)[\s()]*$)m', - $docComment, - $matches - ); - - if ($match) { - foreach ($matches['coveredElement'] as $coveredElement) { - if ($classShortcut && strncmp($coveredElement, '::', 2) === 0) { - $coveredElement = $classShortcut . $coveredElement; - } - - $codeToCoverList = array_merge( - $codeToCoverList, - self::resolveElementToReflectionObjects($coveredElement) - ); - } - } - - return self::resolveReflectionObjectsToLines($codeToCoverList); - } - - /** - * Returns lines of code specified with the @uses annotation. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 4.0.0 - */ - public static function getLinesToBeUsed($className, $methodName) - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $uses = array(); - - if (isset($annotations['class']['uses'])) { - $uses = $annotations['class']['uses']; - } - - if (isset($annotations['method']['uses'])) { - $uses = array_merge($uses, $annotations['method']['uses']); - } - - $uses = array_unique($uses); - $codeToUseList = array(); - - foreach (array_unique($uses) as $element) { - $codeToUseList = array_merge( - $codeToUseList, - self::resolveElementToReflectionObjects($element) - ); - } - - return self::resolveReflectionObjectsToLines($codeToUseList); - } - - /** - * Returns the requirements for a test. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.6.0 - */ - public static function getRequirements($className, $methodName) - { - $reflector = new ReflectionClass($className); - $docComment = $reflector->getDocComment(); - $reflector = new ReflectionMethod($className, $methodName); - $docComment .= "\n" . $reflector->getDocComment(); - $requires = array(); - - if ($count = preg_match_all(self::REGEX_REQUIRES_OS, $docComment, $matches)) { - $requires['OS'] = sprintf( - '/%s/i', - addcslashes($matches['value'][$count - 1], '/') - ); - } - if ($count = preg_match_all(self::REGEX_REQUIRES_VERSION, $docComment, $matches)) { - for ($i = 0; $i < $count; $i++) { - $requires[$matches['name'][$i]] = $matches['value'][$i]; - } - } - - // https://bugs.php.net/bug.php?id=63055 - $matches = array(); - - if ($count = preg_match_all(self::REGEX_REQUIRES, $docComment, $matches)) { - for ($i = 0; $i < $count; $i++) { - $name = $matches['name'][$i] . 's'; - if (!isset($requires[$name])) { - $requires[$name] = array(); - } - $requires[$name][] = $matches['value'][$i]; - } - } - - return $requires; - } - - /** - * Returns the expected exception for a test. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.3.6 - */ - public static function getExpectedException($className, $methodName) - { - $reflector = new ReflectionMethod($className, $methodName); - $docComment = $reflector->getDocComment(); - $docComment = substr($docComment, 3, -2); - - if (preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $class = $matches[1]; - $code = null; - $message = ''; - - if (isset($matches[2])) { - $message = trim($matches[2]); - } elseif (isset($annotations['method']['expectedExceptionMessage'])) { - $message = self::parseAnnotationContent( - $annotations['method']['expectedExceptionMessage'][0] - ); - } - - if (isset($matches[3])) { - $code = $matches[3]; - } elseif (isset($annotations['method']['expectedExceptionCode'])) { - $code = self::parseAnnotationContent( - $annotations['method']['expectedExceptionCode'][0] - ); - } - - if (is_numeric($code)) { - $code = (int) $code; - } elseif (is_string($code) && defined($code)) { - $code = (int) constant($code); - } - - return array( - 'class' => $class, 'code' => $code, 'message' => $message - ); - } - - return false; - } - - /** - * Parse annotation content to use constant/class constant values - * - * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME - * - * If the constant is not found the string is used as is to ensure maximum BC. - * - * @param string $message - * @return string - */ - private static function parseAnnotationContent($message) - { - if (strpos($message, '::') !== false && count(explode('::', $message) == 2)) { - if (defined($message)) { - $message = constant($message); - } - } - - return $message; - } - - /** - * Returns the provided data for a method. - * - * @param string $className - * @param string $methodName - * @return array|Iterator when a data provider is specified and exists - * false when a data provider is specified but does not exist - * null when no data provider is specified - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.2.0 - */ - public static function getProvidedData($className, $methodName) - { - $reflector = new ReflectionMethod($className, $methodName); - $docComment = $reflector->getDocComment(); - $data = null; - - if (preg_match(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { - $dataProviderMethodNameNamespace = explode('\\', $matches[1]); - $leaf = explode('::', array_pop($dataProviderMethodNameNamespace)); - $dataProviderMethodName = array_pop($leaf); - - if (!empty($dataProviderMethodNameNamespace)) { - $dataProviderMethodNameNamespace = join('\\', $dataProviderMethodNameNamespace) . '\\'; - } else { - $dataProviderMethodNameNamespace = ''; - } - - if (!empty($leaf)) { - $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf); - } else { - $dataProviderClassName = $className; - } - - $dataProviderClass = new ReflectionClass($dataProviderClassName); - $dataProviderMethod = $dataProviderClass->getMethod( - $dataProviderMethodName - ); - - if ($dataProviderMethod->isStatic()) { - $object = null; - } else { - $object = $dataProviderClass->newInstance(); - } - - if ($dataProviderMethod->getNumberOfParameters() == 0) { - $data = $dataProviderMethod->invoke($object); - } else { - $data = $dataProviderMethod->invoke($object, $methodName); - } - } - - if ($data !== null) { - if (is_object($data)) { - $data = iterator_to_array($data); - } - - foreach ($data as $key => $value) { - if (!is_array($value)) { - throw new PHPUnit_Framework_Exception( - sprintf( - 'Data set %s is invalid.', - is_int($key) ? '#' . $key : '"' . $key . '"' - ) - ); - } - } - } - - return $data; - } - - /** - * @param string $className - * @param string $methodName - * @return array - * @throws ReflectionException - * @since Method available since Release 3.4.0 - */ - public static function parseTestMethodAnnotations($className, $methodName = '') - { - if (!isset(self::$annotationCache[$className])) { - $class = new ReflectionClass($className); - self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment()); - } - - if (!empty($methodName) && !isset(self::$annotationCache[$className . '::' . $methodName])) { - try { - $method = new ReflectionMethod($className, $methodName); - $annotations = self::parseAnnotations($method->getDocComment()); - } catch (ReflectionException $e) { - $annotations = array(); - } - self::$annotationCache[$className . '::' . $methodName] = $annotations; - } - - return array( - 'class' => self::$annotationCache[$className], - 'method' => !empty($methodName) ? self::$annotationCache[$className . '::' . $methodName] : array() - ); - } - - /** - * @param string $docblock - * @return array - * @since Method available since Release 3.4.0 - */ - private static function parseAnnotations($docblock) - { - $annotations = array(); - // Strip away the docblock header and footer to ease parsing of one line annotations - $docblock = substr($docblock, 3, -2); - - if (preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docblock, $matches)) { - $numMatches = count($matches[0]); - - for ($i = 0; $i < $numMatches; ++$i) { - $annotations[$matches['name'][$i]][] = $matches['value'][$i]; - } - } - - return $annotations; - } - - /** - * Returns the backup settings for a test. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.4.0 - */ - public static function getBackupSettings($className, $methodName) - { - return array( - 'backupGlobals' => self::getBooleanAnnotationSetting( - $className, $methodName, 'backupGlobals' - ), - 'backupStaticAttributes' => self::getBooleanAnnotationSetting( - $className, $methodName, 'backupStaticAttributes' - ) - ); - } - - /** - * Returns the dependencies for a test class or method. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.4.0 - */ - public static function getDependencies($className, $methodName) - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $dependencies = array(); - - if (isset($annotations['class']['depends'])) { - $dependencies = $annotations['class']['depends']; - } - - if (isset($annotations['method']['depends'])) { - $dependencies = array_merge( - $dependencies, $annotations['method']['depends'] - ); - } - - return array_unique($dependencies); - } - - /** - * Returns the error handler settings for a test. - * - * @param string $className - * @param string $methodName - * @return boolean - * @since Method available since Release 3.4.0 - */ - public static function getErrorHandlerSettings($className, $methodName) - { - return self::getBooleanAnnotationSetting( - $className, $methodName, 'errorHandler' - ); - } - - /** - * Returns the groups for a test class or method. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.2.0 - */ - public static function getGroups($className, $methodName = '') - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $groups = array(); - - if (isset($annotations['method']['author'])) { - $groups = $annotations['method']['author']; - } elseif (isset($annotations['class']['author'])) { - $groups = $annotations['class']['author']; - } - - if (isset($annotations['class']['group'])) { - $groups = array_merge($groups, $annotations['class']['group']); - } - - if (isset($annotations['method']['group'])) { - $groups = array_merge($groups, $annotations['method']['group']); - } - - if (isset($annotations['class']['ticket'])) { - $groups = array_merge($groups, $annotations['class']['ticket']); - } - - if (isset($annotations['method']['ticket'])) { - $groups = array_merge($groups, $annotations['method']['ticket']); - } - - foreach (array('small', 'medium', 'large') as $size) { - if (isset($annotations['method'][$size])) { - $groups[] = $size; - } elseif (isset($annotations['class'][$size])) { - $groups[] = $size; - } - } - - return array_unique($groups); - } - - /** - * Returns the size of the test. - * - * @param string $className - * @param string $methodName - * @return integer - * @since Method available since Release 3.6.0 - */ - public static function getSize($className, $methodName) - { - $groups = array_flip(self::getGroups($className, $methodName)); - $size = self::SMALL; - $class = new ReflectionClass($className); - - if ((class_exists('PHPUnit_Extensions_Database_TestCase', false) && - $class->isSubclassOf('PHPUnit_Extensions_Database_TestCase')) || - (class_exists('PHPUnit_Extensions_SeleniumTestCase', false) && - $class->isSubclassOf('PHPUnit_Extensions_SeleniumTestCase'))) { - $size = self::LARGE; - } elseif (isset($groups['medium'])) { - $size = self::MEDIUM; - } elseif (isset($groups['large'])) { - $size = self::LARGE; - } - - return $size; - } - - /** - * Returns the tickets for a test class or method. - * - * @param string $className - * @param string $methodName - * @return array - * @since Method available since Release 3.4.0 - */ - public static function getTickets($className, $methodName) - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $tickets = array(); - - if (isset($annotations['class']['ticket'])) { - $tickets = $annotations['class']['ticket']; - } - - if (isset($annotations['method']['ticket'])) { - $tickets = array_merge($tickets, $annotations['method']['ticket']); - } - - return array_unique($tickets); - } - - /** - * Returns the process isolation settings for a test. - * - * @param string $className - * @param string $methodName - * @return boolean - * @since Method available since Release 3.4.1 - */ - public static function getProcessIsolationSettings($className, $methodName) - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - if (isset($annotations['class']['runTestsInSeparateProcesses']) || - isset($annotations['method']['runInSeparateProcess'])) { - return true; - } else { - return false; - } - } - - /** - * Returns the preserve global state settings for a test. - * - * @param string $className - * @param string $methodName - * @return boolean - * @since Method available since Release 3.4.0 - */ - public static function getPreserveGlobalStateSettings($className, $methodName) - { - return self::getBooleanAnnotationSetting( - $className, $methodName, 'preserveGlobalState' - ); - } - - /** - * @param string $className - * @return array - * @since Method available since Release 4.0.8 - */ - public static function getHookMethods($className) - { - if (!class_exists($className, false)) { - return self::emptyHookMethodsArray(); - } - - if (!isset(self::$hookMethods[$className])) { - self::$hookMethods[$className] = self::emptyHookMethodsArray(); - - try { - $class = new ReflectionClass($className); - - foreach ($class->getMethods() as $method) { - if ($method->getDeclaringClass()->getName() != $className) { - continue; - } - - if (self::isBeforeClassMethod($method)) { - self::$hookMethods[$className]['beforeClass'][] = $method->getName(); - } - - if (self::isBeforeMethod($method)) { - self::$hookMethods[$className]['before'][] = $method->getName(); - } - - if (self::isAfterMethod($method)) { - self::$hookMethods[$className]['after'][] = $method->getName(); - } - - if (self::isAfterClassMethod($method)) { - self::$hookMethods[$className]['afterClass'][] = $method->getName(); - } - } - } catch (ReflectionException $e) { - } - } - - return self::$hookMethods[$className]; - } - - /** - * @return array - * @since Method available since Release 4.0.9 - */ - private static function emptyHookMethodsArray() - { - return array( - 'beforeClass' => array('setUpBeforeClass'), - 'before' => array('setUp'), - 'after' => array('tearDown'), - 'afterClass' => array('tearDownAfterClass') - ); - } - - /** - * @param string $className - * @param string $methodName - * @param string $settingName - * @return boolean - * @since Method available since Release 3.4.0 - */ - private static function getBooleanAnnotationSetting($className, $methodName, $settingName) - { - $annotations = self::parseTestMethodAnnotations( - $className, $methodName - ); - - $result = null; - - if (isset($annotations['class'][$settingName])) { - if ($annotations['class'][$settingName][0] == 'enabled') { - $result = true; - } elseif ($annotations['class'][$settingName][0] == 'disabled') { - $result = false; - } - } - - if (isset($annotations['method'][$settingName])) { - if ($annotations['method'][$settingName][0] == 'enabled') { - $result = true; - } elseif ($annotations['method'][$settingName][0] == 'disabled') { - $result = false; - } - } - - return $result; - } - - /** - * @param string $element - * @return array - * @throws PHPUnit_Framework_InvalidCoversTargetException - * @since Method available since Release 4.0.0 - */ - private static function resolveElementToReflectionObjects($element) - { - $codeToCoverList = array(); - - if (strpos($element, '::') !== false) { - list($className, $methodName) = explode('::', $element); - - if (isset($methodName[0]) && $methodName[0] == '<') { - $classes = array($className); - - foreach ($classes as $className) { - if (!class_exists($className) && - !interface_exists($className)) { - throw new PHPUnit_Framework_InvalidCoversTargetException( - sprintf( - 'Trying to @cover or @use not existing class or ' . - 'interface "%s".', - $className - ) - ); - } - - $class = new ReflectionClass($className); - $methods = $class->getMethods(); - $inverse = isset($methodName[1]) && $methodName[1] == '!'; - - if (strpos($methodName, 'protected')) { - $visibility = 'isProtected'; - } elseif (strpos($methodName, 'private')) { - $visibility = 'isPrivate'; - } elseif (strpos($methodName, 'public')) { - $visibility = 'isPublic'; - } - - foreach ($methods as $method) { - if ($inverse && !$method->$visibility()) { - $codeToCoverList[] = $method; - } elseif (!$inverse && $method->$visibility()) { - $codeToCoverList[] = $method; - } - } - } - } else { - $classes = array($className); - - foreach ($classes as $className) { - if ($className == '' && function_exists($methodName)) { - $codeToCoverList[] = new ReflectionFunction( - $methodName - ); - } else { - if (!((class_exists($className) || - interface_exists($className) || - trait_exists($className)) && - method_exists($className, $methodName))) { - throw new PHPUnit_Framework_InvalidCoversTargetException( - sprintf( - 'Trying to @cover or @use not existing method "%s::%s".', - $className, - $methodName - ) - ); - } - - $codeToCoverList[] = new ReflectionMethod( - $className, $methodName - ); - } - } - } - } else { - $extended = false; - - if (strpos($element, '') !== false) { - $element = str_replace( - '', '', $element - ); - - $extended = true; - } - - $classes = array($element); - - if ($extended) { - $classes = array_merge( - $classes, - class_implements($element), - class_parents($element) - ); - } - - foreach ($classes as $className) { - if (!class_exists($className) && - !interface_exists($className) && - !trait_exists($className)) { - throw new PHPUnit_Framework_InvalidCoversTargetException( - sprintf( - 'Trying to @cover or @use not existing class or ' . - 'interface "%s".', - $className - ) - ); - } - - $codeToCoverList[] = new ReflectionClass($className); - } - } - - return $codeToCoverList; - } - - /** - * @param array $reflectors - * @return array - */ - private static function resolveReflectionObjectsToLines(array $reflectors) - { - $result = array(); - - foreach ($reflectors as $reflector) { - $filename = $reflector->getFileName(); - - if (!isset($result[$filename])) { - $result[$filename] = array(); - } - - $result[$filename] = array_unique( - array_merge( - $result[$filename], - range( - $reflector->getStartLine(), $reflector->getEndLine() - ) - ) - ); - } - - return $result; - } - - /** - * @param ReflectionClass $class - * @param ReflectionMethod $method - * @return string - */ - private static function getDocCommentsOfTestClassAndTestMethodAndTemplateMethods(ReflectionClass $class, ReflectionMethod $method) - { - $buffer = substr($class->getDocComment(), 3, -2) . PHP_EOL . - substr($method->getDocComment(), 3, -2); - - foreach (self::$templateMethods as $templateMethod) { - if ($class->hasMethod($templateMethod)) { - $_method = $class->getMethod($templateMethod); - $buffer .= PHP_EOL . substr($_method->getDocComment(), 3, -2); - } - } - - return $buffer; - } - - /** - * @param ReflectionMethod $method - * @return boolean - * @since Method available since Release 4.0.8 - */ - private static function isBeforeClassMethod(ReflectionMethod $method) - { - return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false; - } - - /** - * @param ReflectionMethod $method - * @return boolean - * @since Method available since Release 4.0.8 - */ - private static function isBeforeMethod(ReflectionMethod $method) - { - return preg_match('/@before\b/', $method->getDocComment()); - } - - /** - * @param ReflectionMethod $method - * @return boolean - * @since Method available since Release 4.0.8 - */ - private static function isAfterClassMethod(ReflectionMethod $method) - { - return $method->isStatic() && strpos($method->getDocComment(), '@afterClass') !== false; - } - - /** - * @param ReflectionMethod $method - * @return boolean - * @since Method available since Release 4.0.8 - */ - private static function isAfterMethod(ReflectionMethod $method) - { - return preg_match('/@after\b/', $method->getDocComment()); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Utility class that can print to STDOUT or write to a file. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Util_Printer -{ - /** - * If true, flush output after every write. - * - * @var boolean - */ - protected $autoFlush = false; - - /** - * @var resource - */ - protected $out; - - /** - * @var string - */ - protected $outTarget; - - /** - * @var boolean - */ - protected $printsHTML = false; - - /** - * Constructor. - * - * @param mixed $out - * @throws PHPUnit_Framework_Exception - */ - public function __construct($out = null) - { - if ($out !== null) { - if (is_string($out)) { - if (strpos($out, 'socket://') === 0) { - $out = explode(':', str_replace('socket://', '', $out)); - - if (sizeof($out) != 2) { - throw new PHPUnit_Framework_Exception; - } - - $this->out = fsockopen($out[0], $out[1]); - } else { - if (strpos($out, 'php://') === false && - !is_dir(dirname($out))) { - mkdir(dirname($out), 0777, true); - } - - $this->out = fopen($out, 'wt'); - } - - $this->outTarget = $out; - } else { - $this->out = $out; - } - } - } - - /** - * Flush buffer, optionally tidy up HTML, and close output if it's not to a php stream - */ - public function flush() - { - if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) { - fclose($this->out); - } - - if ($this->printsHTML === true && - $this->outTarget !== null && - strpos($this->outTarget, 'php://') !== 0 && - strpos($this->outTarget, 'socket://') !== 0 && - extension_loaded('tidy')) { - file_put_contents( - $this->outTarget, - tidy_repair_file( - $this->outTarget, array('indent' => true, 'wrap' => 0), 'utf8' - ) - ); - } - } - - /** - * Performs a safe, incremental flush. - * - * Do not confuse this function with the flush() function of this class, - * since the flush() function may close the file being written to, rendering - * the current object no longer usable. - * - * @since Method available since Release 3.3.0 - */ - public function incrementalFlush() - { - if ($this->out) { - fflush($this->out); - } else { - flush(); - } - } - - /** - * @param string $buffer - */ - public function write($buffer) - { - if ($this->out) { - fwrite($this->out, $buffer); - - if ($this->autoFlush) { - $this->incrementalFlush(); - } - } else { - if (PHP_SAPI != 'cli') { - $buffer = htmlspecialchars($buffer); - } - - print $buffer; - - if ($this->autoFlush) { - $this->incrementalFlush(); - } - } - } - - /** - * Check auto-flush mode. - * - * @return boolean - * @since Method available since Release 3.3.0 - */ - public function getAutoFlush() - { - return $this->autoFlush; - } - - /** - * Set auto-flushing mode. - * - * If set, *incremental* flushes will be done after each write. This should - * not be confused with the different effects of this class' flush() method. - * - * @param boolean $autoFlush - * @since Method available since Release 3.3.0 - */ - public function setAutoFlush($autoFlush) - { - if (is_bool($autoFlush)) { - $this->autoFlush = $autoFlush; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean'); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.2.0 - */ - -/** - * Wrapper for the PHPUnit XML configuration file. - * - * Example XML configuration file: - * - * - * - * - * - * - * /path/to/files - * /path/to/MyTest.php - * /path/to/files/exclude - * - * - * - * - * - * name - * - * - * name - * - * - * - * - * - * /path/to/files - * /path/to/file - * - * /path/to/files - * /path/to/file - * - * - * - * /path/to/files - * /path/to/file - * - * /path/to/files - * /path/to/file - * - * - * - * - * - * - * - * - * - * Sebastian - * - * - * 22 - * April - * 19.78 - * - * - * MyRelativeFile.php - * MyRelativeDir - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * . - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.2.0 - */ -class PHPUnit_Util_Configuration -{ - private static $instances = array(); - - protected $document; - protected $xpath; - protected $filename; - - /** - * Loads a PHPUnit configuration file. - * - * @param string $filename - */ - protected function __construct($filename) - { - $this->filename = $filename; - $this->document = PHPUnit_Util_XML::loadFile($filename, false, true); - $this->xpath = new DOMXPath($this->document); - } - - /** - * @since Method available since Release 3.4.0 - */ - final private function __clone() - { - } - - /** - * Returns a PHPUnit configuration object. - * - * @param string $filename - * @return PHPUnit_Util_Configuration - * @since Method available since Release 3.4.0 - */ - public static function getInstance($filename) - { - $realpath = realpath($filename); - - if ($realpath === false) { - throw new PHPUnit_Framework_Exception( - sprintf( - 'Could not read "%s".', - $filename - ) - ); - } - - if (!isset(self::$instances[$realpath])) { - self::$instances[$realpath] = new PHPUnit_Util_Configuration($realpath); - } - - return self::$instances[$realpath]; - } - - /** - * Returns the realpath to the configuration file. - * - * @return string - * @since Method available since Release 3.6.0 - */ - public function getFilename() - { - return $this->filename; - } - - /** - * Returns the configuration for SUT filtering. - * - * @return array - * @since Method available since Release 3.2.1 - */ - public function getFilterConfiguration() - { - $addUncoveredFilesFromWhitelist = true; - $processUncoveredFilesFromWhitelist = false; - - $tmp = $this->xpath->query('filter/whitelist'); - - if ($tmp->length == 1) { - if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) { - $addUncoveredFilesFromWhitelist = $this->getBoolean( - (string) $tmp->item(0)->getAttribute( - 'addUncoveredFilesFromWhitelist' - ), - true - ); - } - - if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) { - $processUncoveredFilesFromWhitelist = $this->getBoolean( - (string) $tmp->item(0)->getAttribute( - 'processUncoveredFilesFromWhitelist' - ), - false - ); - } - } - - return array( - 'blacklist' => array( - 'include' => array( - 'directory' => $this->readFilterDirectories( - 'filter/blacklist/directory' - ), - 'file' => $this->readFilterFiles( - 'filter/blacklist/file' - ) - ), - 'exclude' => array( - 'directory' => $this->readFilterDirectories( - 'filter/blacklist/exclude/directory' - ), - 'file' => $this->readFilterFiles( - 'filter/blacklist/exclude/file' - ) - ) - ), - 'whitelist' => array( - 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist, - 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist, - 'include' => array( - 'directory' => $this->readFilterDirectories( - 'filter/whitelist/directory' - ), - 'file' => $this->readFilterFiles( - 'filter/whitelist/file' - ) - ), - 'exclude' => array( - 'directory' => $this->readFilterDirectories( - 'filter/whitelist/exclude/directory' - ), - 'file' => $this->readFilterFiles( - 'filter/whitelist/exclude/file' - ) - ) - ) - ); - } - - /** - * Returns the configuration for groups. - * - * @return array - * @since Method available since Release 3.2.1 - */ - public function getGroupConfiguration() - { - $groups = array( - 'include' => array(), - 'exclude' => array() - ); - - foreach ($this->xpath->query('groups/include/group') as $group) { - $groups['include'][] = (string) $group->nodeValue; - } - - foreach ($this->xpath->query('groups/exclude/group') as $group) { - $groups['exclude'][] = (string) $group->nodeValue; - } - - return $groups; - } - - /** - * Returns the configuration for listeners. - * - * @return array - * @since Method available since Release 3.4.0 - */ - public function getListenerConfiguration() - { - $result = array(); - - foreach ($this->xpath->query('listeners/listener') as $listener) { - $class = (string) $listener->getAttribute('class'); - $file = ''; - $arguments = array(); - - if ($listener->hasAttribute('file')) { - $file = $this->toAbsolutePath( - (string) $listener->getAttribute('file'), true - ); - } - - foreach ($listener->childNodes as $node) { - if ($node instanceof DOMElement && $node->tagName == 'arguments') { - foreach ($node->childNodes as $argument) { - if ($argument instanceof DOMElement) { - if ($argument->tagName == 'file' || - $argument->tagName == 'directory') { - $arguments[] = $this->toAbsolutePath((string) $argument->nodeValue); - } else { - $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument); - } - } - } - } - } - - $result[] = array( - 'class' => $class, - 'file' => $file, - 'arguments' => $arguments - ); - } - - return $result; - } - - /** - * Returns the logging configuration. - * - * @return array - */ - public function getLoggingConfiguration() - { - $result = array(); - - foreach ($this->xpath->query('logging/log') as $log) { - $type = (string) $log->getAttribute('type'); - - $target = $this->toAbsolutePath( - (string) $log->getAttribute('target') - ); - - if ($type == 'coverage-html') { - if ($log->hasAttribute('lowUpperBound')) { - $result['lowUpperBound'] = (string) $log->getAttribute('lowUpperBound'); - } - - if ($log->hasAttribute('highLowerBound')) { - $result['highLowerBound'] = (string) $log->getAttribute('highLowerBound'); - } - } elseif ($type == 'junit') { - if ($log->hasAttribute('logIncompleteSkipped')) { - $result['logIncompleteSkipped'] = $this->getBoolean( - (string) $log->getAttribute('logIncompleteSkipped'), - false - ); - } - } elseif ($type == 'coverage-text') { - if ($log->hasAttribute('showUncoveredFiles')) { - $result['coverageTextShowUncoveredFiles'] = $this->getBoolean( - (string) $log->getAttribute('showUncoveredFiles'), - false - ); - } - if ($log->hasAttribute('showOnlySummary')) { - $result['coverageTextShowOnlySummary'] = $this->getBoolean( - (string) $log->getAttribute('showOnlySummary'), - false - ); - } - } - - $result[$type] = $target; - } - - return $result; - } - - /** - * Returns the PHP configuration. - * - * @return array - * @since Method available since Release 3.2.1 - */ - public function getPHPConfiguration() - { - $result = array( - 'include_path' => array(), - 'ini' => array(), - 'const' => array(), - 'var' => array(), - 'env' => array(), - 'post' => array(), - 'get' => array(), - 'cookie' => array(), - 'server' => array(), - 'files' => array(), - 'request' => array() - ); - - foreach ($this->xpath->query('php/includePath') as $includePath) { - $path = (string) $includePath->nodeValue; - - $result['include_path'][] = $this->toAbsolutePath($path); - } - - foreach ($this->xpath->query('php/ini') as $ini) { - $name = (string) $ini->getAttribute('name'); - $value = (string) $ini->getAttribute('value'); - - $result['ini'][$name] = $value; - } - - foreach ($this->xpath->query('php/const') as $const) { - $name = (string) $const->getAttribute('name'); - $value = (string) $const->getAttribute('value'); - - $result['const'][$name] = $this->getBoolean($value, $value); - } - - foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) { - foreach ($this->xpath->query('php/' . $array) as $var) { - $name = (string) $var->getAttribute('name'); - $value = (string) $var->getAttribute('value'); - - $result[$array][$name] = $this->getBoolean($value, $value); - } - } - - return $result; - } - - /** - * Handles the PHP configuration. - * - * @since Method available since Release 3.2.20 - */ - public function handlePHPConfiguration() - { - $configuration = $this->getPHPConfiguration(); - - if (! empty($configuration['include_path'])) { - ini_set( - 'include_path', - implode(PATH_SEPARATOR, $configuration['include_path']) . - PATH_SEPARATOR . - ini_get('include_path') - ); - } - - foreach ($configuration['ini'] as $name => $value) { - if (defined($value)) { - $value = constant($value); - } - - ini_set($name, $value); - } - - foreach ($configuration['const'] as $name => $value) { - if (!defined($name)) { - define($name, $value); - } - } - - foreach (array('var', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) { - // See https://github.com/sebastianbergmann/phpunit/issues/277 - switch ($array) { - case 'var': - $target = &$GLOBALS; - break; - - case 'server': - $target = &$_SERVER; - break; - - default: - $target = &$GLOBALS['_' . strtoupper($array)]; - break; - } - - foreach ($configuration[$array] as $name => $value) { - $target[$name] = $value; - } - } - - foreach ($configuration['env'] as $name => $value) { - if (false === getenv($name)) { - putenv("{$name}={$value}"); - } - if (!isset($_ENV[$name])) { - $_ENV[$name] = $value; - } - } - } - - /** - * Returns the PHPUnit configuration. - * - * @return array - * @since Method available since Release 3.2.14 - */ - public function getPHPUnitConfiguration() - { - $result = array(); - $root = $this->document->documentElement; - - if ($root->hasAttribute('cacheTokens')) { - $result['cacheTokens'] = $this->getBoolean( - (string) $root->getAttribute('cacheTokens'), false - ); - } - - if ($root->hasAttribute('colors')) { - $result['colors'] = $this->getBoolean( - (string) $root->getAttribute('colors'), false - ); - } - - /** - * Issue #657 - */ - if ($root->hasAttribute('stderr')) { - $result['stderr'] = $this->getBoolean( - (string)$root->getAttribute('stderr'), FALSE - ); - } - - if ($root->hasAttribute('backupGlobals')) { - $result['backupGlobals'] = $this->getBoolean( - (string) $root->getAttribute('backupGlobals'), true - ); - } - - if ($root->hasAttribute('backupStaticAttributes')) { - $result['backupStaticAttributes'] = $this->getBoolean( - (string) $root->getAttribute('backupStaticAttributes'), false - ); - } - - if ($root->hasAttribute('bootstrap')) { - $result['bootstrap'] = $this->toAbsolutePath( - (string) $root->getAttribute('bootstrap') - ); - } - - if ($root->hasAttribute('convertErrorsToExceptions')) { - $result['convertErrorsToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertErrorsToExceptions'), true - ); - } - - if ($root->hasAttribute('convertNoticesToExceptions')) { - $result['convertNoticesToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertNoticesToExceptions'), true - ); - } - - if ($root->hasAttribute('convertWarningsToExceptions')) { - $result['convertWarningsToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertWarningsToExceptions'), true - ); - } - - if ($root->hasAttribute('forceCoversAnnotation')) { - $result['forceCoversAnnotation'] = $this->getBoolean( - (string) $root->getAttribute('forceCoversAnnotation'), false - ); - } - - if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) { - $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean( - (string) $root->getAttribute('mapTestClassNameToCoveredClassName'), - false - ); - } - - if ($root->hasAttribute('processIsolation')) { - $result['processIsolation'] = $this->getBoolean( - (string) $root->getAttribute('processIsolation'), false - ); - } - - if ($root->hasAttribute('stopOnError')) { - $result['stopOnError'] = $this->getBoolean( - (string) $root->getAttribute('stopOnError'), false - ); - } - - if ($root->hasAttribute('stopOnFailure')) { - $result['stopOnFailure'] = $this->getBoolean( - (string) $root->getAttribute('stopOnFailure'), false - ); - } - - if ($root->hasAttribute('stopOnIncomplete')) { - $result['stopOnIncomplete'] = $this->getBoolean( - (string) $root->getAttribute('stopOnIncomplete'), false - ); - } - - if ($root->hasAttribute('stopOnRisky')) { - $result['stopOnRisky'] = $this->getBoolean( - (string) $root->getAttribute('stopOnRisky'), false - ); - } - - if ($root->hasAttribute('stopOnSkipped')) { - $result['stopOnSkipped'] = $this->getBoolean( - (string) $root->getAttribute('stopOnSkipped'), false - ); - } - - if ($root->hasAttribute('testSuiteLoaderClass')) { - $result['testSuiteLoaderClass'] = (string) $root->getAttribute( - 'testSuiteLoaderClass' - ); - } - - if ($root->hasAttribute('testSuiteLoaderFile')) { - $result['testSuiteLoaderFile'] = $this->toAbsolutePath( - (string) $root->getAttribute('testSuiteLoaderFile') - ); - } - - if ($root->hasAttribute('printerClass')) { - $result['printerClass'] = (string) $root->getAttribute( - 'printerClass' - ); - } - - if ($root->hasAttribute('printerFile')) { - $result['printerFile'] = $this->toAbsolutePath( - (string) $root->getAttribute('printerFile') - ); - } - - if ($root->hasAttribute('timeoutForSmallTests')) { - $result['timeoutForSmallTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForSmallTests'), 1 - ); - } - - if ($root->hasAttribute('timeoutForMediumTests')) { - $result['timeoutForMediumTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForMediumTests'), 10 - ); - } - - if ($root->hasAttribute('timeoutForLargeTests')) { - $result['timeoutForLargeTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForLargeTests'), 60 - ); - } - - if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) { - $result['reportUselessTests'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'), false - ); - } - - if ($root->hasAttribute('checkForUnintentionallyCoveredCode')) { - $result['strictCoverage'] = $this->getBoolean( - (string) $root->getAttribute('checkForUnintentionallyCoveredCode'), false - ); - } - - if ($root->hasAttribute('beStrictAboutOutputDuringTests')) { - $result['disallowTestOutput'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutOutputDuringTests'), false - ); - } - - if ($root->hasAttribute('beStrictAboutTestSize')) { - $result['enforceTimeLimit'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutTestSize'), false - ); - } - - if ($root->hasAttribute('strict')) { - $flag = $this->getBoolean( - (string) $root->getAttribute('strict'), false - ); - - $result['reportUselessTests'] = $flag; - $result['strictCoverage'] = $flag; - $result['disallowTestOutput'] = $flag; - $result['enforceTimeLimit'] = $flag; - } - - if ($root->hasAttribute('verbose')) { - $result['verbose'] = $this->getBoolean( - (string) $root->getAttribute('verbose'), false - ); - } - - return $result; - } - - /** - * Returns the SeleniumTestCase browser configuration. - * - * @return array - * @since Method available since Release 3.2.9 - */ - public function getSeleniumBrowserConfiguration() - { - $result = array(); - - foreach ($this->xpath->query('selenium/browser') as $config) { - $name = (string) $config->getAttribute('name'); - $browser = (string) $config->getAttribute('browser'); - - if ($config->hasAttribute('host')) { - $host = (string) $config->getAttribute('host'); - } else { - $host = 'localhost'; - } - - if ($config->hasAttribute('port')) { - $port = $this->getInteger( - (string) $config->getAttribute('port'), 4444 - ); - } else { - $port = 4444; - } - - if ($config->hasAttribute('timeout')) { - $timeout = $this->getInteger( - (string) $config->getAttribute('timeout'), 30000 - ); - } else { - $timeout = 30000; - } - - $result[] = array( - 'name' => $name, - 'browser' => $browser, - 'host' => $host, - 'port' => $port, - 'timeout' => $timeout - ); - } - - return $result; - } - - /** - * Returns the test suite configuration. - * - * @return PHPUnit_Framework_TestSuite - * @since Method available since Release 3.2.1 - */ - public function getTestSuiteConfiguration($testSuiteFilter=null) - { - $testSuiteNodes = $this->xpath->query('testsuites/testsuite'); - - if ($testSuiteNodes->length == 0) { - $testSuiteNodes = $this->xpath->query('testsuite'); - } - - if ($testSuiteNodes->length == 1) { - return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter); - } - - if ($testSuiteNodes->length > 1) { - $suite = new PHPUnit_Framework_TestSuite; - - foreach ($testSuiteNodes as $testSuiteNode) { - $suite->addTestSuite( - $this->getTestSuite($testSuiteNode, $testSuiteFilter) - ); - } - - return $suite; - } - } - - /** - * @param DOMElement $testSuiteNode - * @return PHPUnit_Framework_TestSuite - * @since Method available since Release 3.4.0 - */ - protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter=null) - { - if ($testSuiteNode->hasAttribute('name')) { - $suite = new PHPUnit_Framework_TestSuite( - (string) $testSuiteNode->getAttribute('name') - ); - } else { - $suite = new PHPUnit_Framework_TestSuite; - } - - $exclude = array(); - - foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) { - $exclude[] = $this->toAbsolutePath( - (string) $excludeNode->nodeValue - ); - } - - $fileIteratorFacade = new File_Iterator_Facade; - - foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) { - if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) { - continue; - } - - $directory = (string) $directoryNode->nodeValue; - - if (empty($directory)) { - continue; - } - - if ($directoryNode->hasAttribute('phpVersion')) { - $phpVersion = (string) $directoryNode->getAttribute('phpVersion'); - } else { - $phpVersion = PHP_VERSION; - } - - if ($directoryNode->hasAttribute('phpVersionOperator')) { - $phpVersionOperator = (string) $directoryNode->getAttribute('phpVersionOperator'); - } else { - $phpVersionOperator = '>='; - } - - if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) { - continue; - } - - if ($directoryNode->hasAttribute('prefix')) { - $prefix = (string) $directoryNode->getAttribute('prefix'); - } else { - $prefix = ''; - } - - if ($directoryNode->hasAttribute('suffix')) { - $suffix = (string) $directoryNode->getAttribute('suffix'); - } else { - $suffix = 'Test.php'; - } - - $files = $fileIteratorFacade->getFilesAsArray( - $this->toAbsolutePath($directory), - $suffix, - $prefix, - $exclude - ); - $suite->addTestFiles($files); - } - - foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) { - if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) { - continue; - } - - $file = (string) $fileNode->nodeValue; - - if (empty($file)) { - continue; - } - - // Get the absolute path to the file - $file = $fileIteratorFacade->getFilesAsArray( - $this->toAbsolutePath($file) - ); - - if (!isset($file[0])) { - continue; - } - - $file = $file[0]; - - if ($fileNode->hasAttribute('phpVersion')) { - $phpVersion = (string) $fileNode->getAttribute('phpVersion'); - } else { - $phpVersion = PHP_VERSION; - } - - if ($fileNode->hasAttribute('phpVersionOperator')) { - $phpVersionOperator = (string) $fileNode->getAttribute('phpVersionOperator'); - } else { - $phpVersionOperator = '>='; - } - - if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) { - continue; - } - - $suite->addTestFile($file); - } - - return $suite; - } - - /** - * @param string $value - * @param boolean $default - * @return boolean - * @since Method available since Release 3.2.3 - */ - protected function getBoolean($value, $default) - { - if (strtolower($value) == 'false') { - return false; - } elseif (strtolower($value) == 'true') { - return true; - } - - return $default; - } - - /** - * @param string $value - * @param boolean $default - * @return boolean - * @since Method available since Release 3.6.0 - */ - protected function getInteger($value, $default) - { - if (is_numeric($value)) { - return (int) $value; - } - - return $default; - } - - /** - * @param string $query - * @return array - * @since Method available since Release 3.2.3 - */ - protected function readFilterDirectories($query) - { - $directories = array(); - - foreach ($this->xpath->query($query) as $directory) { - if ($directory->hasAttribute('prefix')) { - $prefix = (string) $directory->getAttribute('prefix'); - } else { - $prefix = ''; - } - - if ($directory->hasAttribute('suffix')) { - $suffix = (string) $directory->getAttribute('suffix'); - } else { - $suffix = '.php'; - } - - if ($directory->hasAttribute('group')) { - $group = (string) $directory->getAttribute('group'); - } else { - $group = 'DEFAULT'; - } - - $directories[] = array( - 'path' => $this->toAbsolutePath((string) $directory->nodeValue), - 'prefix' => $prefix, - 'suffix' => $suffix, - 'group' => $group - ); - } - - return $directories; - } - - /** - * @param string $query - * @return array - * @since Method available since Release 3.2.3 - */ - protected function readFilterFiles($query) - { - $files = array(); - - foreach ($this->xpath->query($query) as $file) { - $files[] = $this->toAbsolutePath((string) $file->nodeValue); - } - - return $files; - } - - /** - * @param string $path - * @param boolean $useIncludePath - * @return string - * @since Method available since Release 3.5.0 - */ - protected function toAbsolutePath($path, $useIncludePath = false) - { - if ($path[0] === '/') { - return $path; - } - - // Matches the following on Windows: - // - \\NetworkComputer\Path - // - \\.\D: - // - \\.\c: - // - C:\Windows - // - C:\windows - // - C:/windows - // - c:/windows - if (defined('PHP_WINDOWS_VERSION_BUILD') && - ($path[0] === '\\' || - (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) { - return $path; - } - - // Stream - if (strpos($path, '://') !== false) { - return $path; - } - - $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path; - - if ($useIncludePath && !file_exists($file)) { - $includePathFile = stream_resolve_include_path($path); - - if ($includePathFile) { - $file = $includePathFile; - } - } - - return $file; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * Factory for PHPUnit_Framework_Exception objects that are used to describe - * invalid arguments passed to a function or method. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -class PHPUnit_Util_InvalidArgumentHelper -{ - /** - * @param integer $argument - * @param string $type - * @param mixed $value - * @return PHPUnit_Framework_Exception - */ - public static function factory($argument, $type, $value = null) - { - $stack = debug_backtrace(false); - - return new PHPUnit_Framework_Exception( - sprintf( - 'Argument #%d%sof %s::%s() must be a %s', - $argument, - $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ', - $stack[1]['class'], - $stack[1]['function'], - $type - ) - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * Utility class for blacklisting PHPUnit's own source code files. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Util_Blacklist -{ - /** - * @var array - */ - public static $blacklistedClassNames = array( - 'File_Iterator' => 1, - 'PHP_CodeCoverage' => 1, - 'PHP_Invoker' => 1, - 'PHP_Timer' => 1, - 'PHP_Token' => 1, - 'PHPUnit_Framework_TestCase' => 2, - 'PHPUnit_Extensions_Database_TestCase' => 2, - 'PHPUnit_Framework_MockObject_Generator' => 2, - 'PHPUnit_Extensions_SeleniumTestCase' => 2, - 'PHPUnit_Extensions_Story_TestCase' => 2, - 'Text_Template' => 1, - 'Symfony\Component\Yaml\Yaml' => 1, - 'SebastianBergmann\Diff\Diff' => 1, - 'SebastianBergmann\Environment\Runtime' => 1, - 'SebastianBergmann\Comparator\Comparator' => 1, - 'SebastianBergmann\Exporter\Exporter' => 1, - 'SebastianBergmann\Version' => 1, - 'Composer\Autoload\ClassLoader' => 1 - ); - - /** - * @var array - */ - private static $directories; - - /** - * @return array - * @since Method available since Release 4.1.0 - */ - public function getBlacklistedDirectories() - { - $this->initialize(); - - return self::$directories; - } - - /** - * @param string $file - * @return boolean - */ - public function isBlacklisted($file) - { - if (defined('PHPUNIT_TESTSUITE')) { - return false; - } - - $this->initialize(); - - foreach (self::$directories as $directory) { - if (strpos($file, $directory) === 0) { - return true; - } - } - - return false; - } - - private function initialize() - { - if (self::$directories === null) { - self::$directories = array(); - - foreach (self::$blacklistedClassNames as $className => $parent) { - if (!class_exists($className)) { - continue; - } - - $reflector = new ReflectionClass($className); - $directory = $reflector->getFileName(); - - for ($i = 0; $i < $parent; $i++) { - $directory = dirname($directory); - } - - self::$directories[] = $directory; - } - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * Prettifies class and method names for use in TestDox documentation. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.1.0 - */ -class PHPUnit_Util_TestDox_NamePrettifier -{ - /** - * @var string - */ - protected $prefix = 'Test'; - - /** - * @var string - */ - protected $suffix = 'Test'; - - /** - * @var array - */ - protected $strings = array(); - - /** - * Prettifies the name of a test class. - * - * @param string $name - * @return string - */ - public function prettifyTestClass($name) - { - $title = $name; - - if ($this->suffix !== null && - $this->suffix == substr($name, -1 * strlen($this->suffix))) { - $title = substr($title, 0, strripos($title, $this->suffix)); - } - - if ($this->prefix !== null && - $this->prefix == substr($name, 0, strlen($this->prefix))) { - $title = substr($title, strlen($this->prefix)); - } - - return str_replace('\\', '', $title); - } - - /** - * Prettifies the name of a test method. - * - * @param string $name - * @return string - */ - public function prettifyTestMethod($name) - { - $buffer = ''; - - if (!is_string($name) || strlen($name) == 0) { - return $buffer; - } - - $string = preg_replace('#\d+$#', '', $name, -1, $count); - - if (in_array($string, $this->strings)) { - $name = $string; - } elseif ($count == 0) { - $this->strings[] = $string; - } - - if (strpos($name, '_') !== false) { - return str_replace('_', ' ', $name); - } - - $max = strlen($name); - - if (substr($name, 0, 4) == 'test') { - $offset = 4; - } else { - $offset = 0; - $name[0] = strtoupper($name[0]); - } - - $wasNumeric = false; - - for ($i = $offset; $i < $max; $i++) { - if ($i > $offset && - ord($name[$i]) >= 65 && - ord($name[$i]) <= 90) { - $buffer .= ' ' . strtolower($name[$i]); - } else { - $isNumeric = is_numeric($name[$i]); - - if (!$wasNumeric && $isNumeric) { - $buffer .= ' '; - $wasNumeric = true; - } - - if ($wasNumeric && !$isNumeric) { - $wasNumeric = false; - } - - $buffer .= $name[$i]; - } - } - - return $buffer; - } - - /** - * Sets the prefix of test names. - * - * @param string $prefix - */ - public function setPrefix($prefix) - { - $this->prefix = $prefix; - } - - /** - * Sets the suffix of test names. - * - * @param string $suffix - */ - public function setSuffix($suffix) - { - $this->suffix = $suffix; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * Base class for printers of TestDox documentation. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.1.0 - */ -abstract class PHPUnit_Util_TestDox_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener -{ - /** - * @var PHPUnit_Util_TestDox_NamePrettifier - */ - protected $prettifier; - - /** - * @var string - */ - protected $testClass = ''; - - /** - * @var integer - */ - protected $testStatus = false; - - /** - * @var array - */ - protected $tests = array(); - - /** - * @var integer - */ - protected $successful = 0; - - /** - * @var integer - */ - protected $failed = 0; - - /** - * @var integer - */ - protected $risky = 0; - - /** - * @var integer - */ - protected $skipped = 0; - - /** - * @var integer - */ - protected $incomplete = 0; - - /** - * @var string - */ - protected $testTypeOfInterest = 'PHPUnit_Framework_TestCase'; - - /** - * @var string - */ - protected $currentTestClassPrettified; - - /** - * @var string - */ - protected $currentTestMethodPrettified; - - /** - * Constructor. - * - * @param resource $out - */ - public function __construct($out = null) - { - parent::__construct($out); - - $this->prettifier = new PHPUnit_Util_TestDox_NamePrettifier; - $this->startRun(); - } - - /** - * Flush buffer and close output. - * - */ - public function flush() - { - $this->doEndClass(); - $this->endRun(); - - parent::flush(); - } - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR; - $this->failed++; - } - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; - $this->failed++; - } - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE; - $this->incomplete++; - } - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_RISKY; - $this->risky++; - } - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED; - $this->skipped++; - } - } - - /** - * A testsuite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A testsuite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - if ($test instanceof $this->testTypeOfInterest) { - $class = get_class($test); - - if ($this->testClass != $class) { - if ($this->testClass != '') { - $this->doEndClass(); - } - - $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class); - $this->startClass($class); - - $this->testClass = $class; - $this->tests = array(); - } - - $prettified = false; - - if ($test instanceof PHPUnit_Framework_TestCase && - !$test instanceof PHPUnit_Framework_Warning) { - $annotations = $test->getAnnotations(); - - if (isset($annotations['method']['testdox'][0])) { - $this->currentTestMethodPrettified = $annotations['method']['testdox'][0]; - $prettified = true; - } - } - - if (!$prettified) { - $this->currentTestMethodPrettified = $this->prettifier->prettifyTestMethod($test->getName(false)); - } - - $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED; - } - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if ($test instanceof $this->testTypeOfInterest) { - if (!isset($this->tests[$this->currentTestMethodPrettified])) { - if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { - $this->tests[$this->currentTestMethodPrettified]['success'] = 1; - $this->tests[$this->currentTestMethodPrettified]['failure'] = 0; - } else { - $this->tests[$this->currentTestMethodPrettified]['success'] = 0; - $this->tests[$this->currentTestMethodPrettified]['failure'] = 1; - } - } else { - if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { - $this->tests[$this->currentTestMethodPrettified]['success']++; - } else { - $this->tests[$this->currentTestMethodPrettified]['failure']++; - } - } - - $this->currentTestClassPrettified = null; - $this->currentTestMethodPrettified = null; - } - } - - /** - * @since Method available since Release 2.3.0 - */ - protected function doEndClass() - { - foreach ($this->tests as $name => $data) { - $this->onTest($name, $data['failure'] == 0); - } - - $this->endClass($this->testClass); - } - - /** - * Handler for 'start run' event. - * - */ - protected function startRun() - { - } - - /** - * Handler for 'start class' event. - * - * @param string $name - */ - protected function startClass($name) - { - } - - /** - * Handler for 'on test' event. - * - * @param string $name - * @param boolean $success - */ - protected function onTest($name, $success = true) - { - } - - /** - * Handler for 'end class' event. - * - * @param string $name - */ - protected function endClass($name) - { - } - - /** - * Handler for 'end run' event. - * - */ - protected function endRun() - { - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * Prints TestDox documentation in HTML format. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.1.0 - */ -class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter -{ - /** - * @var boolean - */ - protected $printsHTML = true; - - /** - * Handler for 'start run' event. - * - */ - protected function startRun() - { - $this->write(''); - } - - /** - * Handler for 'start class' event. - * - * @param string $name - */ - protected function startClass($name) - { - $this->write( - '

    ' . $this->currentTestClassPrettified . - '

      ' - ); - } - - /** - * Handler for 'on test' event. - * - * @param string $name - * @param boolean $success - */ - protected function onTest($name, $success = true) - { - if (!$success) { - $strikeOpen = ''; - $strikeClose = ''; - } else { - $strikeOpen = ''; - $strikeClose = ''; - } - - $this->write('
    • ' . $strikeOpen . $name . $strikeClose . '
    • '); - } - - /** - * Handler for 'end class' event. - * - * @param string $name - */ - protected function endClass($name) - { - $this->write('
    '); - } - - /** - * Handler for 'end run' event. - * - */ - protected function endRun() - { - $this->write(''); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -/** - * Prints TestDox documentation in text format. - * - * @package PHPUnit - * @subpackage Util_TestDox - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.1.0 - */ -class PHPUnit_Util_TestDox_ResultPrinter_Text extends PHPUnit_Util_TestDox_ResultPrinter -{ - /** - * Handler for 'start class' event. - * - * @param string $name - */ - protected function startClass($name) - { - $this->write($this->currentTestClassPrettified . "\n"); - } - - /** - * Handler for 'on test' event. - * - * @param string $name - * @param boolean $success - */ - protected function onTest($name, $success = true) - { - if ($success) { - $this->write(' [x] '); - } else { - $this->write(' [ ] '); - } - - $this->write($name . "\n"); - } - - /** - * Handler for 'end class' event. - * - * @param string $name - */ - protected function endClass($name) - { - $this->write("\n"); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.3.0 - */ - -// Workaround for http://bugs.php.net/bug.php?id=47987, -// see https://github.com/sebastianbergmann/phpunit/issues#issue/125 for details -require_once __DIR__ . '/../Framework/Error.php'; -require_once __DIR__ . '/../Framework/Error/Notice.php'; -require_once __DIR__ . '/../Framework/Error/Warning.php'; -require_once __DIR__ . '/../Framework/Error/Deprecated.php'; - -/** - * Error handler that converts PHP errors and warnings to exceptions. - * - * @package PHPUnit - * @subpackage Util - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Util_ErrorHandler -{ - protected static $errorStack = array(); - - /** - * Returns the error stack. - * - * @return array - */ - public static function getErrorStack() - { - return self::$errorStack; - } - - /** - * @param integer $errno - * @param string $errstr - * @param string $errfile - * @param integer $errline - * @throws PHPUnit_Framework_Error - */ - public static function handleError($errno, $errstr, $errfile, $errline) - { - if (!($errno & error_reporting())) { - return false; - } - - self::$errorStack[] = array($errno, $errstr, $errfile, $errline); - - $trace = debug_backtrace(false); - array_shift($trace); - - foreach ($trace as $frame) { - if ($frame['function'] == '__toString') { - return false; - } - } - - if ($errno == E_NOTICE || $errno == E_USER_NOTICE || $errno == E_STRICT) { - if (PHPUnit_Framework_Error_Notice::$enabled !== true) { - return false; - } - - $exception = 'PHPUnit_Framework_Error_Notice'; - } elseif ($errno == E_WARNING || $errno == E_USER_WARNING) { - if (PHPUnit_Framework_Error_Warning::$enabled !== true) { - return false; - } - - $exception = 'PHPUnit_Framework_Error_Warning'; - } elseif ($errno == E_DEPRECATED || $errno == E_USER_DEPRECATED) { - if (PHPUnit_Framework_Error_Deprecated::$enabled !== true) { - return false; - } - - $exception = 'PHPUnit_Framework_Error_Deprecated'; - } else { - $exception = 'PHPUnit_Framework_Error'; - } - - throw new $exception($errstr, $errno, $errfile, $errline); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.0.0 - */ - -/** - * A TestRunner for the Command Line Interface (CLI) - * PHP SAPI Module. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.0.0 - */ -class PHPUnit_TextUI_Command -{ - /** - * @var array - */ - protected $arguments = array( - 'listGroups' => false, - 'loader' => null, - 'useDefaultConfiguration' => true - ); - - /** - * @var array - */ - protected $options = array(); - - /** - * @var array - */ - protected $longOptions = array( - 'colors' => null, - 'bootstrap=' => null, - 'configuration=' => null, - 'coverage-clover=' => null, - 'coverage-crap4j=' => null, - 'coverage-html=' => null, - 'coverage-php=' => null, - 'coverage-text==' => null, - 'coverage-xml=' => null, - 'debug' => null, - 'exclude-group=' => null, - 'filter=' => null, - 'testsuite=' => null, - 'group=' => null, - 'help' => null, - 'include-path=' => null, - 'list-groups' => null, - 'loader=' => null, - 'log-json=' => null, - 'log-junit=' => null, - 'log-tap=' => null, - 'process-isolation' => null, - 'repeat=' => null, - 'stderr' => null, - 'stop-on-error' => null, - 'stop-on-failure' => null, - 'stop-on-incomplete' => null, - 'stop-on-risky' => null, - 'stop-on-skipped' => null, - 'report-useless-tests' => null, - 'strict-coverage' => null, - 'disallow-test-output' => null, - 'enforce-time-limit' => null, - 'strict' => null, - 'tap' => null, - 'testdox' => null, - 'testdox-html=' => null, - 'testdox-text=' => null, - 'test-suffix=' => null, - 'no-configuration' => null, - 'no-globals-backup' => null, - 'printer=' => null, - 'static-backup' => null, - 'verbose' => null, - 'version' => null - ); - - /** - * @param boolean $exit - */ - public static function main($exit = true) - { - $command = new static; - - return $command->run($_SERVER['argv'], $exit); - } - - /** - * @param array $argv - * @param boolean $exit - */ - public function run(array $argv, $exit = true) - { - $this->handleArguments($argv); - - $runner = $this->createRunner(); - - if (is_object($this->arguments['test']) && - $this->arguments['test'] instanceof PHPUnit_Framework_Test) { - $suite = $this->arguments['test']; - } else { - $suite = $runner->getTest( - $this->arguments['test'], - $this->arguments['testFile'], - $this->arguments['testSuffixes'] - ); - } - - if ($this->arguments['listGroups']) { - PHPUnit_TextUI_TestRunner::printVersionString(); - - print "Available test group(s):\n"; - - $groups = $suite->getGroups(); - sort($groups); - - foreach ($groups as $group) { - print " - $group\n"; - } - - if ($exit) { - exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); - } else { - return PHPUnit_TextUI_TestRunner::SUCCESS_EXIT; - } - } - - unset($this->arguments['test']); - unset($this->arguments['testFile']); - - try { - $result = $runner->doRun($suite, $this->arguments); - } catch (PHPUnit_Framework_Exception $e) { - print $e->getMessage() . "\n"; - } - - $ret = PHPUnit_TextUI_TestRunner::FAILURE_EXIT; - - if (isset($result) && $result->wasSuccessful()) { - $ret = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT; - } elseif (!isset($result) || $result->errorCount() > 0) { - $ret = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT; - } - - if ($exit) { - exit($ret); - } else { - return $ret; - } - } - - /** - * Create a TestRunner, override in subclasses. - * - * @return PHPUnit_TextUI_TestRunner - * @since Method available since Release 3.6.0 - */ - protected function createRunner() - { - return new PHPUnit_TextUI_TestRunner($this->arguments['loader']); - } - - /** - * Handles the command-line arguments. - * - * A child class of PHPUnit_TextUI_Command can hook into the argument - * parsing by adding the switch(es) to the $longOptions array and point to a - * callback method that handles the switch(es) in the child class like this - * - * - * longOptions['my-switch'] = 'myHandler'; - * // my-secondswitch will accept a value - note the equals sign - * $this->longOptions['my-secondswitch='] = 'myOtherHandler'; - * } - * - * // --my-switch -> myHandler() - * protected function myHandler() - * { - * } - * - * // --my-secondswitch foo -> myOtherHandler('foo') - * protected function myOtherHandler ($value) - * { - * } - * - * // You will also need this - the static keyword in the - * // PHPUnit_TextUI_Command will mean that it'll be - * // PHPUnit_TextUI_Command that gets instantiated, - * // not MyCommand - * public static function main($exit = true) - * { - * $command = new static; - * - * return $command->run($_SERVER['argv'], $exit); - * } - * - * } - * - * - * @param array $argv - */ - protected function handleArguments(array $argv) - { - if (defined('__PHPUNIT_PHAR__')) { - $this->longOptions['self-update'] = null; - } - - try { - $this->options = PHPUnit_Util_Getopt::getopt( - $argv, - 'd:c:hv', - array_keys($this->longOptions) - ); - } catch (PHPUnit_Framework_Exception $e) { - PHPUnit_TextUI_TestRunner::showError($e->getMessage()); - } - - foreach ($this->options[0] as $option) { - switch ($option[0]) { - case '--colors': { - $this->arguments['colors'] = true; - } - break; - - case '--bootstrap': { - $this->arguments['bootstrap'] = $option[1]; - } - break; - - case 'c': - case '--configuration': { - $this->arguments['configuration'] = $option[1]; - } - break; - - case '--coverage-clover': { - $this->arguments['coverageClover'] = $option[1]; - } - break; - - case '--coverage-crap4j': { - $this->arguments['coverageCrap4J'] = $option[1]; - } - break; - - case '--coverage-html': { - $this->arguments['coverageHtml'] = $option[1]; - } - break; - - case '--coverage-php': { - $this->arguments['coveragePHP'] = $option[1]; - } - break; - - case '--coverage-text': { - if ($option[1] === null) { - $option[1] = 'php://stdout'; - } - - $this->arguments['coverageText'] = $option[1]; - $this->arguments['coverageTextShowUncoveredFiles'] = false; - $this->arguments['coverageTextShowOnlySummary'] = false; - } - break; - - case '--coverage-xml': { - $this->arguments['coverageXml'] = $option[1]; - } - break; - - case 'd': { - $ini = explode('=', $option[1]); - - if (isset($ini[0])) { - if (isset($ini[1])) { - ini_set($ini[0], $ini[1]); - } else { - ini_set($ini[0], true); - } - } - } - break; - - case '--debug': { - $this->arguments['debug'] = true; - } - break; - - case 'h': - case '--help': { - $this->showHelp(); - exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); - } - break; - - case '--filter': { - $this->arguments['filter'] = $option[1]; - } - break; - - case '--testsuite': { - $this->arguments['testsuite'] = $option[1]; - } - break; - - case '--group': { - $this->arguments['groups'] = explode(',', $option[1]); - } - break; - - case '--exclude-group': { - $this->arguments['excludeGroups'] = explode( - ',', $option[1] - ); - } - break; - - case '--test-suffix': { - $this->arguments['testSuffixes'] = explode( - ',', $option[1] - ); - } - break; - - case '--include-path': { - $includePath = $option[1]; - } - break; - - case '--list-groups': { - $this->arguments['listGroups'] = true; - } - break; - - case '--printer': { - $this->arguments['printer'] = $option[1]; - } - break; - - case '--loader': { - $this->arguments['loader'] = $option[1]; - } - break; - - case '--log-json': { - $this->arguments['jsonLogfile'] = $option[1]; - } - break; - - case '--log-junit': { - $this->arguments['junitLogfile'] = $option[1]; - } - break; - - case '--log-tap': { - $this->arguments['tapLogfile'] = $option[1]; - } - break; - - case '--process-isolation': { - $this->arguments['processIsolation'] = true; - } - break; - - case '--repeat': { - $this->arguments['repeat'] = (int) $option[1]; - } - break; - - case '--stderr': { - $this->arguments['stderr'] = true; - } - break; - - case '--stop-on-error': { - $this->arguments['stopOnError'] = true; - } - break; - - case '--stop-on-failure': { - $this->arguments['stopOnFailure'] = true; - } - break; - - case '--stop-on-incomplete': { - $this->arguments['stopOnIncomplete'] = true; - } - break; - - case '--stop-on-risky': { - $this->arguments['stopOnRisky'] = true; - } - break; - - case '--stop-on-skipped': { - $this->arguments['stopOnSkipped'] = true; - } - break; - - case '--tap': { - $this->arguments['printer'] = new PHPUnit_Util_Log_TAP; - } - break; - - case '--testdox': { - $this->arguments['printer'] = new PHPUnit_Util_TestDox_ResultPrinter_Text; - } - break; - - case '--testdox-html': { - $this->arguments['testdoxHTMLFile'] = $option[1]; - } - break; - - case '--testdox-text': { - $this->arguments['testdoxTextFile'] = $option[1]; - } - break; - - case '--no-configuration': { - $this->arguments['useDefaultConfiguration'] = false; - } - break; - - case '--no-globals-backup': { - $this->arguments['backupGlobals'] = false; - } - break; - - case '--static-backup': { - $this->arguments['backupStaticAttributes'] = true; - } - break; - - case 'v': - case '--verbose': { - $this->arguments['verbose'] = true; - } - break; - - case '--version': { - PHPUnit_TextUI_TestRunner::printVersionString(); - exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); - } - break; - - case '--report-useless-tests': { - $this->arguments['reportUselessTests'] = true; - } - break; - - case '--strict-coverage': { - $this->arguments['strictCoverage'] = true; - } - break; - - case '--disallow-test-output': { - $this->arguments['disallowTestOutput'] = true; - } - break; - - case '--enforce-time-limit': { - $this->arguments['enforceTimeLimit'] = true; - } - break; - - case '--strict': { - $this->arguments['reportUselessTests'] = true; - $this->arguments['strictCoverage'] = true; - $this->arguments['disallowTestOutput'] = true; - $this->arguments['enforceTimeLimit'] = true; - } - break; - - case '--self-update': { - $this->handleSelfUpdate(); - } - break; - - default: { - $optionName = str_replace('--', '', $option[0]); - - if (isset($this->longOptions[$optionName])) { - $handler = $this->longOptions[$optionName]; - } elseif (isset($this->longOptions[$optionName . '='])) { - $handler = $this->longOptions[$optionName . '=']; - } - - if (isset($handler) && is_callable(array($this, $handler))) { - $this->$handler($option[1]); - } - } - } - } - - $this->handleCustomTestSuite(); - - if (!isset($this->arguments['test'])) { - - if (isset($this->options[1][0])) { - $this->arguments['test'] = $this->options[1][0]; - } - - if (isset($this->options[1][1])) { - $this->arguments['testFile'] = realpath($this->options[1][1]); - } else { - $this->arguments['testFile'] = ''; - } - - if (isset($this->arguments['test']) && - is_file($this->arguments['test']) && - substr($this->arguments['test'], -5, 5) != '.phpt') { - $this->arguments['testFile'] = realpath($this->arguments['test']); - $this->arguments['test'] = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.')); - } - } - - if (!isset($this->arguments['testSuffixes'])) { - $this->arguments['testSuffixes'] = array('Test.php', '.phpt'); - } - - if (isset($includePath)) { - ini_set( - 'include_path', - $includePath . PATH_SEPARATOR . ini_get('include_path') - ); - } - - if (isset($this->arguments['bootstrap'])) { - $this->handleBootstrap($this->arguments['bootstrap']); - } - - if (isset($this->arguments['printer']) && - is_string($this->arguments['printer'])) { - $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']); - } - - if ($this->arguments['loader'] !== null) { - $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']); - } - - if (isset($this->arguments['configuration']) && - is_dir($this->arguments['configuration'])) { - $configurationFile = $this->arguments['configuration'] . - '/phpunit.xml'; - - if (file_exists($configurationFile)) { - $this->arguments['configuration'] = realpath( - $configurationFile - ); - } elseif (file_exists($configurationFile . '.dist')) { - $this->arguments['configuration'] = realpath( - $configurationFile . '.dist' - ); - } - } elseif (!isset($this->arguments['configuration']) && - $this->arguments['useDefaultConfiguration']) { - if (file_exists('phpunit.xml')) { - $this->arguments['configuration'] = realpath('phpunit.xml'); - } elseif (file_exists('phpunit.xml.dist')) { - $this->arguments['configuration'] = realpath( - 'phpunit.xml.dist' - ); - } - } - - if (isset($this->arguments['configuration'])) { - try { - $configuration = PHPUnit_Util_Configuration::getInstance( - $this->arguments['configuration'] - ); - } catch (Exception $e) { - print $e->getMessage() . "\n"; - exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT); - } - - $phpunit = $configuration->getPHPUnitConfiguration(); - - $configuration->handlePHPConfiguration(); - - if (!isset($this->arguments['bootstrap']) && isset($phpunit['bootstrap'])) { - $this->handleBootstrap($phpunit['bootstrap']); - } - - /** - * Issue #657 - */ - if (isset($phpunit['stderr']) && $phpunit['stderr'] == true) { - $this->arguments['printer'] = new PHPUnit_TextUI_ResultPrinter( - 'php://stderr', - isset($this->arguments['verbose']) ? $this->arguments['verbose'] : FALSE - ); - } - - if (isset($phpunit['printerClass'])) { - if (isset($phpunit['printerFile'])) { - $file = $phpunit['printerFile']; - } else { - $file = ''; - } - - $this->arguments['printer'] = $this->handlePrinter( - $phpunit['printerClass'], $file - ); - } - - if (isset($phpunit['testSuiteLoaderClass'])) { - if (isset($phpunit['testSuiteLoaderFile'])) { - $file = $phpunit['testSuiteLoaderFile']; - } else { - $file = ''; - } - - $this->arguments['loader'] = $this->handleLoader( - $phpunit['testSuiteLoaderClass'], $file - ); - } - - $browsers = $configuration->getSeleniumBrowserConfiguration(); - - if (!empty($browsers) && - class_exists('PHPUnit_Extensions_SeleniumTestCase')) { - PHPUnit_Extensions_SeleniumTestCase::$browsers = $browsers; - } - - if (!isset($this->arguments['test'])) { - $testSuite = $configuration->getTestSuiteConfiguration(isset($this->arguments['testsuite']) ? $this->arguments['testsuite'] : null); - - if ($testSuite !== null) { - $this->arguments['test'] = $testSuite; - } - } - } - - if (isset($this->arguments['test']) && is_string($this->arguments['test']) && substr($this->arguments['test'], -5, 5) == '.phpt') { - $test = new PHPUnit_Extensions_PhptTestCase($this->arguments['test']); - - $this->arguments['test'] = new PHPUnit_Framework_TestSuite; - $this->arguments['test']->addTest($test); - } - - if (!isset($this->arguments['test']) || - (isset($this->arguments['testDatabaseLogRevision']) && !isset($this->arguments['testDatabaseDSN']))) { - $this->showHelp(); - exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); - } - } - - /** - * Handles the loading of the PHPUnit_Runner_TestSuiteLoader implementation. - * - * @param string $loaderClass - * @param string $loaderFile - * @return PHPUnit_Runner_TestSuiteLoader - */ - protected function handleLoader($loaderClass, $loaderFile = '') - { - if (!class_exists($loaderClass, false)) { - if ($loaderFile == '') { - $loaderFile = PHPUnit_Util_Filesystem::classNameToFilename( - $loaderClass - ); - } - - $loaderFile = stream_resolve_include_path($loaderFile); - - if ($loaderFile) { - require $loaderFile; - } - } - - if (class_exists($loaderClass, false)) { - $class = new ReflectionClass($loaderClass); - - if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') && - $class->isInstantiable()) { - $loader = $class->newInstance(); - } - } - - if (!isset($loader)) { - PHPUnit_TextUI_TestRunner::showError( - sprintf( - 'Could not use "%s" as loader.', - - $loaderClass - ) - ); - } - - return $loader; - } - - /** - * Handles the loading of the PHPUnit_Util_Printer implementation. - * - * @param string $printerClass - * @param string $printerFile - * @return PHPUnit_Util_Printer - */ - protected function handlePrinter($printerClass, $printerFile = '') - { - if (!class_exists($printerClass, false)) { - if ($printerFile == '') { - $printerFile = PHPUnit_Util_Filesystem::classNameToFilename( - $printerClass - ); - } - - $printerFile = stream_resolve_include_path($printerFile); - - if ($printerFile) { - require $printerFile; - } - } - - if (class_exists($printerClass)) { - $class = new ReflectionClass($printerClass); - - if ($class->implementsInterface('PHPUnit_Framework_TestListener') && - $class->isSubclassOf('PHPUnit_Util_Printer') && - $class->isInstantiable()) { - if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) { - return $printerClass; - } - - $printer = $class->newInstance(); - } - } - - if (!isset($printer)) { - PHPUnit_TextUI_TestRunner::showError( - sprintf( - 'Could not use "%s" as printer.', - - $printerClass - ) - ); - } - - return $printer; - } - - /** - * Loads a bootstrap file. - * - * @param string $filename - */ - protected function handleBootstrap($filename) - { - try { - PHPUnit_Util_Fileloader::checkAndLoad($filename); - } catch (PHPUnit_Framework_Exception $e) { - PHPUnit_TextUI_TestRunner::showError($e->getMessage()); - } - } - - /** - * @since Method available since Release 4.0.0 - */ - protected function handleSelfUpdate() - { - PHPUnit_TextUI_TestRunner::printVersionString(); - - if (!extension_loaded('openssl')) { - print "The OpenSSL extension is not loaded.\n"; - exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); - } - - $remoteFilename = sprintf( - 'https://phar.phpunit.de/phpunit%s.phar', - PHPUnit_Runner_Version::getReleaseChannel() - ); - - $localFilename = realpath($_SERVER['argv'][0]); - $tempFilename = basename($localFilename, '.phar') . '-temp.phar'; - - // Workaround for https://bugs.php.net/bug.php?id=65538 - $caFile = dirname($tempFilename) . '/ca.pem'; - copy(__PHPUNIT_PHAR_ROOT__ . '/ca.pem', $caFile); - - print 'Updating the PHPUnit PHAR ... '; - - $options = array( - 'ssl' => array( - 'allow_self_signed' => false, - 'cafile' => $caFile, - 'verify_peer' => true - ) - ); - - if (PHP_VERSION_ID < 50600) { - $options['ssl']['CN_match'] = 'phar.phpunit.de'; - $options['ssl']['SNI_server_name'] = 'phar.phpunit.de'; - } - - file_put_contents( - $tempFilename, - file_get_contents( - $remoteFilename, - false, - stream_context_create($options) - ) - ); - - chmod($tempFilename, 0777 & ~umask()); - - try { - $phar = new Phar($tempFilename); - unset($phar); - rename($tempFilename, $localFilename); - unlink($caFile); - } catch (Exception $e) { - unlink($caFile); - unlink($tempFilename); - print " done\n\n" . $e->getMessage() . "\n"; - exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); - } - - print " done\n"; - exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); - } - - /** - * Show the help message. - */ - protected function showHelp() - { - PHPUnit_TextUI_TestRunner::printVersionString(); - - print << - -Code Coverage Options: - - --coverage-clover Generate code coverage report in Clover XML format. - --coverage-crap4j Generate code coverage report in Crap4J XML format. - --coverage-html Generate code coverage report in HTML format. - --coverage-php Export PHP_CodeCoverage object to file. - --coverage-text= Generate code coverage report in text format. - Default: Standard output. - --coverage-xml Generate code coverage report in PHPUnit XML format. - -Logging Options: - - --log-junit Log test execution in JUnit XML format to file. - --log-tap Log test execution in TAP format to file. - --log-json Log test execution in JSON format. - --testdox-html Write agile documentation in HTML format to file. - --testdox-text Write agile documentation in Text format to file. - -Test Selection Options: - - --filter Filter which tests to run. - --testsuite Filter which testsuite to run. - --group ... Only runs tests from the specified group(s). - --exclude-group ... Exclude tests from the specified group(s). - --list-groups List available test groups. - --test-suffix ... Only search for test in files with specified - suffix(es). Default: Test.php,.phpt - -Test Execution Options: - - --report-useless-tests Be strict about tests that do not test anything. - --strict-coverage Be strict about unintentionally covered code. - --disallow-test-output Be strict about output during tests. - --enforce-time-limit Enforce time limit based on test size. - --strict Run tests in strict mode (enables all of the above). - - --process-isolation Run each test in a separate PHP process. - --no-globals-backup Do not backup and restore \$GLOBALS for each test. - --static-backup Backup and restore static attributes for each test. - - --colors Use colors in output. - --stderr Write to STDERR instead of STDOUT. - --stop-on-error Stop execution upon first error. - --stop-on-failure Stop execution upon first error or failure. - --stop-on-risky Stop execution upon first risky test. - --stop-on-skipped Stop execution upon first skipped test. - --stop-on-incomplete Stop execution upon first incomplete test. - -v|--verbose Output more verbose information. - --debug Display debugging information during test execution. - - --loader TestSuiteLoader implementation to use. - --repeat Runs the test(s) repeatedly. - --tap Report test execution progress in TAP format. - --testdox Report test execution progress in TestDox format. - --printer TestSuiteListener implementation to use. - -Configuration Options: - - --bootstrap A "bootstrap" PHP file that is run before the tests. - -c|--configuration Read configuration from XML file. - --no-configuration Ignore default configuration file (phpunit.xml). - --include-path Prepend PHP's include_path with given path(s). - -d key[=value] Sets a php.ini value. - -Miscellaneous Options: - - -h|--help Prints this usage information. - --version Prints the version and exits. - -EOT; - - if (defined('__PHPUNIT_PHAR__')) { - print "\n --self-update Update PHPUnit to the latest version.\n"; - } - } - - /** - * Custom callback for test suite discovery. - */ - protected function handleCustomTestSuite() - { - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Prints the result of a TextUI TestRunner run. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_TextUI_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener -{ - const EVENT_TEST_START = 0; - const EVENT_TEST_END = 1; - const EVENT_TESTSUITE_START = 2; - const EVENT_TESTSUITE_END = 3; - - /** - * @var array - */ - private static $ansiCodes = array( - 'bold' => 1, - 'fg-black' => 30, - 'fg-red' => 31, - 'fg-yellow' => 33, - 'fg-cyan' => 36, - 'fg-white' => 37, - 'bg-red' => 41, - 'bg-green' => 42, - 'bg-yellow' => 43 - ); - - /** - * @var integer - */ - protected $column = 0; - - /** - * @var integer - */ - protected $maxColumn; - - /** - * @var boolean - */ - protected $lastTestFailed = false; - - /** - * @var integer - */ - protected $numAssertions = 0; - - /** - * @var integer - */ - protected $numTests = -1; - - /** - * @var integer - */ - protected $numTestsRun = 0; - - /** - * @var integer - */ - protected $numTestsWidth; - - /** - * @var boolean - */ - protected $colors = false; - - /** - * @var boolean - */ - protected $debug = false; - - /** - * @var boolean - */ - protected $verbose = false; - - /** - * Constructor. - * - * @param mixed $out - * @param boolean $verbose - * @param boolean $colors - * @param boolean $debug - * @throws PHPUnit_Framework_Exception - * @since Method available since Release 3.0.0 - */ - public function __construct($out = null, $verbose = false, $colors = false, $debug = false) - { - parent::__construct($out); - - if (is_bool($verbose)) { - $this->verbose = $verbose; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean'); - } - - if (is_bool($colors)) { - $this->colors = $colors; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean'); - } - - if (is_bool($debug)) { - $this->debug = $debug; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean'); - } - } - - /** - * @param PHPUnit_Framework_TestResult $result - */ - public function printResult(PHPUnit_Framework_TestResult $result) - { - $this->printHeader(); - - $this->printErrors($result); - $printSeparator = $result->errorCount() > 0; - - if ($printSeparator && $result->failureCount() > 0) { - $this->write("\n--\n\n"); - } - - $printSeparator = $printSeparator || $result->failureCount() > 0; - $this->printFailures($result); - - if ($this->verbose) { - if ($printSeparator && $result->deprecatedFeaturesCount() > 0) { - $this->write("\n--\n\n"); - } - - $printSeparator = $printSeparator || - $result->deprecatedFeaturesCount() > 0; - - $this->printDeprecated($result); - - if ($printSeparator && $result->riskyCount() > 0) { - $this->write("\n--\n\n"); - } - - $printSeparator = $printSeparator || - $result->riskyCount() > 0; - - $this->printRisky($result); - - if ($printSeparator && $result->notImplementedCount() > 0) { - $this->write("\n--\n\n"); - } - - $printSeparator = $printSeparator || - $result->notImplementedCount() > 0; - - $this->printIncompletes($result); - - if ($printSeparator && $result->skippedCount() > 0) { - $this->write("\n--\n\n"); - } - - $this->printSkipped($result); - } - - $this->printFooter($result); - } - - /** - * @param array $defects - * @param string $type - */ - protected function printDefects(array $defects, $type) - { - $count = count($defects); - - if ($count == 0) { - return; - } - - $this->write( - sprintf( - "There %s %d %s%s:\n", - - ($count == 1) ? 'was' : 'were', - $count, - $type, - ($count == 1) ? '' : 's' - ) - ); - - $i = 1; - - foreach ($defects as $defect) { - $this->printDefect($defect, $i++); - } - } - - /** - * @param PHPUnit_Framework_TestFailure $defect - * @param integer $count - */ - protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count) - { - $this->printDefectHeader($defect, $count); - $this->printDefectTrace($defect); - } - - /** - * @param PHPUnit_Framework_TestFailure $defect - * @param integer $count - */ - protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count) - { - $failedTest = $defect->failedTest(); - - if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) { - $testName = $failedTest->toString(); - } else { - $testName = get_class($failedTest); - } - - $this->write( - sprintf( - "\n%d) %s\n", - - $count, - $testName - ) - ); - } - - /** - * @param PHPUnit_Framework_TestFailure $defect - */ - protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect) - { - $this->write($defect->getExceptionAsString()); - - $trace = PHPUnit_Util_Filter::getFilteredStacktrace( - $defect->thrownException() - ); - - if (!empty($trace)) { - $this->write("\n" . $trace); - } - - $e = $defect->thrownException()->getPrevious(); - - while ($e) { - $this->write( - "\nCaused by\n" . - PHPUnit_Framework_TestFailure::exceptionToString($e). "\n" . - PHPUnit_Util_Filter::getFilteredStacktrace($e) - ); - - $e = $e->getPrevious(); - } - } - - /** - * @param PHPUnit_Framework_TestResult $result - */ - protected function printErrors(PHPUnit_Framework_TestResult $result) - { - $this->printDefects($result->errors(), 'error'); - } - - /** - * @param PHPUnit_Framework_TestResult $result - */ - protected function printFailures(PHPUnit_Framework_TestResult $result) - { - $this->printDefects($result->failures(), 'failure'); - } - - /** - * @param PHPUnit_Framework_TestResult $result - */ - protected function printIncompletes(PHPUnit_Framework_TestResult $result) - { - $this->printDefects($result->notImplemented(), 'incomplete test'); - } - - /** - * @param PHPUnit_Framework_TestResult $result - * @since Method available since Release 4.0.0 - */ - protected function printRisky(PHPUnit_Framework_TestResult $result) - { - $this->printDefects($result->risky(), 'risky test'); - } - - /** - * @param PHPUnit_Framework_TestResult $result - * @since Method available since Release 3.0.0 - */ - protected function printSkipped(PHPUnit_Framework_TestResult $result) - { - $this->printDefects($result->skipped(), 'skipped test'); - } - - /** - * @param PHPUnit_Framework_TestResult $result - * @since Method available since Release 4.0.0 - */ - protected function printDeprecated(PHPUnit_Framework_TestResult $result) - { - $deprecatedFeatures = $result->deprecatedFeatures(); - $count = count($deprecatedFeatures); - - if ($count == 0) { - return; - } - - $this->write( - sprintf( - "There %s %d tests that use%s deprecated features:\n", - - ($count == 1) ? 'was' : 'were', - $count, - ($count != 1) ? '' : 's' - ) - ); - - $i = 1; - - foreach ($result->deprecatedFeatures() as $deprecatedFeature) { - $this->write( - sprintf( - "\n%d) %s\n\n%s\n", - - $i++, - $deprecatedFeature->getMessage(), - $deprecatedFeature->getSource() - ) - ); - } - } - - protected function printHeader() - { - $this->write("\n\n" . PHP_Timer::resourceUsage() . "\n\n"); - } - - /** - * @param PHPUnit_Framework_TestResult $result - */ - protected function printFooter(PHPUnit_Framework_TestResult $result) - { - if (count($result) === 0) { - $this->writeWithColor( - 'fg-black, bg-yellow', - 'No tests executed!' - ); - } elseif ($result->wasSuccessful() && - $result->allHarmless() && - $result->allCompletelyImplemented() && - $result->noneSkipped()) { - - $this->writeWithColor( - 'fg-black, bg-green', - sprintf( - 'OK (%d test%s, %d assertion%s)', - - count($result), - (count($result) == 1) ? '' : 's', - $this->numAssertions, - ($this->numAssertions == 1) ? '' : 's' - ) - ); - } elseif ((!$result->allCompletelyImplemented() || - !$result->allHarmless() || - !$result->noneSkipped()) && - $result->wasSuccessful()) { - $this->writeWithColor( - 'fg-black, bg-yellow', - sprintf( - "%sOK, but incomplete, skipped, or risky tests!\n" . - 'Tests: %d, Assertions: %d%s%s%s.', - - $this->verbose ? "\n" : '', - count($result), - $this->numAssertions, - $this->getCountString( - $result->notImplementedCount(), 'Incomplete' - ), - $this->getCountString( - $result->skippedCount(), 'Skipped' - ), - $this->getCountString( - $result->riskyCount(), 'Risky' - ) - ) - ); - } else { - $this->writeWithColor( - 'fg-white, bg-red', - sprintf( - "\nFAILURES!\n" . - 'Tests: %d, Assertions: %s%s%s%s%s.', - - count($result), - $this->numAssertions, - $this->getCountString($result->failureCount(), 'Failures'), - $this->getCountString($result->errorCount(), 'Errors'), - $this->getCountString( - $result->notImplementedCount(), 'Incomplete' - ), - $this->getCountString($result->skippedCount(), 'Skipped') - ) - ); - } - - if (!$this->verbose && - $result->deprecatedFeaturesCount() > 0) { - $this->write("\n"); - - $this->writeWithColor( - 'fg-white, bg-red', - sprintf( - "Warning: Deprecated PHPUnit features are being used %s times!\n" . - 'Use --verbose for more information.', - - $result->deprecatedFeaturesCount() - ) - ); - } - } - - /** - * @param integer $count - * @param string $name - * @return string - * @since Method available since Release 3.0.0 - */ - protected function getCountString($count, $name) - { - $string = ''; - - if ($count > 0) { - $string = sprintf( - ', %s: %d', - - $name, - $count - ); - } - - return $string; - } - - /** - */ - public function printWaitPrompt() - { - $this->write("\n to continue\n"); - } - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeProgressWithColor('fg-red, bold', 'E'); - $this->lastTestFailed = true; - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - $this->writeProgressWithColor('bg-red, fg-white', 'F'); - $this->lastTestFailed = true; - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeProgressWithColor('fg-yellow, bold', 'I'); - $this->lastTestFailed = true; - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeProgressWithColor('fg-yellow, bold', 'R'); - $this->lastTestFailed = true; - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - $this->writeProgressWithColor('fg-cyan, bold', 'S'); - $this->lastTestFailed = true; - } - - /** - * A testsuite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - if ($this->numTests == -1) { - $this->numTests = count($suite); - $this->numTestsWidth = strlen((string) $this->numTests); - $this->maxColumn = 69 - (2 * $this->numTestsWidth); - } - } - - /** - * A testsuite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - if ($this->debug) { - $this->write( - sprintf( - "\nStarting test '%s'.\n", PHPUnit_Util_Test::describe($test) - ) - ); - } - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if (!$this->lastTestFailed) { - $this->writeProgress('.'); - } - - if ($test instanceof PHPUnit_Framework_TestCase) { - $this->numAssertions += $test->getNumAssertions(); - } elseif ($test instanceof PHPUnit_Extensions_PhptTestCase) { - $this->numAssertions++; - } - - $this->lastTestFailed = false; - - if ($test instanceof PHPUnit_Framework_TestCase) { - if (!$test->hasPerformedExpectationsOnOutput()) { - $this->write($test->getActualOutput()); - } - } - } - - /** - * @param string $progress - */ - protected function writeProgress($progress) - { - $this->write($progress); - $this->column++; - $this->numTestsRun++; - - if ($this->column == $this->maxColumn) { - $this->write( - sprintf( - ' %' . $this->numTestsWidth . 'd / %' . - $this->numTestsWidth . 'd (%3s%%)', - - $this->numTestsRun, - $this->numTests, - floor(($this->numTestsRun / $this->numTests) * 100) - ) - ); - - $this->writeNewLine(); - } - } - - protected function writeNewLine() - { - $this->column = 0; - $this->write("\n"); - } - - /** - * Formats a buffer with a specified ANSI color sequence if colors are - * enabled. - * - * @param string $color - * @param string $buffer - * @return string - * @since Method available since Release 4.0.0 - */ - protected function formatWithColor($color, $buffer) - { - if (!$this->colors) { - return $buffer; - } - - $codes = array_map('trim', explode(',', $color)); - $lines = explode("\n", $buffer); - $padding = max(array_map('strlen', $lines)); - - $styles = array(); - foreach ($codes as $code) { - $styles[] = self::$ansiCodes[$code]; - } - $style = sprintf("\x1b[%sm", implode(';', $styles)); - - $styledLines = array(); - foreach ($lines as $line) { - $styledLines[] = $style . str_pad($line, $padding) . "\x1b[0m"; - } - - return implode("\n", $styledLines); - } - - /** - * Writes a buffer out with a color sequence if colors are enabled. - * - * @param string $color - * @param string $buffer - * @since Method available since Release 4.0.0 - */ - protected function writeWithColor($color, $buffer) - { - $buffer = $this->formatWithColor($color, $buffer); - $this->write($buffer . "\n"); - } - - /** - * Writes progress with a color sequence if colors are enabled. - * - * @param string $color - * @param string $buffer - * @since Method available since Release 4.0.0 - */ - protected function writeProgressWithColor($color, $buffer) - { - $buffer = $this->formatWithColor($color, $buffer); - $this->writeProgress($buffer); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -use SebastianBergmann\Environment\Runtime; - -/** - * A TestRunner for the Command Line Interface (CLI) - * PHP SAPI Module. - * - * @package PHPUnit - * @subpackage TextUI - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner -{ - const SUCCESS_EXIT = 0; - const FAILURE_EXIT = 1; - const EXCEPTION_EXIT = 2; - - /** - * @var PHP_CodeCoverage_Filter - */ - protected $codeCoverageFilter; - - /** - * @var PHPUnit_Runner_TestSuiteLoader - */ - protected $loader = null; - - /** - * @var PHPUnit_TextUI_ResultPrinter - */ - protected $printer = null; - - /** - * @var boolean - */ - protected static $versionStringPrinted = false; - - /** - * @var array - */ - private $missingExtensions = array(); - - /** - * @var boolean - */ - private $canCollectCodeCoverage; - - /** - * @param PHPUnit_Runner_TestSuiteLoader $loader - * @param PHP_CodeCoverage_Filter $filter - * @since Method available since Release 3.4.0 - */ - public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, PHP_CodeCoverage_Filter $filter = null) - { - if ($filter === null) { - $filter = new PHP_CodeCoverage_Filter; - } - - $this->codeCoverageFilter = $filter; - $this->loader = $loader; - - $runtime = new Runtime; - $this->canCollectCodeCoverage = $runtime->canCollectCodeCoverage(); - } - - /** - * @param PHPUnit_Framework_Test|ReflectionClass $test - * @param array $arguments - * @return PHPUnit_Framework_TestResult - * @throws PHPUnit_Framework_Exception - */ - public static function run($test, array $arguments = array()) - { - if ($test instanceof ReflectionClass) { - $test = new PHPUnit_Framework_TestSuite($test); - } - - if ($test instanceof PHPUnit_Framework_Test) { - $aTestRunner = new PHPUnit_TextUI_TestRunner; - - return $aTestRunner->doRun( - $test, - $arguments - ); - } else { - throw new PHPUnit_Framework_Exception( - 'No test case or test suite found.' - ); - } - } - - /** - * @return PHPUnit_Framework_TestResult - */ - protected function createTestResult() - { - return new PHPUnit_Framework_TestResult; - } - - private function processSuiteFilters(PHPUnit_Framework_TestSuite $suite, array $arguments) - { - if (!$arguments['filter'] && - empty($arguments['groups']) && - empty($arguments['excludeGroups'])) { - return; - } - - $filterFactory = new PHPUnit_Runner_Filter_Factory(); - - if (!empty($arguments['excludeGroups'])) { - $filterFactory->addFilter( - new ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'), - $arguments['excludeGroups'] - ); - } - - if (!empty($arguments['groups'])) { - $filterFactory->addFilter( - new ReflectionClass('PHPUnit_Runner_Filter_Group_Include'), - $arguments['groups'] - ); - } - - if ($arguments['filter']) { - $filterFactory->addFilter( - new ReflectionClass('PHPUnit_Runner_Filter_Test'), - $arguments['filter'] - ); - } - $suite->injectFilter($filterFactory); - } - - /** - * @param PHPUnit_Framework_Test $suite - * @param array $arguments - * @return PHPUnit_Framework_TestResult - */ - public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array()) - { - $this->handleConfiguration($arguments); - - $this->processSuiteFilters($suite, $arguments); - - if (isset($arguments['bootstrap'])) { - $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; - } - - if ($arguments['backupGlobals'] === false) { - $suite->setBackupGlobals(false); - } - - if ($arguments['backupStaticAttributes'] === true) { - $suite->setBackupStaticAttributes(true); - } - - if (is_integer($arguments['repeat'])) { - $test = new PHPUnit_Extensions_RepeatedTest( - $suite, - $arguments['repeat'], - $arguments['processIsolation'] - ); - - $suite = new PHPUnit_Framework_TestSuite(); - $suite->addTest($test); - } - - $result = $this->createTestResult(); - - if (!$arguments['convertErrorsToExceptions']) { - $result->convertErrorsToExceptions(false); - } - - if (!$arguments['convertNoticesToExceptions']) { - PHPUnit_Framework_Error_Notice::$enabled = false; - } - - if (!$arguments['convertWarningsToExceptions']) { - PHPUnit_Framework_Error_Warning::$enabled = false; - } - - if ($arguments['stopOnError']) { - $result->stopOnError(true); - } - - if ($arguments['stopOnFailure']) { - $result->stopOnFailure(true); - } - - if ($arguments['stopOnIncomplete']) { - $result->stopOnIncomplete(true); - } - - if ($arguments['stopOnRisky']) { - $result->stopOnRisky(true); - } - - if ($arguments['stopOnSkipped']) { - $result->stopOnSkipped(true); - } - - if ($this->printer === null) { - if (isset($arguments['printer']) && - $arguments['printer'] instanceof PHPUnit_Util_Printer) { - $this->printer = $arguments['printer']; - } else { - $printerClass = 'PHPUnit_TextUI_ResultPrinter'; - if (isset($arguments['printer']) && - is_string($arguments['printer']) && - class_exists($arguments['printer'], false)) { - $class = new ReflectionClass($arguments['printer']); - - if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) { - $printerClass = $arguments['printer']; - } - } - - $this->printer = new $printerClass( - isset($arguments['stderr']) ? 'php://stderr' : null, - $arguments['verbose'], - $arguments['colors'], - $arguments['debug'] - ); - } - } - - if (!$this->printer instanceof PHPUnit_Util_Log_TAP) { - $this->printer->write( - PHPUnit_Runner_Version::getVersionString() . "\n\n" - ); - - self::$versionStringPrinted = true; - - if (isset($arguments['configuration'])) { - $this->printer->write( - sprintf( - "Configuration read from %s\n\n", - $arguments['configuration']->getFilename() - ) - ); - } - } - - foreach ($arguments['listeners'] as $listener) { - $result->addListener($listener); - } - - $result->addListener($this->printer); - - if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { - $result->addListener(new PHPUnit_Util_DeprecatedFeature_Logger); - } - - if (isset($arguments['testdoxHTMLFile'])) { - $result->addListener( - new PHPUnit_Util_TestDox_ResultPrinter_HTML( - $arguments['testdoxHTMLFile'] - ) - ); - } - - if (isset($arguments['testdoxTextFile'])) { - $result->addListener( - new PHPUnit_Util_TestDox_ResultPrinter_Text( - $arguments['testdoxTextFile'] - ) - ); - } - - $codeCoverageReports = 0; - - if (isset($arguments['coverageClover'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageCrap4J'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageHtml'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coveragePHP'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageText'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageXml'])) { - $codeCoverageReports++; - } - - if ($codeCoverageReports > 0 && (!extension_loaded('tokenizer') || !$this->canCollectCodeCoverage)) { - if (!extension_loaded('tokenizer')) { - $this->showExtensionNotLoadedMessage( - 'tokenizer', 'No code coverage will be generated.' - ); - } elseif (!extension_loaded('Xdebug')) { - $this->showExtensionNotLoadedMessage( - 'Xdebug', 'No code coverage will be generated.' - ); - } - - $codeCoverageReports = 0; - } - - if ($codeCoverageReports > 0) { - $codeCoverage = new PHP_CodeCoverage( - null, $this->codeCoverageFilter - ); - - $codeCoverage->setAddUncoveredFilesFromWhitelist( - $arguments['addUncoveredFilesFromWhitelist'] - ); - - $codeCoverage->setCheckForUnintentionallyCoveredCode( - $arguments['strictCoverage'] - ); - - $codeCoverage->setProcessUncoveredFilesFromWhitelist( - $arguments['processUncoveredFilesFromWhitelist'] - ); - - if (isset($arguments['forceCoversAnnotation'])) { - $codeCoverage->setForceCoversAnnotation( - $arguments['forceCoversAnnotation'] - ); - } - - if (isset($arguments['mapTestClassNameToCoveredClassName'])) { - $codeCoverage->setMapTestClassNameToCoveredClassName( - $arguments['mapTestClassNameToCoveredClassName'] - ); - } - - $result->setCodeCoverage($codeCoverage); - } - - if ($codeCoverageReports > 1) { - if (isset($arguments['cacheTokens'])) { - $codeCoverage->setCacheTokens($arguments['cacheTokens']); - } - } - - if (isset($arguments['jsonLogfile'])) { - $result->addListener( - new PHPUnit_Util_Log_JSON($arguments['jsonLogfile']) - ); - } - - if (isset($arguments['tapLogfile'])) { - $result->addListener( - new PHPUnit_Util_Log_TAP($arguments['tapLogfile']) - ); - } - - if (isset($arguments['junitLogfile'])) { - $result->addListener( - new PHPUnit_Util_Log_JUnit( - $arguments['junitLogfile'], $arguments['logIncompleteSkipped'] - ) - ); - } - - $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']); - $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']); - $result->beStrictAboutTestSize($arguments['enforceTimeLimit']); - $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']); - $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']); - $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']); - - if ($suite instanceof PHPUnit_Framework_TestSuite) { - $suite->setRunTestInSeparateProcess($arguments['processIsolation']); - } - - $suite->run($result); - - unset($suite); - $result->flushListeners(); - - if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) { - $this->printer->printResult($result); - } - - if (isset($codeCoverage)) { - if (isset($arguments['coverageClover'])) { - $this->printer->write( - "\nGenerating code coverage report in Clover XML format ..." - ); - - $writer = new PHP_CodeCoverage_Report_Clover; - $writer->process($codeCoverage, $arguments['coverageClover']); - - $this->printer->write(" done\n"); - unset($writer); - } - - if (isset($arguments['coverageCrap4J'])) { - $this->printer->write( - "\nGenerating Crap4J report XML file ..." - ); - - $writer = new PHP_CodeCoverage_Report_Crap4j; - $writer->process($codeCoverage, $arguments['coverageCrap4J']); - - $this->printer->write(" done\n"); - unset($writer); - } - - if (isset($arguments['coverageHtml'])) { - $this->printer->write( - "\nGenerating code coverage report in HTML format ..." - ); - - $writer = new PHP_CodeCoverage_Report_HTML( - $arguments['reportLowUpperBound'], - $arguments['reportHighLowerBound'], - sprintf( - ' and PHPUnit %s', - PHPUnit_Runner_Version::id() - ) - ); - - $writer->process($codeCoverage, $arguments['coverageHtml']); - - $this->printer->write(" done\n"); - unset($writer); - } - - if (isset($arguments['coveragePHP'])) { - $this->printer->write( - "\nGenerating code coverage report in PHP format ..." - ); - - $writer = new PHP_CodeCoverage_Report_PHP; - $writer->process($codeCoverage, $arguments['coveragePHP']); - - $this->printer->write(" done\n"); - unset($writer); - } - - if (isset($arguments['coverageText'])) { - if ($arguments['coverageText'] == 'php://stdout') { - $outputStream = $this->printer; - $colors = (bool) $arguments['colors']; - } else { - $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']); - $colors = false; - } - - $processor = new PHP_CodeCoverage_Report_Text( - $arguments['reportLowUpperBound'], - $arguments['reportHighLowerBound'], - $arguments['coverageTextShowUncoveredFiles'], - $arguments['coverageTextShowOnlySummary'] - ); - - $outputStream->write( - $processor->process($codeCoverage, $colors) - ); - } - - if (isset($arguments['coverageXml'])) { - $this->printer->write( - "\nGenerating code coverage report in PHPUnit XML format ..." - ); - - $writer = new PHP_CodeCoverage_Report_XML; - $writer->process($codeCoverage, $arguments['coverageXml']); - - $this->printer->write(" done\n"); - unset($writer); - } - } - - return $result; - } - - /** - * @param PHPUnit_TextUI_ResultPrinter $resultPrinter - */ - public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter) - { - $this->printer = $resultPrinter; - } - - /** - * Override to define how to handle a failed loading of - * a test suite. - * - * @param string $message - */ - protected function runFailed($message) - { - self::printVersionString(); - self::write($message . PHP_EOL); - exit(self::FAILURE_EXIT); - } - - /** - * @param string $buffer - * @since Method available since Release 3.1.0 - */ - protected static function write($buffer) - { - if (PHP_SAPI != 'cli') { - $buffer = htmlspecialchars($buffer); - } - - print $buffer; - } - - /** - * Returns the loader to be used. - * - * @return PHPUnit_Runner_TestSuiteLoader - * @since Method available since Release 2.2.0 - */ - public function getLoader() - { - if ($this->loader === null) { - $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader; - } - - return $this->loader; - } - - /** - */ - public static function showError($message) - { - self::printVersionString(); - self::write($message . "\n"); - - exit(self::FAILURE_EXIT); - } - - /** - */ - public static function printVersionString() - { - if (!self::$versionStringPrinted) { - self::write(PHPUnit_Runner_Version::getVersionString() . "\n\n"); - self::$versionStringPrinted = true; - } - } - - /** - * @param array $arguments - * @since Method available since Release 3.2.1 - */ - protected function handleConfiguration(array &$arguments) - { - if (isset($arguments['configuration']) && - !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) { - $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance( - $arguments['configuration'] - ); - } - - $arguments['debug'] = isset($arguments['debug']) ? $arguments['debug'] : false; - $arguments['filter'] = isset($arguments['filter']) ? $arguments['filter'] : false; - $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : array(); - - if (isset($arguments['configuration'])) { - $arguments['configuration']->handlePHPConfiguration(); - - $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration(); - - if (isset($phpunitConfiguration['backupGlobals']) && - !isset($arguments['backupGlobals'])) { - $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals']; - } - - if (isset($phpunitConfiguration['backupStaticAttributes']) && - !isset($arguments['backupStaticAttributes'])) { - $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes']; - } - - if (isset($phpunitConfiguration['bootstrap']) && - !isset($arguments['bootstrap'])) { - $arguments['bootstrap'] = $phpunitConfiguration['bootstrap']; - } - - if (isset($phpunitConfiguration['cacheTokens']) && - !isset($arguments['cacheTokens'])) { - $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; - } - - if (isset($phpunitConfiguration['colors']) && - !isset($arguments['colors'])) { - $arguments['colors'] = $phpunitConfiguration['colors']; - } - - if (isset($phpunitConfiguration['convertErrorsToExceptions']) && - !isset($arguments['convertErrorsToExceptions'])) { - $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions']; - } - - if (isset($phpunitConfiguration['convertNoticesToExceptions']) && - !isset($arguments['convertNoticesToExceptions'])) { - $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions']; - } - - if (isset($phpunitConfiguration['convertWarningsToExceptions']) && - !isset($arguments['convertWarningsToExceptions'])) { - $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions']; - } - - if (isset($phpunitConfiguration['processIsolation']) && - !isset($arguments['processIsolation'])) { - $arguments['processIsolation'] = $phpunitConfiguration['processIsolation']; - } - - if (isset($phpunitConfiguration['stopOnFailure']) && - !isset($arguments['stopOnFailure'])) { - $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure']; - } - - if (isset($phpunitConfiguration['timeoutForSmallTests']) && - !isset($arguments['timeoutForSmallTests'])) { - $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests']; - } - - if (isset($phpunitConfiguration['timeoutForMediumTests']) && - !isset($arguments['timeoutForMediumTests'])) { - $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests']; - } - - if (isset($phpunitConfiguration['timeoutForLargeTests']) && - !isset($arguments['timeoutForLargeTests'])) { - $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests']; - } - - if (isset($phpunitConfiguration['reportUselessTests']) && - !isset($arguments['reportUselessTests'])) { - $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests']; - } - - if (isset($phpunitConfiguration['strictCoverage']) && - !isset($arguments['strictCoverage'])) { - $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage']; - } - - if (isset($phpunitConfiguration['disallowTestOutput']) && - !isset($arguments['disallowTestOutput'])) { - $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput']; - } - - if (isset($phpunitConfiguration['enforceTimeLimit']) && - !isset($arguments['enforceTimeLimit'])) { - $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit']; - } - - if (isset($phpunitConfiguration['verbose']) && - !isset($arguments['verbose'])) { - $arguments['verbose'] = $phpunitConfiguration['verbose']; - } - - if (isset($phpunitConfiguration['forceCoversAnnotation']) && - !isset($arguments['forceCoversAnnotation'])) { - $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation']; - } - - if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) && - !isset($arguments['mapTestClassNameToCoveredClassName'])) { - $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName']; - } - - $groupCliArgs = array(); - if (!empty($arguments['groups'])) { - $groupCliArgs = $arguments['groups']; - } - - $groupConfiguration = $arguments['configuration']->getGroupConfiguration(); - - if (!empty($groupConfiguration['include']) && - !isset($arguments['groups'])) { - $arguments['groups'] = $groupConfiguration['include']; - } - - if (!empty($groupConfiguration['exclude']) && - !isset($arguments['excludeGroups'])) { - $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs); - } - - foreach ($arguments['configuration']->getListenerConfiguration() as $listener) { - if (!class_exists($listener['class'], false) && - $listener['file'] !== '') { - require_once $listener['file']; - } - - if (class_exists($listener['class'])) { - if (count($listener['arguments']) == 0) { - $listener = new $listener['class']; - } else { - $listenerClass = new ReflectionClass( - $listener['class'] - ); - $listener = $listenerClass->newInstanceArgs( - $listener['arguments'] - ); - } - - if ($listener instanceof PHPUnit_Framework_TestListener) { - $arguments['listeners'][] = $listener; - } - } - } - - $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration(); - - if (isset($loggingConfiguration['coverage-clover']) && - !isset($arguments['coverageClover'])) { - $arguments['coverageClover'] = $loggingConfiguration['coverage-clover']; - } - - if (isset($loggingConfiguration['coverage-crap4j']) && - !isset($arguments['coverageCrap4J'])) { - $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j']; - } - - if (isset($loggingConfiguration['coverage-html']) && - !isset($arguments['coverageHtml'])) { - if (isset($loggingConfiguration['lowUpperBound']) && - !isset($arguments['reportLowUpperBound'])) { - $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound']; - } - - if (isset($loggingConfiguration['highLowerBound']) && - !isset($arguments['reportHighLowerBound'])) { - $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound']; - } - - $arguments['coverageHtml'] = $loggingConfiguration['coverage-html']; - } - - if (isset($loggingConfiguration['coverage-php']) && - !isset($arguments['coveragePHP'])) { - $arguments['coveragePHP'] = $loggingConfiguration['coverage-php']; - } - - if (isset($loggingConfiguration['coverage-text']) && - !isset($arguments['coverageText'])) { - $arguments['coverageText'] = $loggingConfiguration['coverage-text']; - if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) { - $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles']; - } else { - $arguments['coverageTextShowUncoveredFiles'] = false; - } - if (isset($loggingConfiguration['coverageTextShowOnlySummary'])) { - $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary']; - } else { - $arguments['coverageTextShowOnlySummary'] = false; - } - } - - if (isset($loggingConfiguration['coverage-xml']) && - !isset($arguments['coverageXml'])) { - $arguments['coverageXml'] = $loggingConfiguration['coverage-xml']; - } - - if (isset($loggingConfiguration['json']) && - !isset($arguments['jsonLogfile'])) { - $arguments['jsonLogfile'] = $loggingConfiguration['json']; - } - - if (isset($loggingConfiguration['plain'])) { - $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter( - $loggingConfiguration['plain'], true - ); - } - - if (isset($loggingConfiguration['tap']) && - !isset($arguments['tapLogfile'])) { - $arguments['tapLogfile'] = $loggingConfiguration['tap']; - } - - if (isset($loggingConfiguration['junit']) && - !isset($arguments['junitLogfile'])) { - $arguments['junitLogfile'] = $loggingConfiguration['junit']; - - if (isset($loggingConfiguration['logIncompleteSkipped']) && - !isset($arguments['logIncompleteSkipped'])) { - $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped']; - } - } - - if (isset($loggingConfiguration['testdox-html']) && - !isset($arguments['testdoxHTMLFile'])) { - $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html']; - } - - if (isset($loggingConfiguration['testdox-text']) && - !isset($arguments['testdoxTextFile'])) { - $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text']; - } - - if ((isset($arguments['coverageClover']) || - isset($arguments['coverageCrap4J']) || - isset($arguments['coverageHtml']) || - isset($arguments['coveragePHP'])) || - isset($arguments['coverageText']) && - $this->canCollectCodeCoverage) { - - $filterConfiguration = $arguments['configuration']->getFilterConfiguration(); - $arguments['addUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist']; - $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist']; - - if (empty($filterConfiguration['whitelist']['include']['directory']) && - empty($filterConfiguration['whitelist']['include']['file'])) { - if (defined('__PHPUNIT_PHAR__')) { - $this->codeCoverageFilter->addFileToBlacklist(__PHPUNIT_PHAR__); - } - - $blacklist = new PHPUnit_Util_Blacklist; - - foreach ($blacklist->getBlacklistedDirectories() as $directory) { - $this->codeCoverageFilter->addDirectoryToBlacklist($directory); - } - - foreach ($filterConfiguration['blacklist']['include']['directory'] as $dir) { - $this->codeCoverageFilter->addDirectoryToBlacklist( - $dir['path'], $dir['suffix'], $dir['prefix'], $dir['group'] - ); - } - - foreach ($filterConfiguration['blacklist']['include']['file'] as $file) { - $this->codeCoverageFilter->addFileToBlacklist($file); - } - - foreach ($filterConfiguration['blacklist']['exclude']['directory'] as $dir) { - $this->codeCoverageFilter->removeDirectoryFromBlacklist( - $dir['path'], $dir['suffix'], $dir['prefix'], $dir['group'] - ); - } - - foreach ($filterConfiguration['blacklist']['exclude']['file'] as $file) { - $this->codeCoverageFilter->removeFileFromBlacklist($file); - } - } - - foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) { - $this->codeCoverageFilter->addDirectoryToWhitelist( - $dir['path'], $dir['suffix'], $dir['prefix'] - ); - } - - foreach ($filterConfiguration['whitelist']['include']['file'] as $file) { - $this->codeCoverageFilter->addFileToWhitelist($file); - } - - foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) { - $this->codeCoverageFilter->removeDirectoryFromWhitelist( - $dir['path'], $dir['suffix'], $dir['prefix'] - ); - } - - foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) { - $this->codeCoverageFilter->removeFileFromWhitelist($file); - } - } - } - - $arguments['addUncoveredFilesFromWhitelist'] = isset($arguments['addUncoveredFilesFromWhitelist']) ? $arguments['addUncoveredFilesFromWhitelist'] : true; - $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : false; - $arguments['backupGlobals'] = isset($arguments['backupGlobals']) ? $arguments['backupGlobals'] : null; - $arguments['backupStaticAttributes'] = isset($arguments['backupStaticAttributes']) ? $arguments['backupStaticAttributes'] : null; - $arguments['cacheTokens'] = isset($arguments['cacheTokens']) ? $arguments['cacheTokens'] : false; - $arguments['colors'] = isset($arguments['colors']) ? $arguments['colors'] : false; - $arguments['convertErrorsToExceptions'] = isset($arguments['convertErrorsToExceptions']) ? $arguments['convertErrorsToExceptions'] : true; - $arguments['convertNoticesToExceptions'] = isset($arguments['convertNoticesToExceptions']) ? $arguments['convertNoticesToExceptions'] : true; - $arguments['convertWarningsToExceptions'] = isset($arguments['convertWarningsToExceptions']) ? $arguments['convertWarningsToExceptions'] : true; - $arguments['excludeGroups'] = isset($arguments['excludeGroups']) ? $arguments['excludeGroups'] : array(); - $arguments['groups'] = isset($arguments['groups']) ? $arguments['groups'] : array(); - $arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ? $arguments['logIncompleteSkipped'] : false; - $arguments['processIsolation'] = isset($arguments['processIsolation']) ? $arguments['processIsolation'] : false; - $arguments['repeat'] = isset($arguments['repeat']) ? $arguments['repeat'] : false; - $arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ? $arguments['reportHighLowerBound'] : 90; - $arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ? $arguments['reportLowUpperBound'] : 50; - $arguments['stopOnError'] = isset($arguments['stopOnError']) ? $arguments['stopOnError'] : false; - $arguments['stopOnFailure'] = isset($arguments['stopOnFailure']) ? $arguments['stopOnFailure'] : false; - $arguments['stopOnIncomplete'] = isset($arguments['stopOnIncomplete']) ? $arguments['stopOnIncomplete'] : false; - $arguments['stopOnRisky'] = isset($arguments['stopOnRisky']) ? $arguments['stopOnRisky'] : false; - $arguments['stopOnSkipped'] = isset($arguments['stopOnSkipped']) ? $arguments['stopOnSkipped'] : false; - $arguments['timeoutForSmallTests'] = isset($arguments['timeoutForSmallTests']) ? $arguments['timeoutForSmallTests'] : 1; - $arguments['timeoutForMediumTests'] = isset($arguments['timeoutForMediumTests']) ? $arguments['timeoutForMediumTests'] : 10; - $arguments['timeoutForLargeTests'] = isset($arguments['timeoutForLargeTests']) ? $arguments['timeoutForLargeTests'] : 60; - $arguments['reportUselessTests'] = isset($arguments['reportUselessTests']) ? $arguments['reportUselessTests'] : false; - $arguments['strictCoverage'] = isset($arguments['strictCoverage']) ? $arguments['strictCoverage'] : false; - $arguments['disallowTestOutput'] = isset($arguments['disallowTestOutput']) ? $arguments['disallowTestOutput'] : false; - $arguments['enforceTimeLimit'] = isset($arguments['enforceTimeLimit']) ? $arguments['enforceTimeLimit'] : false; - $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false; - } - - /** - * @param string $message - * @since Method available since Release 4.0.0 - */ - private function showExtensionNotLoadedMessage($extension, $message = '') - { - if (isset($this->missingExtensions[$extension])) { - return; - } - - if (!empty($message)) { - $message = ' ' . $message; - } - - $this->showMessage( - 'The ' . $extension . ' extension is not loaded.' . $message . "\n" - ); - - $this->missingExtensions[$extension] = true; - } - - /** - * Shows a message. - * - * @param string $message - * @param boolean $exit - * @since Method available since Release 4.0.0 - */ - private function showMessage($message, $exit = false) - { - $this->printVersionString(); - $this->write($message . "\n"); - - if ($exit) { - exit(self::EXCEPTION_EXIT); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * Base class for all test runners. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -abstract class PHPUnit_Runner_BaseTestRunner -{ - const STATUS_PASSED = 0; - const STATUS_SKIPPED = 1; - const STATUS_INCOMPLETE = 2; - const STATUS_FAILURE = 3; - const STATUS_ERROR = 4; - const STATUS_RISKY = 5; - const SUITE_METHODNAME = 'suite'; - - /** - * Returns the loader to be used. - * - * @return PHPUnit_Runner_TestSuiteLoader - */ - public function getLoader() - { - return new PHPUnit_Runner_StandardTestSuiteLoader; - } - - /** - * Returns the Test corresponding to the given suite. - * This is a template method, subclasses override - * the runFailed() and clearStatus() methods. - * - * @param string $suiteClassName - * @param string $suiteClassFile - * @param mixed $suffixes - * @return PHPUnit_Framework_Test - */ - public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '') - { - if (is_dir($suiteClassName) && - !is_file($suiteClassName . '.php') && empty($suiteClassFile)) { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray( - $suiteClassName, $suffixes - ); - - $suite = new PHPUnit_Framework_TestSuite($suiteClassName); - $suite->addTestFiles($files); - - return $suite; - } - - try { - $testClass = $this->loadSuiteClass( - $suiteClassName, $suiteClassFile - ); - } catch (PHPUnit_Framework_Exception $e) { - $this->runFailed($e->getMessage()); - - return null; - } - - try { - $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); - - if (!$suiteMethod->isStatic()) { - $this->runFailed( - 'suite() method must be static.' - ); - - return null; - } - - try { - $test = $suiteMethod->invoke(null, $testClass->getName()); - } catch (ReflectionException $e) { - $this->runFailed( - sprintf( - "Failed to invoke suite() method.\n%s", - - $e->getMessage() - ) - ); - - return null; - } - } catch (ReflectionException $e) { - try { - $test = new PHPUnit_Framework_TestSuite($testClass); - } catch (PHPUnit_Framework_Exception $e) { - $test = new PHPUnit_Framework_TestSuite; - $test->setName($suiteClassName); - } - } - - $this->clearStatus(); - - return $test; - } - - /** - * Returns the loaded ReflectionClass for a suite name. - * - * @param string $suiteClassName - * @param string $suiteClassFile - * @return ReflectionClass - */ - protected function loadSuiteClass($suiteClassName, $suiteClassFile = '') - { - $loader = $this->getLoader(); - - if ($loader instanceof PHPUnit_Runner_StandardTestSuiteLoader) { - return $loader->load($suiteClassName, $suiteClassFile); - } else { - return $loader->load($suiteClassName, $suiteClassFile); - } - } - - /** - * Clears the status message. - * - */ - protected function clearStatus() - { - } - - /** - * Override to define how to handle a failed loading of - * a test suite. - * - * @param string $message - */ - abstract protected function runFailed($message); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * An interface to define how a test suite should be loaded. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 2.0.0 - */ -interface PHPUnit_Runner_TestSuiteLoader -{ - /** - * @param string $suiteClassName - * @param string $suiteClassFile - * @return ReflectionClass - */ - public function load($suiteClassName, $suiteClassFile = ''); - - /** - * @param ReflectionClass $aClass - * @return ReflectionClass - */ - public function reload(ReflectionClass $aClass); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Runner_Filter_Group_Exclude extends PHPUnit_Runner_Filter_GroupFilterIterator -{ - protected function doAccept($hash) - { - return !in_array($hash, $this->groupTests); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Runner_Filter_Group_Include extends PHPUnit_Runner_Filter_GroupFilterIterator -{ - protected function doAccept($hash) - { - return in_array($hash, $this->groupTests); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Runner_Filter_Factory -{ - /** - * @var array - */ - private $filters = array(); - - /** - * @param ReflectionClass $filter - * @param mixed $args - */ - public function addFilter(ReflectionClass $filter, $args) - { - if (!$filter->isSubclassOf('RecursiveFilterIterator')) { - throw new InvalidArgumentException( - sprintf( - 'Class "%s" does not extend RecursiveFilterIterator', - $filter->name - ) - ); - } - - $this->filters[] = array($filter, $args); - } - - /** - * @return FilterIterator - */ - public function factory(Iterator $iterator, PHPUnit_Framework_TestSuite $suite) - { - foreach ($this->filters as $filter) { - list($class, $args) = $filter; - $iterator = $class->newInstance($iterator, $args, $suite); - } - - return $iterator; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -abstract class PHPUnit_Runner_Filter_GroupFilterIterator extends RecursiveFilterIterator -{ - /** - * @var array - */ - protected $groupTests = array(); - - /** - * @param RecursiveIterator $iterator - * @param array $groups - * @param PHPUnit_Framework_TestSuite $suite - */ - public function __construct(RecursiveIterator $iterator, array $groups, PHPUnit_Framework_TestSuite $suite) - { - parent::__construct($iterator); - - foreach ($suite->getGroupDetails() as $group => $tests) { - if (in_array($group, $groups)) { - $testHashes = array_map( - function ($test) { return spl_object_hash($test); }, - $tests - ); - - $this->groupTests = array_merge($this->groupTests, $testHashes); - } - } - } - - /** - * @return boolean - */ - public function accept() - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof PHPUnit_Framework_TestSuite) { - return true; - } - - return $this->doAccept(spl_object_hash($test)); - } - - abstract protected function doAccept($hash); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Runner_Filter_Test extends RecursiveFilterIterator -{ - /** - * @var string - */ - protected $filter = null; - - /** - * @var integer - */ - protected $filterMin; - /** - * @var integer - */ - protected $filterMax; - - /** - * @param RecursiveIterator $iterator - * @param string $filter - */ - public function __construct(RecursiveIterator $iterator, $filter) - { - parent::__construct($iterator); - $this->setFilter($filter); - } - - /** - * @param string $filter - */ - protected function setFilter($filter) - { - if ($filter[0] != substr($filter, -1) || - preg_match('/^[a-zA-Z0-9_]/', $filter)) { - - // Handles: - // * testAssertEqualsSucceeds#4 - // * testAssertEqualsSucceeds#4-8 - if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { - if (isset($matches[3]) && $matches[2] < $matches[3]) { - $filter = sprintf( - '%s.*with data set #(\d+)$', - $matches[1] - ); - - $this->filterMin = $matches[2]; - $this->filterMax = $matches[3]; - } else { - $filter = sprintf( - '%s.*with data set #%s$', - $matches[1], - $matches[2] - ); - } - } - - // Handles: - // * testDetermineJsonError@JSON_ERROR_NONE - // * testDetermineJsonError@JSON.* - elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { - $filter = sprintf( - '%s.*with data set "%s"$', - $matches[1], - $matches[2] - ); - } - - // Escape delimiters in regular expression. Do NOT use preg_quote, - // to keep magic characters. - $filter = sprintf('/%s/', str_replace( - '/', '\\/', $filter - )); - } - - $this->filter = $filter; - } - - /** - * @return boolean - */ - public function accept() - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof PHPUnit_Framework_TestSuite) { - return true; - } - - $tmp = PHPUnit_Util_Test::describe($test, false); - - if ($tmp[0] != '') { - $name = join('::', $tmp); - } else { - $name = $tmp[1]; - } - - $accepted = preg_match($this->filter, $name, $matches); - - if ($accepted && isset($this->filterMax)) { - $set = end($matches); - $accepted = $set >= $this->filterMin && $set <= $this->filterMax; - } - - return $accepted; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * The standard test suite loader. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Runner_StandardTestSuiteLoader implements PHPUnit_Runner_TestSuiteLoader -{ - /** - * @param string $suiteClassName - * @param string $suiteClassFile - * @return ReflectionClass - * @throws PHPUnit_Framework_Exception - */ - public function load($suiteClassName, $suiteClassFile = '') - { - $suiteClassName = str_replace('.php', '', $suiteClassName); - - if (empty($suiteClassFile)) { - $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename( - $suiteClassName - ); - } - - if (!class_exists($suiteClassName, false)) { - $loadedClasses = get_declared_classes(); - - $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile); - - $loadedClasses = array_values( - array_diff(get_declared_classes(), $loadedClasses) - ); - } - - if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { - $offset = 0 - strlen($suiteClassName); - - foreach ($loadedClasses as $loadedClass) { - $class = new ReflectionClass($loadedClass); - if (substr($loadedClass, $offset) === $suiteClassName && - $class->getFileName() == $filename) { - $suiteClassName = $loadedClass; - break; - } - } - } - - if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) { - $testCaseClass = 'PHPUnit_Framework_TestCase'; - - foreach ($loadedClasses as $loadedClass) { - $class = new ReflectionClass($loadedClass); - $classFile = $class->getFileName(); - - if ($class->isSubclassOf($testCaseClass) && - !$class->isAbstract()) { - $suiteClassName = $loadedClass; - $testCaseClass = $loadedClass; - - if ($classFile == realpath($suiteClassFile)) { - break; - } - } - - if ($class->hasMethod('suite')) { - $method = $class->getMethod('suite'); - - if (!$method->isAbstract() && - $method->isPublic() && - $method->isStatic()) { - $suiteClassName = $loadedClass; - - if ($classFile == realpath($suiteClassFile)) { - break; - } - } - } - } - } - - if (class_exists($suiteClassName, false)) { - $class = new ReflectionClass($suiteClassName); - - if ($class->getFileName() == realpath($suiteClassFile)) { - return $class; - } - } - - throw new PHPUnit_Framework_Exception( - sprintf( - "Class '%s' could not be found in '%s'.", - - $suiteClassName, - $suiteClassFile - ) - ); - } - - /** - * @param ReflectionClass $aClass - * @return ReflectionClass - */ - public function reload(ReflectionClass $aClass) - { - return $aClass; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 4.0.0 - */ -class PHPUnit_Runner_Exception extends RuntimeException implements PHPUnit_Exception -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * This class defines the current version of PHPUnit. - * - * @package PHPUnit - * @subpackage Runner - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Runner_Version -{ - private static $pharVersion = "4.1.0"; - private static $version; - - /** - * Returns the current version of PHPUnit. - * - * @return string - */ - public static function id() - { - if (self::$pharVersion !== null) { - return self::$pharVersion; - } - - if (self::$version === null) { - $version = new SebastianBergmann\Version('4.1.0', __DIR__); - self::$version = $version->getVersion(); - } - - return self::$version; - } - - /** - * @return string - */ - public static function getVersionString() - { - return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann.'; - } - - /** - * @return string - * @since Method available since Release 4.0.0 - */ - public static function getReleaseChannel() - { - if (strpos(self::$pharVersion, 'alpha') !== false) { - return '-alpha'; - } - - if (strpos(self::$pharVersion, 'beta') !== false) { - return '-beta'; - } - - return ''; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Extensions_PhptTestCase - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.4 - */ - -/** - * Runner for PHPT test cases. - * - * @package PHPUnit - * @subpackage Extensions_PhptTestCase - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.4 - */ -class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing -{ - /** - * @var string - */ - private $filename; - - /** - * @var array - */ - private $settings = array( - 'allow_url_fopen=1', - 'auto_append_file=', - 'auto_prepend_file=', - 'disable_functions=', - 'display_errors=1', - 'docref_root=', - 'docref_ext=.html', - 'error_append_string=', - 'error_prepend_string=', - 'error_reporting=-1', - 'html_errors=0', - 'log_errors=0', - 'magic_quotes_runtime=0', - 'output_handler=', - 'open_basedir=', - 'output_buffering=Off', - 'report_memleaks=0', - 'report_zend_debug=0', - 'safe_mode=0', - 'track_errors=1', - 'xdebug.default_enable=0' - ); - - /** - * Constructs a test case with the given filename. - * - * @param string $filename - * @throws PHPUnit_Framework_Exception - */ - public function __construct($filename) - { - if (!is_string($filename)) { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string'); - } - - if (!is_file($filename)) { - throw new PHPUnit_Framework_Exception( - sprintf( - 'File "%s" does not exist.', - $filename - ) - ); - } - - $this->filename = $filename; - } - - /** - * Counts the number of test cases executed by run(TestResult result). - * - * @return integer - */ - public function count() - { - return 1; - } - - /** - * Runs a test and collects its result in a TestResult instance. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - */ - public function run(PHPUnit_Framework_TestResult $result = null) - { - $sections = $this->parse(); - $code = $this->render($sections['FILE']); - - if ($result === null) { - $result = new PHPUnit_Framework_TestResult; - } - - $php = PHPUnit_Util_PHP::factory(); - $skip = false; - $time = 0; - - $result->startTest($this); - - if (isset($sections['SKIPIF'])) { - $jobResult = $php->runJob($sections['SKIPIF'], $this->settings); - - if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) { - if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $message)) { - $message = substr($message[1], 2); - } else { - $message = ''; - } - - $result->addFailure($this, new PHPUnit_Framework_SkippedTestError($message), 0); - - $skip = true; - } - } - - if (!$skip) { - PHP_Timer::start(); - $jobResult = $php->runJob($code, $this->settings); - $time = PHP_Timer::stop(); - - if (isset($sections['EXPECT'])) { - $assertion = 'assertEquals'; - $expected = preg_replace('/\r\n/', "\n", trim($sections['EXPECT'])); - } else { - $assertion = 'assertStringMatchesFormat'; - $expected = trim($sections['EXPECTF']); - } - - try { - PHPUnit_Framework_Assert::$assertion($expected, trim($jobResult['stdout'])); - } catch (PHPUnit_Framework_AssertionFailedError $e) { - $result->addFailure($this, $e, $time); - } catch (Exception $e) { - $result->addError($this, $e, $time); - } - } - - $result->endTest($this, $time); - - return $result; - } - - /** - * Returns the name of the test case. - * - * @return string - */ - public function getName() - { - return $this->toString(); - } - - /** - * Returns a string representation of the test case. - * - * @return string - */ - public function toString() - { - return $this->filename; - } - - /** - * @return array - * @throws PHPUnit_Framework_Exception - */ - private function parse() - { - $sections = array(); - $section = ''; - - foreach (file($this->filename) as $line) { - if (preg_match('/^--([_A-Z]+)--/', $line, $result)) { - $section = $result[1]; - $sections[$section] = ''; - continue; - } elseif (empty($section)) { - throw new PHPUnit_Framework_Exception('Invalid PHPT file'); - } - - $sections[$section] .= $line; - } - - if (!isset($sections['FILE']) || - (!isset($sections['EXPECT']) && !isset($sections['EXPECTF']))) { - throw new PHPUnit_Framework_Exception('Invalid PHPT file'); - } - - return $sections; - } - - /** - * @param string $code - * @return string - */ - private function render($code) - { - return str_replace( - array( - '__DIR__', - '__FILE__' - ), - array( - "'" . dirname($this->filename) . "'", - "'" . $this->filename . "'" - ), - $code - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A Decorator that runs a test repeatedly. - * - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator -{ - /** - * @var mixed - */ - protected $filter = false; - - /** - * @var array - */ - protected $groups = array(); - - /** - * @var array - */ - protected $excludeGroups = array(); - - /** - * @var boolean - */ - protected $processIsolation = false; - - /** - * @var integer - */ - protected $timesRepeat = 1; - - /** - * Constructor. - * - * @param PHPUnit_Framework_Test $test - * @param integer $timesRepeat - * @param mixed $filter - * @param array $groups - * @param array $excludeGroups - * @param boolean $processIsolation - * @throws PHPUnit_Framework_Exception - */ - public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1, $processIsolation = false) - { - parent::__construct($test); - - if (is_integer($timesRepeat) && - $timesRepeat >= 0) { - $this->timesRepeat = $timesRepeat; - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory( - 2, 'positive integer' - ); - } - - $this->processIsolation = $processIsolation; - } - - /** - * Counts the number of test cases that - * will be run by this test. - * - * @return integer - */ - public function count() - { - return $this->timesRepeat * count($this->test); - } - - /** - * Runs the decorated test and collects the - * result in a TestResult. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - * @throws PHPUnit_Framework_Exception - */ - public function run(PHPUnit_Framework_TestResult $result = null) - { - if ($result === null) { - $result = $this->createResult(); - } - - //@codingStandardsIgnoreStart - for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) { - //@codingStandardsIgnoreEnd - if ($this->test instanceof PHPUnit_Framework_TestSuite) { - $this->test->setRunTestInSeparateProcess($this->processIsolation); - } - $this->test->run($result); - } - - return $result; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Extensions - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 2.0.0 - */ - -/** - * A Decorator for Tests. - * - * Use TestDecorator as the base class for defining new - * test decorators. Test decorator subclasses can be introduced - * to add behaviour before or after a test is run. - * - * @package PHPUnit - * @subpackage Extensions - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 2.0.0 - */ -class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing -{ - /** - * The Test to be decorated. - * - * @var object - */ - protected $test = null; - - /** - * Constructor. - * - * @param PHPUnit_Framework_Test $test - */ - public function __construct(PHPUnit_Framework_Test $test) - { - $this->test = $test; - } - - /** - * Returns a string representation of the test. - * - * @return string - */ - public function toString() - { - return $this->test->toString(); - } - - /** - * Runs the test and collects the - * result in a TestResult. - * - * @param PHPUnit_Framework_TestResult $result - */ - public function basicRun(PHPUnit_Framework_TestResult $result) - { - $this->test->run($result); - } - - /** - * Counts the number of test cases that - * will be run by this test. - * - * @return integer - */ - public function count() - { - return count($this->test); - } - - /** - * Creates a default TestResult object. - * - * @return PHPUnit_Framework_TestResult - */ - protected function createResult() - { - return new PHPUnit_Framework_TestResult; - } - - /** - * Returns the test to be run. - * - * @return PHPUnit_Framework_Test - */ - public function getTest() - { - return $this->test; - } - - /** - * Runs the decorated test and collects the - * result in a TestResult. - * - * @param PHPUnit_Framework_TestResult $result - * @return PHPUnit_Framework_TestResult - */ - public function run(PHPUnit_Framework_TestResult $result = null) - { - if ($result === null) { - $result = $this->createResult(); - } - - $this->basicRun($result); - - return $result; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Extensions - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.3.0 - */ - -/** - * We have a TestSuite object A. - * In TestSuite object A we have Tests tagged with @group. - * We want a TestSuite object B that contains TestSuite objects C, D, ... - * for the Tests tagged with @group C, @group D, ... - * Running the Tests from TestSuite object B results in Tests tagged with both - * @group C and @group D in TestSuite object A to be run twice . - * - * - * $suite = new PHPUnit_Extensions_GroupTestSuite($A, array('C', 'D')); - * - * - * @package PHPUnit - * @subpackage Extensions - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.3.0 - */ -class PHPUnit_Extensions_GroupTestSuite extends PHPUnit_Framework_TestSuite -{ - public function __construct(PHPUnit_Framework_TestSuite $suite, array $groups) - { - $groupSuites = array(); - $name = $suite->getName(); - - foreach ($groups as $group) { - $groupSuites[$group] = new PHPUnit_Framework_TestSuite($name . ' - ' . $group); - $this->addTest($groupSuites[$group]); - } - - $tests = new RecursiveIteratorIterator( - new PHPUnit_Util_TestSuiteIterator($suite), - RecursiveIteratorIterator::LEAVES_ONLY - ); - - foreach ($tests as $test) { - if ($test instanceof PHPUnit_Framework_TestCase) { - $testGroups = PHPUnit_Util_Test::getGroups( - get_class($test), $test->getName(false) - ); - - foreach ($groups as $group) { - foreach ($testGroups as $testGroup) { - if ($group == $testGroup) { - $groupSuites[$group]->addTest($test); - } - } - } - } - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Extensions_TicketListener - * @author Sean Coates - * @author Raphael Stolt - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.4.0 - */ - -/** - * Base class for test listeners that interact with an issue tracker. - * - * @package PHPUnit - * @subpackage Extensions_TicketListener - * @author Sean Coates - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.4.0 - */ -abstract class PHPUnit_Extensions_TicketListener implements PHPUnit_Framework_TestListener -{ - /** - * @var array - */ - protected $ticketCounts = array(); - - /** - * @var boolean - */ - protected $ran = false; - - /** - * An error occurred. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * A failure occurred. - * - * @param PHPUnit_Framework_Test $test - * @param PHPUnit_Framework_AssertionFailedError $e - * @param float $time - */ - public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) - { - } - - /** - * Incomplete test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - */ - public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * Risky test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 4.0.0 - */ - public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * Skipped test. - * - * @param PHPUnit_Framework_Test $test - * @param Exception $e - * @param float $time - * @since Method available since Release 3.0.0 - */ - public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) - { - } - - /** - * A test suite started. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function startTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test suite ended. - * - * @param PHPUnit_Framework_TestSuite $suite - * @since Method available since Release 2.2.0 - */ - public function endTestSuite(PHPUnit_Framework_TestSuite $suite) - { - } - - /** - * A test started. - * - * @param PHPUnit_Framework_Test $test - */ - public function startTest(PHPUnit_Framework_Test $test) - { - if (!$test instanceof PHPUnit_Framework_Warning) { - if ($this->ran) { - return; - } - - $name = $test->getName(false); - $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name); - - foreach ($tickets as $ticket) { - $this->ticketCounts[$ticket][$name] = 1; - } - - $this->ran = true; - } - } - - /** - * A test ended. - * - * @param PHPUnit_Framework_Test $test - * @param float $time - */ - public function endTest(PHPUnit_Framework_Test $test, $time) - { - if (!$test instanceof PHPUnit_Framework_Warning) { - if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { - $ifStatus = array('assigned', 'new', 'reopened'); - $newStatus = 'closed'; - $message = 'Automatically closed by PHPUnit (test passed).'; - $resolution = 'fixed'; - $cumulative = true; - } elseif ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) { - $ifStatus = array('closed'); - $newStatus = 'reopened'; - $message = 'Automatically reopened by PHPUnit (test failed).'; - $resolution = ''; - $cumulative = false; - } else { - return; - } - - $name = $test->getName(false); - $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name); - - foreach ($tickets as $ticket) { - // Remove this test from the totals (if it passed). - if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) { - unset($this->ticketCounts[$ticket][$name]); - } - - // Only close tickets if ALL referenced cases pass - // but reopen tickets if a single test fails. - if ($cumulative) { - // Determine number of to-pass tests: - if (count($this->ticketCounts[$ticket]) > 0) { - // There exist remaining test cases with this reference. - $adjustTicket = false; - } else { - // No remaining tickets, go ahead and adjust. - $adjustTicket = true; - } - } else { - $adjustTicket = true; - } - - $ticketInfo = $this->getTicketInfo($ticket); - - if ($adjustTicket && in_array($ticketInfo['status'], $ifStatus)) { - $this->updateTicket($ticket, $newStatus, $message, $resolution); - } - } - } - } - - abstract protected function getTicketInfo($ticketId = null); - abstract protected function updateTicket($ticketId, $newStatus, $message, $resolution); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Extensions_PhptTestCase - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 3.1.4 - */ - -/** - * Suite for .phpt test cases. - * - * @package PHPUnit - * @subpackage Extensions_PhptTestCase - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Class available since Release 3.1.4 - */ -class PHPUnit_Extensions_PhptTestSuite extends PHPUnit_Framework_TestSuite -{ - /** - * Constructs a new TestSuite for .phpt test cases. - * - * @param string $directory - * @param array $options Array with ini settings for the php instance run, - * key being the name if the setting, value the ini value. - * @throws PHPUnit_Framework_Exception - */ - public function __construct($directory, array $options = array()) - { - if (is_string($directory) && is_dir($directory)) { - $this->setName($directory); - - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, '.phpt'); - - foreach ($files as $file) { - $this->addTestFile($file, $options); - } - } else { - throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'directory name'); - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since File available since Release 4.0.0 - */ - -/** - * Marker interface for PHPUnit exceptions. - * - * @package PHPUnit - * @subpackage Framework - * @author Sebastian Bergmann - * @copyright 2001-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://www.phpunit.de/ - * @since Interface available since Release 4.0.0 - */ -interface PHPUnit_Exception -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.0.0 - */ - -/** - * Interface for code coverage drivers. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.0.0 - */ -interface PHP_CodeCoverage_Driver -{ - /** - * Start collection of code coverage information. - */ - public function start(); - - /** - * Stop collection of code coverage information. - * - * @return array - */ - public function stop(); -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.2.0 - */ - -/** - * Factory for PHP_CodeCoverage_Exception objects that are used to describe - * invalid arguments passed to a function or method. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.2.0 - */ -class PHP_CodeCoverage_Util_InvalidArgumentHelper -{ - /** - * @param integer $argument - * @param string $type - * @param mixed $value - */ - public static function factory($argument, $type, $value = null) - { - $stack = debug_backtrace(false); - - return new PHP_CodeCoverage_Exception( - sprintf( - 'Argument #%d%sof %s::%s() must be a %s', - $argument, - $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ', - $stack[1]['class'], - $stack[1]['function'], - $type - ) - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.0.0 - */ - -/** - * Filter for blacklisting and whitelisting of code coverage information. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.0.0 - */ -class PHP_CodeCoverage_Filter -{ - /** - * Source files that are blacklisted. - * - * @var array - */ - private $blacklistedFiles = array(); - - /** - * Source files that are whitelisted. - * - * @var array - */ - private $whitelistedFiles = array(); - - /** - * @var boolean - */ - private $blacklistPrefilled = false; - - /** - * A list of classes which are always blacklisted - * - * @var array - */ - public static $blacklistClassNames = array( - 'File_Iterator' => 1, - 'PHP_CodeCoverage' => 1, - 'PHP_Invoker' => 1, - 'PHP_Timer' => 1, - 'PHP_Token' => 1, - 'PHPUnit_Framework_TestCase' => 2, - 'PHPUnit_Extensions_Database_TestCase' => 2, - 'PHPUnit_Framework_MockObject_Generator' => 2, - 'PHPUnit_Extensions_SeleniumTestCase' => 2, - 'PHPUnit_Extensions_Story_TestCase' => 2, - 'Text_Template' => 1, - 'Symfony\Component\Yaml\Yaml' => 1, - 'SebastianBergmann\Diff\Diff' => 1, - 'SebastianBergmann\Environment\Runtime' => 1, - 'SebastianBergmann\Exporter\Exporter' => 1, - 'SebastianBergmann\Version' => 1, - 'Composer\Autoload\ClassLoader' => 1 - ); - - /** - * Adds a directory to the blacklist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->addFileToBlacklist($file); - } - } - - /** - * Adds a file to the blacklist. - * - * @param string $filename - */ - public function addFileToBlacklist($filename) - { - $this->blacklistedFiles[realpath($filename)] = true; - } - - /** - * Adds files to the blacklist. - * - * @param array $files - */ - public function addFilesToBlacklist(array $files) - { - foreach ($files as $file) { - $this->addFileToBlacklist($file); - } - } - - /** - * Removes a directory from the blacklist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->removeFileFromBlacklist($file); - } - } - - /** - * Removes a file from the blacklist. - * - * @param string $filename - */ - public function removeFileFromBlacklist($filename) - { - $filename = realpath($filename); - - if (isset($this->blacklistedFiles[$filename])) { - unset($this->blacklistedFiles[$filename]); - } - } - - /** - * Adds a directory to the whitelist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->addFileToWhitelist($file); - } - } - - /** - * Adds a file to the whitelist. - * - * @param string $filename - */ - public function addFileToWhitelist($filename) - { - $this->whitelistedFiles[realpath($filename)] = true; - } - - /** - * Adds files to the whitelist. - * - * @param array $files - */ - public function addFilesToWhitelist(array $files) - { - foreach ($files as $file) { - $this->addFileToWhitelist($file); - } - } - - /** - * Removes a directory from the whitelist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->removeFileFromWhitelist($file); - } - } - - /** - * Removes a file from the whitelist. - * - * @param string $filename - */ - public function removeFileFromWhitelist($filename) - { - $filename = realpath($filename); - - if (isset($this->whitelistedFiles[$filename])) { - unset($this->whitelistedFiles[$filename]); - } - } - - /** - * Checks whether a filename is a real filename. - * - * @param string $filename - */ - public function isFile($filename) - { - if ($filename == '-' || - strpos($filename, 'eval()\'d code') !== false || - strpos($filename, 'runtime-created function') !== false || - strpos($filename, 'runkit created function') !== false || - strpos($filename, 'assert code') !== false || - strpos($filename, 'regexp code') !== false) { - return false; - } - - return true; - } - - /** - * Checks whether or not a file is filtered. - * - * When the whitelist is empty (default), blacklisting is used. - * When the whitelist is not empty, whitelisting is used. - * - * @param string $filename - * @param boolean $ignoreWhitelist - * @return boolean - * @throws PHP_CodeCoverage_Exception - */ - public function isFiltered($filename) - { - if (!$this->isFile($filename)) { - return true; - } - - $filename = realpath($filename); - - if (!empty($this->whitelistedFiles)) { - return !isset($this->whitelistedFiles[$filename]); - } - - if (!$this->blacklistPrefilled) { - $this->prefillBlacklist(); - } - - return isset($this->blacklistedFiles[$filename]); - } - - /** - * Returns the list of blacklisted files. - * - * @return array - */ - public function getBlacklist() - { - return array_keys($this->blacklistedFiles); - } - - /** - * Returns the list of whitelisted files. - * - * @return array - */ - public function getWhitelist() - { - return array_keys($this->whitelistedFiles); - } - - /** - * Returns whether this filter has a whitelist. - * - * @return boolean - * @since Method available since Release 1.1.0 - */ - public function hasWhitelist() - { - return !empty($this->whitelistedFiles); - } - - /** - * @since Method available since Release 1.2.3 - */ - private function prefillBlacklist() - { - if (defined('__PHPUNIT_PHAR__')) { - $this->addFileToBlacklist(__PHPUNIT_PHAR__); - } - - foreach (self::$blacklistClassNames as $className => $parent) { - $this->addDirectoryContainingClassToBlacklist($className, $parent); - } - - $this->blacklistPrefilled = true; - } - - /** - * @param string $className - * @param integer $parent - * @since Method available since Release 1.2.3 - */ - private function addDirectoryContainingClassToBlacklist($className, $parent = 1) - { - if (!class_exists($className)) { - return; - } - - $reflector = new ReflectionClass($className); - $directory = $reflector->getFileName(); - - for ($i = 0; $i < $parent; $i++) { - $directory = dirname($directory); - } - - $this->addDirectoryToBlacklist($directory); - } - - /** - * Returns the blacklisted files. - * - * @return array - * @since Method available since Release 2.0.0 - */ - public function getBlacklistedFiles() - { - return $this->blacklistedFiles; - } - - /** - * Sets the blacklisted files. - * - * @param array $blacklistedFiles - * @since Method available since Release 2.0.0 - */ - public function setBlacklistedFiles($blacklistedFiles) - { - $this->blacklistedFiles = $blacklistedFiles; - } - - /** - * Returns the whitelisted files. - * - * @return array - * @since Method available since Release 2.0.0 - */ - public function getWhitelistedFiles() - { - return $this->whitelistedFiles; - } - - /** - * Sets the whitelisted files. - * - * @param array $whitelistedFiles - * @since Method available since Release 2.0.0 - */ - public function setWhitelistedFiles($whitelistedFiles) - { - $this->whitelistedFiles = $whitelistedFiles; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.0.0 - */ - -/** - * Driver for Xdebug's code coverage functionality. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.0.0 - * @codeCoverageIgnore - */ -class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver -{ - /** - * Constructor. - */ - public function __construct() - { - if (!extension_loaded('xdebug')) { - throw new PHP_CodeCoverage_Exception('This driver requires Xdebug'); - } - - if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') && - !ini_get('xdebug.coverage_enable')) { - throw new PHP_CodeCoverage_Exception( - 'xdebug.coverage_enable=On has to be set in php.ini' - ); - } - } - - /** - * Start collection of code coverage information. - */ - public function start() - { - xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); - } - - /** - * Stop collection of code coverage information. - * - * @return array - */ - public function stop() - { - $data = xdebug_get_code_coverage(); - xdebug_stop_code_coverage(); - - return $this->cleanup($data); - } - - /** - * @param array $data - * @return array - * @since Method available since Release 2.0.0 - */ - private function cleanup(array $data) - { - foreach (array_keys($data) as $file) { - if (isset($data[$file][0])) { - unset($data[$file][0]); - } - - if (file_exists($file)) { - $numLines = $this->getNumberOfLinesInFile($file); - - foreach (array_keys($data[$file]) as $line) { - if (isset($data[$file][$line]) && $line > $numLines) { - unset($data[$file][$line]); - } - } - } - } - - return $data; - } - - /** - * @param string $file - * @return integer - * @since Method available since Release 2.0.0 - */ - private function getNumberOfLinesInFile($file) - { - $buffer = file_get_contents($file); - $lines = substr_count($buffer, "\n"); - - if (substr($buffer, -1) !== "\n") { - $lines++; - } - - return $lines; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.3.0 - */ - -/** - * Driver for HHVM's code coverage functionality. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.3.0 - * @codeCoverageIgnore - */ -class PHP_CodeCoverage_Driver_HHVM implements PHP_CodeCoverage_Driver -{ - /** - * Constructor. - */ - public function __construct() - { - if (!defined('HHVM_VERSION')) { - throw new PHP_CodeCoverage_Exception('This driver requires HHVM'); - } - } - - /** - * Start collection of code coverage information. - */ - public function start() - { - fb_enable_code_coverage(); - } - - /** - * Stop collection of code coverage information. - * - * @return array - */ - public function stop() - { - $codeCoverage = fb_get_code_coverage(TRUE); - - fb_disable_code_coverage(); - - return $codeCoverage; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 2.0.0 - */ - -/** - * Exception that is raised when code is unintentionally covered. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Exception_UnintentionallyCoveredCode extends PHP_CodeCoverage_Exception -{ -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.0.0 - */ - -/** - * Utility methods. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.0.0 - */ -class PHP_CodeCoverage_Util -{ - /** - * @param float $a - * @param float $b - * @return float ($a / $b) * 100 - */ - public static function percent($a, $b, $asString = false, $fixedWidth = false) - { - if ($asString && $b == 0) { - return ''; - } - - if ($b > 0) { - $percent = ($a / $b) * 100; - } else { - $percent = 100; - } - - if ($asString) { - if ($fixedWidth) { - return sprintf('%6.2F%%', $percent); - } - - return sprintf('%01.2F%%', $percent); - } else { - return $percent; - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.1.0 - */ - -/** - * Uses var_export() to write a PHP_CodeCoverage object to a file. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @author uyga - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_PHP -{ - /** - * @param PHP_CodeCoverage $coverage - * @param string $target - * @return string - */ - public function process(PHP_CodeCoverage $coverage, $target = null) - { - $filter = $coverage->filter(); - - $output = sprintf( - 'setData(%s); -$coverage->setTests(%s); - -$filter = $coverage->filter(); -$filter->setBlacklistedFiles(%s); -$filter->setWhitelistedFiles(%s); - -return $coverage;', - var_export($coverage->getData(true), 1), - var_export($coverage->getTests(), 1), - var_export($filter->getBlacklistedFiles(), 1), - var_export($filter->getWhitelistedFiles(), 1) - ); - - if ($target !== null) { - return file_put_contents($target, $output); - } else { - return $output; - } - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Arne Blankerts - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 2.0.0 - */ - -/** - * @category PHP - * @package CodeCoverage - * @author Arne Blankerts - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML -{ - /** - * @var string - */ - private $target; - - /** - * @var PHP_CodeCoverage_Report_XML_Project - */ - private $project; - - public function process(PHP_CodeCoverage $coverage, $target) - { - if (substr($target, -1, 1) != DIRECTORY_SEPARATOR) { - $target .= DIRECTORY_SEPARATOR; - } - - $this->target = $target; - $this->initTargetDirectory($target); - - $report = $coverage->getReport(); - - $this->project = new PHP_CodeCoverage_Report_XML_Project( - $coverage->getReport()->getName() - ); - - $this->processTests($coverage->getTests()); - $this->processDirectory($report, $this->project); - - $index = $this->project->asDom(); - $index->formatOutput = true; - $index->preserveWhiteSpace = false; - $index->save($target . '/index.xml'); - } - - private function initTargetDirectory($dir) - { - if (file_exists($dir)) { - if (!is_dir($dir)) { - throw new PHP_CodeCoverage_Exception( - "'$dir' exists but is not a directory." - ); - } - - if (!is_writable($dir)) { - throw new PHP_CodeCoverage_Exception( - "'$dir' exists but is not writable." - ); - } - } elseif (!@mkdir($dir, 0777, true)) { - throw new PHP_CodeCoverage_Exception( - "'$dir' could not be created." - ); - } - } - - private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context) - { - $dirObject = $context->addDirectory($directory->getName()); - - $this->setTotals($directory, $dirObject->getTotals()); - - foreach ($directory as $node) { - if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { - $this->processDirectory($node, $dirObject); - continue; - } - - if ($node instanceof PHP_CodeCoverage_Report_Node_File) { - $this->processFile($node, $dirObject); - continue; - } - - throw new PHP_CodeCoverage_Exception( - 'Unknown node type for XML report' - ); - } - } - - private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context) - { - $fileObject = $context->addFile( - $file->getName(), - $file->getId() . '.xml' - ); - - $this->setTotals($file, $fileObject->getTotals()); - - $fileReport = new PHP_CodeCoverage_Report_XML_File_Report( - $file->getName() - ); - - $this->setTotals($file, $fileReport->getTotals()); - - foreach ($file->getClassesAndTraits() as $unit) { - $this->processUnit($unit, $fileReport); - } - - foreach ($file->getFunctions() as $function) { - $this->processFunction($function, $fileReport); - } - - foreach ($file->getCoverageData() as $line => $tests) { - if (!is_array($tests) || count($tests) == 0) { - continue; - } - - $coverage = $fileReport->getLineCoverage($line); - - foreach ($tests as $test) { - $coverage->addTest($test); - } - - $coverage->finalize(); - } - - $this->initTargetDirectory( - $this->target . dirname($file->getId()) . '/' - ); - - $fileDom = $fileReport->asDom(); - $fileDom->formatOutput = true; - $fileDom->preserveWhiteSpace = false; - $fileDom->save($this->target . $file->getId() . '.xml'); - } - - private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report) - { - if (isset($unit['className'])) { - $unitObject = $report->getClassObject($unit['className']); - } else { - $unitObject = $report->getTraitObject($unit['traitName']); - } - - $unitObject->setLines( - $unit['startLine'], - $unit['executableLines'], - $unit['executedLines'] - ); - - $unitObject->setCrap($unit['crap']); - - $unitObject->setPackage( - $unit['package']['fullPackage'], - $unit['package']['package'], - $unit['package']['subpackage'], - $unit['package']['category'] - ); - - $unitObject->setNamespace($unit['package']['namespace']); - - foreach ($unit['methods'] as $method) { - $methodObject = $unitObject->addMethod($method['methodName']); - $methodObject->setSignature($method['signature']); - $methodObject->setLines($method['startLine'], $method['endLine']); - $methodObject->setCrap($method['crap']); - $methodObject->setTotals( - $method['executableLines'], - $method['executedLines'], - $method['coverage'] - ); - } - } - - private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report) - { - $functionObject = $report->getFunctionObject($function['functionName']); - - $functionObject->setSignature($function['signature']); - $functionObject->setLines($function['startLine']); - $functionObject->setCrap($function['crap']); - $functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']); - } - - private function processTests(array $tests) - { - $testsObject = $this->project->getTests(); - - foreach ($tests as $test => $result) { - if ($test == 'UNCOVERED_FILES_FROM_WHITELIST') { - continue; - } - - $testsObject->addTest($test, $result); - } - } - - private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals) - { - $loc = $node->getLinesOfCode(); - - $totals->setNumLines( - $loc['loc'], - $loc['cloc'], - $loc['ncloc'], - $node->getNumExecutableLines(), - $node->getNumExecutedLines() - ); - - $totals->setNumClasses( - $node->getNumClasses(), - $node->getNumTestedClasses() - ); - - $totals->setNumTraits( - $node->getNumTraits(), - $node->getNumTestedTraits() - ); - - $totals->setNumMethods( - $node->getNumMethods(), - $node->getNumTestedMethods() - ); - - $totals->setNumFunctions( - $node->getNumFunctions(), - $node->getNumTestedFunctions() - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.1.0 - */ - -// @codeCoverageIgnoreStart -if (!defined('T_TRAIT')) { - define('T_TRAIT', 1001); -} - -if (!defined('T_INSTEADOF')) { - define('T_INSTEADOF', 1002); -} - -if (!defined('T_CALLABLE')) { - define('T_CALLABLE', 1003); -} - -if (!defined('T_FINALLY')) { - define('T_FINALLY', 1004); -} - -if (!defined('T_YIELD')) { - define('T_YIELD', 1005); -} -// @codeCoverageIgnoreEnd - -/** - * Renders a PHP_CodeCoverage_Report_Node_File node. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer -{ - /** - * Constructor. - * - * @param string $templatePath - * @param string $generator - * @param string $date - * @param integer $lowUpperBound - * @param integer $highLowerBound - */ - public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) - { - parent::__construct( - $templatePath, - $generator, - $date, - $lowUpperBound, - $highLowerBound - ); - } - - /** - * @param PHP_CodeCoverage_Report_Node_File $node - * @param string $file - */ - public function render(PHP_CodeCoverage_Report_Node_File $node, $file) - { - $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}'); - - $template->setVar( - array( - 'items' => $this->renderItems($node), - 'lines' => $this->renderSource($node) - ) - ); - - $this->setCommonTemplateVariables($template, $node); - - $template->renderTo($file); - } - - /** - * @param PHP_CodeCoverage_Report_Node_File $node - * @return string - */ - protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) - { - $template = new Text_Template($this->templatePath . 'file_item.html', '{{', '}}'); - - $methodItemTemplate = new Text_Template( - $this->templatePath . 'method_item.html', '{{', '}}' - ); - - $items = $this->renderItemTemplate( - $template, - array( - 'name' => 'Total', - 'numClasses' => $node->getNumClassesAndTraits(), - 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), - 'numMethods' => $node->getNumMethods(), - 'numTestedMethods' => $node->getNumTestedMethods(), - 'linesExecutedPercent' => $node->getLineExecutedPercent(false), - 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(), - 'numExecutedLines' => $node->getNumExecutedLines(), - 'numExecutableLines' => $node->getNumExecutableLines(), - 'testedMethodsPercent' => $node->getTestedMethodsPercent(false), - 'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(), - 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), - 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(), - 'crap' => 'CRAP' - ) - ); - - $items .= $this->renderFunctionItems( - $node->getFunctions(), - $methodItemTemplate - ); - - $items .= $this->renderTraitOrClassItems( - $node->getTraits(), - $template, - $methodItemTemplate - ); - - $items .= $this->renderTraitOrClassItems( - $node->getClasses(), - $template, - $methodItemTemplate - ); - - return $items; - } - - /** - * @param array $items - * @param Text_Template $template - * @param Text_Template $methodItemTemplate - * @return string - */ - protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate) - { - if (empty($items)) { - return ''; - } - - $buffer = ''; - - foreach ($items as $name => $item) { - $numMethods = count($item['methods']); - $numTestedMethods = 0; - - foreach ($item['methods'] as $method) { - if ($method['executedLines'] == $method['executableLines']) { - $numTestedMethods++; - } - } - - $buffer .= $this->renderItemTemplate( - $template, - array( - 'name' => $name, - 'numClasses' => 1, - 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0, - 'numMethods' => $numMethods, - 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( - $item['executedLines'], - $item['executableLines'], - false - ), - 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( - $item['executedLines'], - $item['executableLines'], - true - ), - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( - $numTestedMethods, - $numMethods, - false - ), - 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( - $numTestedMethods, - $numMethods, - true - ), - 'testedClassesPercent' => PHP_CodeCoverage_Util::percent( - $numTestedMethods == $numMethods ? 1 : 0, - 1, - false - ), - 'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent( - $numTestedMethods == $numMethods ? 1 : 0, - 1, - true - ), - 'crap' => $item['crap'] - ) - ); - - foreach ($item['methods'] as $method) { - $buffer .= $this->renderFunctionOrMethodItem( - $methodItemTemplate, $method, ' ' - ); - } - } - - return $buffer; - } - - /** - * @param array $functions - * @param Text_Template $template - * @return string - */ - protected function renderFunctionItems(array $functions, Text_Template $template) - { - if (empty($functions)) { - return ''; - } - - $buffer = ''; - - foreach ($functions as $function) { - $buffer .= $this->renderFunctionOrMethodItem( - $template, $function - ); - } - - return $buffer; - } - - /** - * @param Text_Template $template - * @return string - */ - protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '') - { - $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0; - - return $this->renderItemTemplate( - $template, - array( - 'name' => sprintf( - '%s%s', - $indent, - $item['startLine'], - htmlspecialchars($item['signature']) - ), - 'numMethods' => 1, - 'numTestedMethods' => $numTestedItems, - 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( - $item['executedLines'], - $item['executableLines'], - false - ), - 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( - $item['executedLines'], - $item['executableLines'], - true - ), - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( - $numTestedItems, - 1, - false - ), - 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( - $numTestedItems, - 1, - true - ), - 'crap' => $item['crap'] - ) - ); - } - - /** - * @param PHP_CodeCoverage_Report_Node_File $node - * @return string - */ - protected function renderSource(PHP_CodeCoverage_Report_Node_File $node) - { - $coverageData = $node->getCoverageData(); - $testData = $node->getTestData(); - $codeLines = $this->loadFile($node->getPath()); - $lines = ''; - $i = 1; - - foreach ($codeLines as $line) { - $numTests = ''; - $trClass = ''; - $popoverContent = ''; - $popoverTitle = ''; - - if (array_key_exists($i, $coverageData)) { - $numTests = count($coverageData[$i]); - - if ($coverageData[$i] === null) { - $trClass = ' class="warning"'; - } elseif ($numTests == 0) { - $trClass = ' class="danger"'; - } else { - $trClass = ' class="success popin"'; - $popoverContent = '
      '; - - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover line ' . $i; - } else { - $popoverTitle = '1 test covers line ' . $i; - } - - foreach ($coverageData[$i] as $test) { - switch ($testData[$test]) { - case 0: { - $testCSS = ' class="success"'; - } - break; - - case 1: - case 2: { - $testCSS = ' class="warning"'; - } - break; - - case 3: { - $testCSS = ' class="danger"'; - } - break; - - case 4: { - $testCSS = ' class="danger"'; - } - break; - - default: { - $testCSS = ''; - } - } - - $popoverContent .= sprintf( - '%s', - - $testCSS, - htmlspecialchars($test) - ); - } - - $popoverContent .= '
    '; - } - } - - if (!empty($popoverTitle)) { - $popover = sprintf( - ' data-title="%s" data-content="%s" data-placement="bottom" data-html="true"', - $popoverTitle, - htmlspecialchars($popoverContent) - ); - } else { - $popover = ''; - } - - $lines .= sprintf( - ' %s' . "\n", - $trClass, - $popover, - $i, - $i, - $i, - $line - ); - - $i++; - } - - return $lines; - } - - /** - * @param string $file - * @return array - */ - protected function loadFile($file) - { - $buffer = file_get_contents($file); - $tokens = token_get_all($buffer); - $result = array(''); - $i = 0; - $stringFlag = false; - $fileEndsWithNewLine = substr($buffer, -1) == "\n"; - - unset($buffer); - - foreach ($tokens as $j => $token) { - if (is_string($token)) { - if ($token === '"' && $tokens[$j - 1] !== '\\') { - $result[$i] .= sprintf( - '%s', - - htmlspecialchars($token) - ); - - $stringFlag = !$stringFlag; - } else { - $result[$i] .= sprintf( - '%s', - - htmlspecialchars($token) - ); - } - - continue; - } - - list ($token, $value) = $token; - - $value = str_replace( - array("\t", ' '), - array('    ', ' '), - htmlspecialchars($value) - ); - - if ($value === "\n") { - $result[++$i] = ''; - } else { - $lines = explode("\n", $value); - - foreach ($lines as $jj => $line) { - $line = trim($line); - - if ($line !== '') { - if ($stringFlag) { - $colour = 'string'; - } else { - switch ($token) { - case T_INLINE_HTML: { - $colour = 'html'; - } - break; - - case T_COMMENT: - case T_DOC_COMMENT: { - $colour = 'comment'; - } - break; - - case T_ABSTRACT: - case T_ARRAY: - case T_AS: - case T_BREAK: - case T_CALLABLE: - case T_CASE: - case T_CATCH: - case T_CLASS: - case T_CLONE: - case T_CONTINUE: - case T_DEFAULT: - case T_ECHO: - case T_ELSE: - case T_ELSEIF: - case T_EMPTY: - case T_ENDDECLARE: - case T_ENDFOR: - case T_ENDFOREACH: - case T_ENDIF: - case T_ENDSWITCH: - case T_ENDWHILE: - case T_EXIT: - case T_EXTENDS: - case T_FINAL: - case T_FINALLY: - case T_FOREACH: - case T_FUNCTION: - case T_GLOBAL: - case T_IF: - case T_IMPLEMENTS: - case T_INCLUDE: - case T_INCLUDE_ONCE: - case T_INSTANCEOF: - case T_INSTEADOF: - case T_INTERFACE: - case T_ISSET: - case T_LOGICAL_AND: - case T_LOGICAL_OR: - case T_LOGICAL_XOR: - case T_NAMESPACE: - case T_NEW: - case T_PRIVATE: - case T_PROTECTED: - case T_PUBLIC: - case T_REQUIRE: - case T_REQUIRE_ONCE: - case T_RETURN: - case T_STATIC: - case T_THROW: - case T_TRAIT: - case T_TRY: - case T_UNSET: - case T_USE: - case T_VAR: - case T_WHILE: - case T_YIELD: { - $colour = 'keyword'; - } - break; - - default: { - $colour = 'default'; - } - } - } - - $result[$i] .= sprintf( - '%s', - - $colour, - $line - ); - } - - if (isset($lines[$jj + 1])) { - $result[++$i] = ''; - } - } - } - } - - if ($fileEndsWithNewLine) { - unset($result[count($result)-1]); - } - - return $result; - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.1.0 - */ - -/** - * Renders a PHP_CodeCoverage_Report_Node_Directory node. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_HTML_Renderer_Directory extends PHP_CodeCoverage_Report_HTML_Renderer -{ - /** - * @param PHP_CodeCoverage_Report_Node_Directory $node - * @param string $file - */ - public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) - { - $template = new Text_Template($this->templatePath . 'directory.html', '{{', '}}'); - - $this->setCommonTemplateVariables($template, $node); - - $items = $this->renderItem($node, true); - - foreach ($node->getDirectories() as $item) { - $items .= $this->renderItem($item); - } - - foreach ($node->getFiles() as $item) { - $items .= $this->renderItem($item); - } - - $template->setVar( - array( - 'id' => $node->getId(), - 'items' => $items - ) - ); - - $template->renderTo($file); - } - - /** - * @param PHP_CodeCoverage_Report_Node $item - * @param boolean $total - * @return string - */ - protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false) - { - $data = array( - 'numClasses' => $item->getNumClassesAndTraits(), - 'numTestedClasses' => $item->getNumTestedClassesAndTraits(), - 'numMethods' => $item->getNumMethods(), - 'numTestedMethods' => $item->getNumTestedMethods(), - 'linesExecutedPercent' => $item->getLineExecutedPercent(false), - 'linesExecutedPercentAsString' => $item->getLineExecutedPercent(), - 'numExecutedLines' => $item->getNumExecutedLines(), - 'numExecutableLines' => $item->getNumExecutableLines(), - 'testedMethodsPercent' => $item->getTestedMethodsPercent(false), - 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(), - 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false), - 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent() - ); - - if ($total) { - $data['name'] = 'Total'; - } else { - if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) { - $data['name'] = sprintf( - '%s', - $item->getName(), - $item->getName() - ); - - $data['icon'] = ' '; - } else { - $data['name'] = sprintf( - '%s', - $item->getName(), - $item->getName() - ); - - $data['icon'] = ' '; - } - } - - return $this->renderItemTemplate( - new Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'), - $data - ); - } -} -. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * * Neither the name of Sebastian Bergmann nor the names of his - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since File available since Release 1.1.0 - */ - -/** - * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node. - * - * @category PHP - * @package CodeCoverage - * @author Sebastian Bergmann - * @copyright 2009-2014 Sebastian Bergmann - * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License - * @link http://github.com/sebastianbergmann/php-code-coverage - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer -{ - /** - * @param PHP_CodeCoverage_Report_Node_Directory $node - * @param string $file - */ - public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) - { - $classes = $node->getClassesAndTraits(); - $template = new Text_Template( - $this->templatePath . 'dashboard.html', '{{', '}}' - ); - - $this->setCommonTemplateVariables($template, $node); - - $complexity = $this->complexity($classes); - $coverageDistribution = $this->coverageDistribution($classes); - $insufficientCoverage = $this->insufficientCoverage($classes); - $projectRisks = $this->projectRisks($classes); - - $template->setVar( - array( - 'insufficient_coverage_classes' => $insufficientCoverage['class'], - 'insufficient_coverage_methods' => $insufficientCoverage['method'], - 'project_risks_classes' => $projectRisks['class'], - 'project_risks_methods' => $projectRisks['method'], - 'complexity_class' => $complexity['class'], - 'complexity_method' => $complexity['method'], - 'class_coverage_distribution' => $coverageDistribution['class'], - 'method_coverage_distribution' => $coverageDistribution['method'] - ) - ); - - $template->renderTo($file); - } - - /** - * Returns the data for the Class/Method Complexity charts. - * - * @param array $classes - * @return array - */ - protected function complexity(array $classes) - { - $result = array('class' => array(), 'method' => array()); - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($className != '*') { - $methodName = $className . '::' . $methodName; - } - - $result['method'][] = array( - $method['coverage'], - $method['ccn'], - sprintf( - '%s', - $method['link'], - $methodName - ) - ); - } - - $result['class'][] = array( - $class['coverage'], - $class['ccn'], - sprintf( - '%s', - $class['link'], - $className - ) - ); - } - - return array( - 'class' => json_encode($result['class']), - 'method' => json_encode($result['method']) - ); - } - - /** - * Returns the data for the Class / Method Coverage Distribution chart. - * - * @param array $classes - * @return array - */ - protected function coverageDistribution(array $classes) - { - $result = array( - 'class' => array( - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0 - ), - 'method' => array( - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0 - ) - ); - - foreach ($classes as $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] == 0) { - $result['method']['0%']++; - } elseif ($method['coverage'] == 100) { - $result['method']['100%']++; - } else { - $key = floor($method['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['method'][$key]++; - } - } - - if ($class['coverage'] == 0) { - $result['class']['0%']++; - } elseif ($class['coverage'] == 100) { - $result['class']['100%']++; - } else { - $key = floor($class['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['class'][$key]++; - } - } - - return array( - 'class' => json_encode(array_values($result['class'])), - 'method' => json_encode(array_values($result['method'])) - ); - } - - /** - * Returns the classes / methods with insufficient coverage. - * - * @param array $classes - * @return array - */ - protected function insufficientCoverage(array $classes) - { - $leastTestedClasses = array(); - $leastTestedMethods = array(); - $result = array('class' => '', 'method' => ''); - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->highLowerBound) { - if ($className != '*') { - $key = $className . '::' . $methodName; - } else { - $key = $methodName; - } - - $leastTestedMethods[$key] = $method['coverage']; - } - } - - if ($class['coverage'] < $this->highLowerBound) { - $leastTestedClasses[$className] = $class['coverage']; - } - } - - asort($leastTestedClasses); - asort($leastTestedMethods); - - foreach ($leastTestedClasses as $className => $coverage) { - $result['class'] .= sprintf( - ' %s%d%%' . "\n", - $classes[$className]['link'], - $className, - $coverage - ); - } - - foreach ($leastTestedMethods as $methodName => $coverage) { - list($class, $method) = explode('::', $methodName); - - $result['method'] .= sprintf( - ' %s%d%%' . "\n", - $classes[$class]['methods'][$method]['link'], - $methodName, - $coverage - ); - } - - return $result; - } - - /** - * Returns the project risks according to the CRAP index. - * - * @param array $classes - * @return array - */ - protected function projectRisks(array $classes) - { - $classRisks = array(); - $methodRisks = array(); - $result = array('class' => '', 'method' => ''); - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->highLowerBound && - $method['ccn'] > 1) { - if ($className != '*') { - $key = $className . '::' . $methodName; - } else { - $key = $methodName; - } - - $methodRisks[$key] = $method['crap']; - } - } - - if ($class['coverage'] < $this->highLowerBound && - $class['ccn'] > count($class['methods'])) { - $classRisks[$className] = $class['crap']; - } - } - - arsort($classRisks); - arsort($methodRisks); - - foreach ($classRisks as $className => $crap) { - $result['class'] .= sprintf( - ' %s%d' . "\n", - $classes[$className]['link'], - $className, - $crap - ); - } - - foreach ($methodRisks as $methodName => $crap) { - list($class, $method) = explode('::', $methodName); - - $result['method'] .= sprintf( - ' %s%d' . "\n", - $classes[$class]['methods'][$method]['link'], - $methodName, - $crap - ); - } - - return $result; - } - - protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) - { - return sprintf( - '
  • %s
  • ' . "\n" . - '
  • (Dashboard)
  • ' . "\n", - $node->getName() - ); - } -} - - - - - Code Coverage for {{full_path}} - - - - - - -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - - - - - - - - - - - - -{{items}} - -
     
    Code Coverage
     
    Lines
    Functions and Methods
    Classes and Traits
    - -
    - - - - - - - {{name}} - {{classes_bar}} -
    {{classes_tested_percent}}
    -
    {{classes_number}}
    - {{methods_bar}} -
    {{methods_tested_percent}}
    -
    {{methods_number}}
    - {{crap}} - {{lines_bar}} -
    {{lines_executed_percent}}
    -
    {{lines_number}}
    - - -/*! - -Holder - 2.3.1 - client side image placeholders -(c) 2012-2014 Ivan Malopinsky / http://imsky.co - -Provided under the MIT License. -Commercial use requires attribution. - -*/ -var Holder = Holder || {}; -(function (app, win) { -var system_config = { - use_svg: false, - use_canvas: false, - use_fallback: false -}; -var instance_config = {}; -var preempted = false; -canvas = document.createElement('canvas'); -var dpr = 1, bsr = 1; -var resizable_images = []; - -if (!canvas.getContext) { - system_config.use_fallback = true; -} else { - if (canvas.toDataURL("image/png") - .indexOf("data:image/png") < 0) { - //Android doesn't support data URI - system_config.use_fallback = true; - } else { - var ctx = canvas.getContext("2d"); - } -} - -if(!!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect){ - system_config.use_svg = true; - system_config.use_canvas = false; -} - -if(!system_config.use_fallback){ - dpr = window.devicePixelRatio || 1, - bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; -} - -var ratio = dpr / bsr; - -var settings = { - domain: "holder.js", - images: "img", - bgnodes: ".holderjs", - themes: { - "gray": { - background: "#eee", - foreground: "#aaa", - size: 12 - }, - "social": { - background: "#3a5a97", - foreground: "#fff", - size: 12 - }, - "industrial": { - background: "#434A52", - foreground: "#C2F200", - size: 12 - }, - "sky": { - background: "#0D8FDB", - foreground: "#fff", - size: 12 - }, - "vine": { - background: "#39DBAC", - foreground: "#1E292C", - size: 12 - }, - "lava": { - background: "#F8591A", - foreground: "#1C2846", - size: 12 - } - }, - stylesheet: "" -}; -app.flags = { - dimensions: { - regex: /^(\d+)x(\d+)$/, - output: function (val) { - var exec = this.regex.exec(val); - return { - width: +exec[1], - height: +exec[2] - } - } - }, - fluid: { - regex: /^([0-9%]+)x([0-9%]+)$/, - output: function (val) { - var exec = this.regex.exec(val); - return { - width: exec[1], - height: exec[2] - } - } - }, - colors: { - regex: /#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i, - output: function (val) { - var exec = this.regex.exec(val); - return { - size: settings.themes.gray.size, - foreground: "#" + exec[2], - background: "#" + exec[1] - } - } - }, - text: { - regex: /text\:(.*)/, - output: function (val) { - return this.regex.exec(val)[1]; - } - }, - font: { - regex: /font\:(.*)/, - output: function (val) { - return this.regex.exec(val)[1]; - } - }, - auto: { - regex: /^auto$/ - }, - textmode: { - regex: /textmode\:(.*)/, - output: function(val){ - return this.regex.exec(val)[1]; - } - } -} - -function text_size(width, height, template) { - height = parseInt(height, 10); - width = parseInt(width, 10); - var bigSide = Math.max(height, width) - var smallSide = Math.min(height, width) - var scale = 1 / 12; - var newHeight = Math.min(smallSide * 0.75, 0.75 * bigSide * scale); - return { - height: Math.round(Math.max(template.size, newHeight)) - } -} - -var svg_el = (function(){ - //Prevent IE <9 from initializing SVG renderer - if(!window.XMLSerializer) return; - var serializer = new XMLSerializer(); - var svg_ns = "http://www.w3.org/2000/svg" - var svg = document.createElementNS(svg_ns, "svg"); - //IE throws an exception if this is set and Chrome requires it to be set - if(svg.webkitMatchesSelector){ - svg.setAttribute("xmlns", "http://www.w3.org/2000/svg") - } - var bg_el = document.createElementNS(svg_ns, "rect") - var text_el = document.createElementNS(svg_ns, "text") - var textnode_el = document.createTextNode(null) - text_el.setAttribute("text-anchor", "middle") - text_el.appendChild(textnode_el) - svg.appendChild(bg_el) - svg.appendChild(text_el) - - return function(props){ - svg.setAttribute("width",props.width); - svg.setAttribute("height", props.height); - bg_el.setAttribute("width", props.width); - bg_el.setAttribute("height", props.height); - bg_el.setAttribute("fill", props.template.background); - text_el.setAttribute("x", props.width/2) - text_el.setAttribute("y", props.height/2) - textnode_el.nodeValue=props.text - text_el.setAttribute("style", css_properties({ - "fill": props.template.foreground, - "font-weight": "bold", - "font-size": props.text_height+"px", - "font-family":props.font, - "dominant-baseline":"central" - })) - return serializer.serializeToString(svg) - } -})() - -function css_properties(props){ - var ret = []; - for(p in props){ - if(props.hasOwnProperty(p)){ - ret.push(p+":"+props[p]) - } - } - return ret.join(";") -} - -function draw_canvas(args) { - var ctx = args.ctx, - dimensions = args.dimensions, - template = args.template, - ratio = args.ratio, - holder = args.holder, - literal = holder.textmode == "literal", - exact = holder.textmode == "exact"; - - var ts = text_size(dimensions.width, dimensions.height, template); - var text_height = ts.height; - var width = dimensions.width * ratio, - height = dimensions.height * ratio; - var font = template.font ? template.font : "Arial,Helvetica,sans-serif"; - canvas.width = width; - canvas.height = height; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fillStyle = template.background; - ctx.fillRect(0, 0, width, height); - ctx.fillStyle = template.foreground; - ctx.font = "bold " + text_height + "px " + font; - var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); - if (literal) { - var dimensions = holder.dimensions; - text = dimensions.width + "x" + dimensions.height; - } - else if(exact && holder.exact_dimensions){ - var dimensions = holder.exact_dimensions; - text = (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); - } - var text_width = ctx.measureText(text).width; - if (text_width / width >= 0.75) { - text_height = Math.floor(text_height * 0.75 * (width / text_width)); - } - //Resetting font size if necessary - ctx.font = "bold " + (text_height * ratio) + "px " + font; - ctx.fillText(text, (width / 2), (height / 2), width); - return canvas.toDataURL("image/png"); -} - -function draw_svg(args){ - var dimensions = args.dimensions, - template = args.template, - holder = args.holder, - literal = holder.textmode == "literal", - exact = holder.textmode == "exact"; - - var ts = text_size(dimensions.width, dimensions.height, template); - var text_height = ts.height; - var width = dimensions.width, - height = dimensions.height; - - var font = template.font ? template.font : "Arial,Helvetica,sans-serif"; - var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); - - if (literal) { - var dimensions = holder.dimensions; - text = dimensions.width + "x" + dimensions.height; - } - else if(exact && holder.exact_dimensions){ - var dimensions = holder.exact_dimensions; - text = (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height)); - } - var string = svg_el({ - text: text, - width:width, - height:height, - text_height:text_height, - font:font, - template:template - }) - return "data:image/svg+xml;base64,"+btoa(string); -} - -function draw(args) { - if(instance_config.use_canvas && !instance_config.use_svg){ - return draw_canvas(args); - } - else{ - return draw_svg(args); - } -} - -function render(mode, el, holder, src) { - var dimensions = holder.dimensions, - theme = holder.theme, - text = holder.text ? decodeURIComponent(holder.text) : holder.text; - var dimensions_caption = dimensions.width + "x" + dimensions.height; - theme = (text ? extend(theme, { - text: text - }) : theme); - theme = (holder.font ? extend(theme, { - font: holder.font - }) : theme); - el.setAttribute("data-src", src); - holder.theme = theme; - el.holder_data = holder; - - if (mode == "image") { - el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); - if (instance_config.use_fallback || !holder.auto) { - el.style.width = dimensions.width + "px"; - el.style.height = dimensions.height + "px"; - } - if (instance_config.use_fallback) { - el.style.backgroundColor = theme.background; - } else { - el.setAttribute("src", draw({ctx: ctx, dimensions: dimensions, template: theme, ratio:ratio, holder: holder})); - - if(holder.textmode && holder.textmode == "exact"){ - resizable_images.push(el); - resizable_update(el); - } - - } - } else if (mode == "background") { - if (!instance_config.use_fallback) { - el.style.backgroundImage = "url(" + draw({ctx:ctx, dimensions: dimensions, template: theme, ratio: ratio, holder: holder}) + ")"; - el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px"; - } - } else if (mode == "fluid") { - el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); - if (dimensions.height.slice(-1) == "%") { - el.style.height = dimensions.height - } else if(holder.auto == null || !holder.auto){ - el.style.height = dimensions.height + "px" - } - if (dimensions.width.slice(-1) == "%") { - el.style.width = dimensions.width - } else if(holder.auto == null || !holder.auto){ - el.style.width = dimensions.width + "px" - } - if (el.style.display == "inline" || el.style.display === "" || el.style.display == "none") { - el.style.display = "block"; - } - - set_initial_dimensions(el) - - if (instance_config.use_fallback) { - el.style.backgroundColor = theme.background; - } else { - resizable_images.push(el); - resizable_update(el); - } - } -} - -function dimension_check(el, callback) { - var dimensions = { - height: el.clientHeight, - width: el.clientWidth - }; - if (!dimensions.height && !dimensions.width) { - el.setAttribute("data-holder-invisible", true) - callback.call(this, el) - } - else{ - el.removeAttribute("data-holder-invisible") - return dimensions; - } -} - -function set_initial_dimensions(el){ - if(el.holder_data){ - var dimensions = dimension_check(el, app.invisible_error_fn( set_initial_dimensions)) - if(dimensions){ - var holder = el.holder_data; - holder.initial_dimensions = dimensions; - holder.fluid_data = { - fluid_height: holder.dimensions.height.slice(-1) == "%", - fluid_width: holder.dimensions.width.slice(-1) == "%", - mode: null - } - if(holder.fluid_data.fluid_width && !holder.fluid_data.fluid_height){ - holder.fluid_data.mode = "width" - holder.fluid_data.ratio = holder.initial_dimensions.width / parseFloat(holder.dimensions.height) - } - else if(!holder.fluid_data.fluid_width && holder.fluid_data.fluid_height){ - holder.fluid_data.mode = "height"; - holder.fluid_data.ratio = parseFloat(holder.dimensions.width) / holder.initial_dimensions.height - } - } - } -} - -function resizable_update(element) { - var images; - if (element.nodeType == null) { - images = resizable_images; - } else { - images = [element] - } - for (var i in images) { - if (!images.hasOwnProperty(i)) { - continue; - } - var el = images[i] - if (el.holder_data) { - var holder = el.holder_data; - var dimensions = dimension_check(el, app.invisible_error_fn( resizable_update)) - if(dimensions){ - if(holder.fluid){ - if(holder.auto){ - switch(holder.fluid_data.mode){ - case "width": - dimensions.height = dimensions.width / holder.fluid_data.ratio; - break; - case "height": - dimensions.width = dimensions.height * holder.fluid_data.ratio; - break; - } - } - el.setAttribute("src", draw({ - ctx: ctx, - dimensions: dimensions, - template: holder.theme, - ratio: ratio, - holder: holder - })) - } - if(holder.textmode && holder.textmode == "exact"){ - holder.exact_dimensions = dimensions; - el.setAttribute("src", draw({ - ctx: ctx, - dimensions: holder.dimensions, - template: holder.theme, - ratio: ratio, - holder: holder - })) - } - } - } - } -} - -function parse_flags(flags, options) { - var ret = { - theme: extend(settings.themes.gray, {}) - }; - var render = false; - for (var fl = flags.length, j = 0; j < fl; j++) { - var flag = flags[j]; - if (app.flags.dimensions.match(flag)) { - render = true; - ret.dimensions = app.flags.dimensions.output(flag); - } else if (app.flags.fluid.match(flag)) { - render = true; - ret.dimensions = app.flags.fluid.output(flag); - ret.fluid = true; - } else if (app.flags.textmode.match(flag)) { - ret.textmode = app.flags.textmode.output(flag) - } else if (app.flags.colors.match(flag)) { - ret.theme = app.flags.colors.output(flag); - } else if (options.themes[flag]) { - //If a theme is specified, it will override custom colors - if(options.themes.hasOwnProperty(flag)){ - ret.theme = extend(options.themes[flag], {}); - } - } else if (app.flags.font.match(flag)) { - ret.font = app.flags.font.output(flag); - } else if (app.flags.auto.match(flag)) { - ret.auto = true; - } else if (app.flags.text.match(flag)) { - ret.text = app.flags.text.output(flag); - } - } - return render ? ret : false; -} - -for (var flag in app.flags) { - if (!app.flags.hasOwnProperty(flag)) continue; - app.flags[flag].match = function (val) { - return val.match(this.regex) - } -} - -app.invisible_error_fn = function(fn){ - return function(el){ - if(el.hasAttribute("data-holder-invisible")){ - throw new Error("Holder: invisible placeholder") - } - } -} - -app.add_theme = function (name, theme) { - name != null && theme != null && (settings.themes[name] = theme); - return app; -}; - -app.add_image = function (src, el) { - var node = selector(el); - if (node.length) { - for (var i = 0, l = node.length; i < l; i++) { - var img = document.createElement("img") - img.setAttribute("data-src", src); - node[i].appendChild(img); - } - } - return app; -}; - -app.run = function (o) { - instance_config = extend({}, system_config) - preempted = true; - - var options = extend(settings, o), - images = [], - imageNodes = [], - bgnodes = []; - - if(options.use_canvas != null && options.use_canvas){ - instance_config.use_canvas = true; - instance_config.use_svg = false; - } - - if (typeof (options.images) == "string") { - imageNodes = selector(options.images); - } else if (window.NodeList && options.images instanceof window.NodeList) { - imageNodes = options.images; - } else if (window.Node && options.images instanceof window.Node) { - imageNodes = [options.images]; - } else if(window.HTMLCollection && options.images instanceof window.HTMLCollection){ - imageNodes = options.images - } - - if (typeof (options.bgnodes) == "string") { - bgnodes = selector(options.bgnodes); - } else if (window.NodeList && options.elements instanceof window.NodeList) { - bgnodes = options.bgnodes; - } else if (window.Node && options.bgnodes instanceof window.Node) { - bgnodes = [options.bgnodes]; - } - for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]); - var holdercss = document.getElementById("holderjs-style"); - if (!holdercss) { - holdercss = document.createElement("style"); - holdercss.setAttribute("id", "holderjs-style"); - holdercss.type = "text/css"; - document.getElementsByTagName("head")[0].appendChild(holdercss); - } - if (!options.nocss) { - if (holdercss.styleSheet) { - holdercss.styleSheet.cssText += options.stylesheet; - } else { - holdercss.appendChild(document.createTextNode(options.stylesheet)); - } - } - var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)"); - for (var l = bgnodes.length, i = 0; i < l; i++) { - var src = window.getComputedStyle(bgnodes[i], null) - .getPropertyValue("background-image"); - var flags = src.match(cssregex); - var bgsrc = bgnodes[i].getAttribute("data-background-src"); - if (flags) { - var holder = parse_flags(flags[1].split("/"), options); - if (holder) { - render("background", bgnodes[i], holder, src); - } - } else if (bgsrc != null) { - var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1) - .split("/"), options); - if (holder) { - render("background", bgnodes[i], holder, src); - } - } - } - for (l = images.length, i = 0; i < l; i++) { - var attr_data_src, attr_src; - attr_src = attr_data_src = src = null; - try { - attr_src = images[i].getAttribute("src"); - attr_datasrc = images[i].getAttribute("data-src"); - } catch (e) {} - if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) { - src = attr_src; - } else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) { - src = attr_datasrc; - } - if (src) { - var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1).split("/"), options); - if (holder) { - if (holder.fluid) { - render("fluid", images[i], holder, src) - } else { - render("image", images[i], holder, src); - } - } - } - } - return app; -}; - -contentLoaded(win, function () { - if (window.addEventListener) { - window.addEventListener("resize", resizable_update, false); - window.addEventListener("orientationchange", resizable_update, false); - } else { - window.attachEvent("onresize", resizable_update) - } - preempted || app.run({}); -}); -if (typeof define === "function" && define.amd) { - define([], function () { - return app; - }); -} - -//github.com/davidchambers/Base64.js -(function(){function t(t){this.message=t}var e="undefined"!=typeof exports?exports:this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=Error(),t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-8*(a%1))){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),1==e.length%4)throw new t("'atob' failed");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(6&-2*a)):0)n=r.indexOf(n);return c})})(); - -//getElementsByClassName polyfill -document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;barticle,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d1)while(op||r>d||d3.event.relatedTarget&&d3.event.relatedTarget.ownerSVGElement===undefined||a){if(l&&d3.event.relatedTarget&&d3.event.relatedTarget.ownerSVGElement===undefined&&d3.event.relatedTarget.className.match(t.nvPointerEventsClass))return;u.elementMouseout({mouseX:n,mouseY:r}),c.renderGuideLine(null);return}var f=s.invert(n);u.elementMousemove({mouseX:n,mouseY:r,pointXValue:f}),d3.event.type==="dblclick"&&u.elementDblclick({mouseX:n,mouseY:r,pointXValue:f})}var h=d3.select(this),p=n||960,d=r||400,v=h.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([o]),m=v.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");m.append("g").attr("class","nv-interactiveGuideLine");if(!f)return;f.on("mousemove",g,!0).on("mouseout",g,!0).on("dblclick",g),c.renderGuideLine=function(t){if(!a)return;var n=v.select(".nv-interactiveGuideLine").selectAll("line").data(t!=null?[e.utils.NaNtoZero(t)]:[],String);n.enter().append("line").attr("class","nv-guideline").attr("x1",function(e){return e}).attr("x2",function(e){return e}).attr("y1",d).attr("y2",0),n.exit().remove()}})}var t=e.models.tooltip(),n=null,r=null,i={left:0,top:0},s=d3.scale.linear(),o=d3.scale.linear(),u=d3.dispatch("elementMousemove","elementMouseout","elementDblclick"),a=!0,f=null,l=navigator.userAgent.indexOf("MSIE")!==-1;return c.dispatch=u,c.tooltip=t,c.margin=function(e){return arguments.length?(i.top=typeof e.top!="undefined"?e.top:i.top,i.left=typeof e.left!="undefined"?e.left:i.left,c):i},c.width=function(e){return arguments.length?(n=e,c):n},c.height=function(e){return arguments.length?(r=e,c):r},c.xScale=function(e){return arguments.length?(s=e,c):s},c.showGuideLine=function(e){return arguments.length?(a=e,c):a},c.svgContainer=function(e){return arguments.length?(f=e,c):f},c},e.interactiveBisect=function(e,t,n){"use strict";if(!e instanceof Array)return null;typeof n!="function"&&(n=function(e,t){return e.x});var r=d3.bisector(n).left,i=d3.max([0,r(e,t)-1]),s=n(e[i],i);typeof s=="undefined"&&(s=i);if(s===t)return i;var o=d3.min([i+1,e.length-1]),u=n(e[o],o);return typeof u=="undefined"&&(u=o),Math.abs(u-t)>=Math.abs(s-t)?i:o},e.nearestValueIndex=function(e,t,n){"use strict";var r=Infinity,i=null;return e.forEach(function(e,s){var o=Math.abs(t-e);o<=r&&oT.height?0:x}v.top=Math.abs(x-S.top),v.left=Math.abs(E.left-S.left)}t+=a.offsetLeft+v.left-2*a.scrollLeft,u+=a.offsetTop+v.top-2*a.scrollTop}return s&&s>0&&(u=Math.floor(u/s)*s),e.tooltip.calcTooltipPosition([t,u],r,i,h),w}var t=null,n=null,r="w",i=50,s=25,o=null,u=null,a=null,f=null,l={left:null,top:null},c=!0,h="nvtooltip-"+Math.floor(Math.random()*1e5),p="nv-pointer-events-none",d=function(e,t){return e},v=function(e){return e},m=function(e){if(t!=null)return t;if(e==null)return"";var n=d3.select(document.createElement("table")),r=n.selectAll("thead").data([e]).enter().append("thead");r.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(v(e.value));var i=n.selectAll("tbody").data([e]).enter().append("tbody"),s=i.selectAll("tr").data(function(e){return e.series}).enter().append("tr").classed("highlight",function(e){return e.highlight});s.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(e){return e.color}),s.append("td").classed("key",!0).html(function(e){return e.key}),s.append("td").classed("value",!0).html(function(e,t){return d(e.value,t)}),s.selectAll("td").each(function(e){if(e.highlight){var t=d3.scale.linear().domain([0,1]).range(["#fff",e.color]),n=.6;d3.select(this).style("border-bottom-color",t(n)).style("border-top-color",t(n))}});var o=n.node().outerHTML;return e.footer!==undefined&&(o+=""),o},g=function(e){return e&&e.series&&e.series.length>0?!0:!1};return w.nvPointerEventsClass=p,w.content=function(e){return arguments.length?(t=e,w):t},w.tooltipElem=function(){return f},w.contentGenerator=function(e){return arguments.length?(typeof e=="function"&&(m=e),w):m},w.data=function(e){return arguments.length?(n=e,w):n},w.gravity=function(e){return arguments.length?(r=e,w):r},w.distance=function(e){return arguments.length?(i=e,w):i},w.snapDistance=function(e){return arguments.length?(s=e,w):s},w.classes=function(e){return arguments.length?(u=e,w):u},w.chartContainer=function(e){return arguments.length?(a=e,w):a},w.position=function(e){return arguments.length?(l.left=typeof e.left!="undefined"?e.left:l.left,l.top=typeof e.top!="undefined"?e.top:l.top,w):l},w.fixedTop=function(e){return arguments.length?(o=e,w):o},w.enabled=function(e){return arguments.length?(c=e,w):c},w.valueFormatter=function(e){return arguments.length?(typeof e=="function"&&(d=e),w):d},w.headerFormatter=function(e){return arguments.length?(typeof e=="function"&&(v=e),w):v},w.id=function(){return h},w},e.tooltip.show=function(t,n,r,i,s,o){var u=document.createElement("div");u.className="nvtooltip "+(o?o:"xy-tooltip");var a=s;if(!s||s.tagName.match(/g|svg/i))a=document.getElementsByTagName("body")[0];u.style.left=0,u.style.top=0,u.style.opacity=0,u.innerHTML=n,a.appendChild(u),s&&(t[0]=t[0]-s.scrollLeft,t[1]=t[1]-s.scrollTop),e.tooltip.calcTooltipPosition(t,r,i,u)},e.tooltip.findFirstNonSVGParent=function(e){while(e.tagName.match(/^g|svg$/i)!==null)e=e.parentNode;return e},e.tooltip.findTotalOffsetTop=function(e,t){var n=t;do isNaN(e.offsetTop)||(n+=e.offsetTop);while(e=e.offsetParent);return n},e.tooltip.findTotalOffsetLeft=function(e,t){var n=t;do isNaN(e.offsetLeft)||(n+=e.offsetLeft);while(e=e.offsetParent);return n},e.tooltip.calcTooltipPosition=function(t,n,r,i){var s=parseInt(i.offsetHeight),o=parseInt(i.offsetWidth),u=e.utils.windowSize().width,a=e.utils.windowSize().height,f=window.pageYOffset,l=window.pageXOffset,c,h;a=window.innerWidth>=document.body.scrollWidth?a:a-16,u=window.innerHeight>=document.body.scrollHeight?u:u-16,n=n||"s",r=r||20;var p=function(t){return e.tooltip.findTotalOffsetTop(t,h)},d=function(t){return e.tooltip.findTotalOffsetLeft(t,c)};switch(n){case"e":c=t[0]-o-r,h=t[1]-s/2;var v=d(i),m=p(i);vl?t[0]+r:l-v+c),mf+a&&(h=f+a-m+h-s);break;case"w":c=t[0]+r,h=t[1]-s/2;var v=d(i),m=p(i);v+o>u&&(c=t[0]-o-r),mf+a&&(h=f+a-m+h-s);break;case"n":c=t[0]-o/2-5,h=t[1]+r;var v=d(i),m=p(i);vu&&(c=c-o/2+5),m+s>f+a&&(h=f+a-m+h-s);break;case"s":c=t[0]-o/2,h=t[1]-s-r;var v=d(i),m=p(i);vu&&(c=c-o/2+5),f>m&&(h=f);break;case"none":c=t[0],h=t[1]-r;var v=d(i),m=p(i)}return i.style.left=c+"px",i.style.top=h+"px",i.style.opacity=1,i.style.position="absolute",i},e.tooltip.cleanup=function(){var e=document.getElementsByClassName("nvtooltip"),t=[];while(e.length)t.push(e[0]),e[0].style.transitionDelay="0 !important",e[0].style.opacity=0,e[0].className="nvtooltip-pending-removal";setTimeout(function(){while(t.length){var e=t.pop();e.parentNode.removeChild(e)}},500)}}(),e.utils.windowSize=function(){var e={width:640,height:480};return document.body&&document.body.offsetWidth&&(e.width=document.body.offsetWidth,e.height=document.body.offsetHeight),document.compatMode=="CSS1Compat"&&document.documentElement&&document.documentElement.offsetWidth&&(e.width=document.documentElement.offsetWidth,e.height=document.documentElement.offsetHeight),window.innerWidth&&window.innerHeight&&(e.width=window.innerWidth,e.height=window.innerHeight),e},e.utils.windowResize=function(e){if(e===undefined)return;var t=window.onresize;window.onresize=function(n){typeof t=="function"&&t(n),e(n)}},e.utils.getColor=function(t){return arguments.length?Object.prototype.toString.call(t)==="[object Array]"?function(e,n){return e.color||t[n%t.length]}:t:e.utils.defaultColor()},e.utils.defaultColor=function(){var e=d3.scale.category20().range();return function(t,n){return t.color||e[n%e.length]}},e.utils.customTheme=function(e,t,n){t=t||function(e){return e.key},n=n||d3.scale.category20().range();var r=n.length;return function(i,s){var o=t(i);return r||(r=n.length),typeof e[o]!="undefined"?typeof e[o]=="function"?e[o]():e[o]:n[--r]}},e.utils.pjax=function(t,n){function r(r){d3.html(r,function(r){var i=d3.select(n).node();i.parentNode.replaceChild(d3.select(r).select(n).node(),i),e.utils.pjax(t,n)})}d3.selectAll(t).on("click",function(){history.pushState(this.href,this.textContent,this.href),r(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&r(d3.event.state)})},e.utils.calcApproxTextWidth=function(e){if(typeof e.style=="function"&&typeof e.text=="function"){var t=parseInt(e.style("font-size").replace("px","")),n=e.text().length;return n*t*.5}return 0},e.utils.NaNtoZero=function(e){return typeof e!="number"||isNaN(e)||e===null||e===Infinity?0:e},e.utils.optionsFunc=function(e){return e&&d3.map(e).forEach(function(e,t){typeof this[e]=="function"&&this[e](t)}.bind(this)),this},e.models.axis=function(){"use strict";function m(e){return e.each(function(e){var i=d3.select(this),m=i.selectAll("g.nv-wrap.nv-axis").data([e]),g=m.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),y=g.append("g"),b=m.select("g");p!==null?t.ticks(p):(t.orient()=="top"||t.orient()=="bottom")&&t.ticks(Math.abs(s.range()[1]-s.range()[0])/100),b.transition().call(t),v=v||t.scale();var w=t.tickFormat();w==null&&(w=v.tickFormat());var E=b.selectAll("text.nv-axislabel").data([o||null]);E.exit().remove();switch(t.orient()){case"top":E.enter().append("text").attr("class","nv-axislabel");var S=s.range().length==2?s.range()[1]:s.range()[s.range().length-1]+(s.range()[1]-s.range()[0]);E.attr("text-anchor","middle").attr("y",0).attr("x",S/2);if(u){var x=m.selectAll("g.nv-axisMaxMin").data(s.domain());x.enter().append("g").attr("class","nv-axisMaxMin").append("text"),x.exit().remove(),x.attr("transform",function(e,t){return"translate("+s(e)+",0)"}).select("text").attr("dy","-0.5em").attr("y",-t.tickPadding()).attr("text-anchor","middle").text(function(e,t){var n=w(e);return(""+n).match("NaN")?"":n}),x.transition().attr("transform",function(e,t){return"translate("+s.range()[t]+",0)"})}break;case"bottom":var T=36,N=30,C=b.selectAll("g").select("text");if(f%360){C.each(function(e,t){var n=this.getBBox().width;n>N&&(N=n)});var k=Math.abs(Math.sin(f*Math.PI/180)),T=(k?k*N:N)+30;C.attr("transform",function(e,t,n){return"rotate("+f+" 0,0)"}).style("text-anchor",f%360>0?"start":"end")}E.enter().append("text").attr("class","nv-axislabel");var S=s.range().length==2?s.range()[1]:s.range()[s.range().length-1]+(s.range()[1]-s.range()[0]);E.attr("text-anchor","middle").attr("y",T).attr("x",S/2);if(u){var x=m.selectAll("g.nv-axisMaxMin").data([s.domain()[0],s.domain()[s.domain().length-1]]);x.enter().append("g").attr("class","nv-axisMaxMin").append("text"),x.exit().remove(),x.attr("transform",function(e,t){return"translate("+(s(e)+(h?s.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",t.tickPadding()).attr("transform",function(e,t,n){return"rotate("+f+" 0,0)"}).style("text-anchor",f?f%360>0?"start":"end":"middle").text(function(e,t){var n=w(e);return(""+n).match("NaN")?"":n}),x.transition().attr("transform",function(e,t){return"translate("+(s(e)+(h?s.rangeBand()/2:0))+",0)"})}c&&C.attr("transform",function(e,t){return"translate(0,"+(t%2==0?"0":"12")+")"});break;case"right":E.enter().append("text").attr("class","nv-axislabel"),E.style("text-anchor",l?"middle":"begin").attr("transform",l?"rotate(90)":"").attr("y",l?-Math.max(n.right,r)+12:-10).attr("x",l?s.range()[0]/2:t.tickPadding());if(u){var x=m.selectAll("g.nv-axisMaxMin").data(s.domain());x.enter().append("g").attr("class","nv-axisMaxMin").append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(e,t){return"translate(0,"+s(e)+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",t.tickPadding()).style("text-anchor","start").text(function(e,t){var n=w(e);return(""+n).match("NaN")?"":n}),x.transition().attr("transform",function(e,t){return"translate(0,"+s.range()[t]+")"}).select("text").style("opacity",1)}break;case"left":E.enter().append("text").attr("class","nv-axislabel"),E.style("text-anchor",l?"middle":"end").attr("transform",l?"rotate(-90)":"").attr("y",l?-Math.max(n.left,r)+d:-10).attr("x",l?-s.range()[0]/2:-t.tickPadding());if(u){var x=m.selectAll("g.nv-axisMaxMin").data(s.domain());x.enter().append("g").attr("class","nv-axisMaxMin").append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(e,t){return"translate(0,"+v(e)+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-t.tickPadding()).attr("text-anchor","end").text(function(e,t){var n=w(e);return(""+n).match("NaN")?"":n}),x.transition().attr("transform",function(e,t){return"translate(0,"+s.range()[t]+")"}).select("text").style("opacity",1)}}E.text(function(e){return e}),u&&(t.orient()==="left"||t.orient()==="right")&&(b.selectAll("g").each(function(e,t){d3.select(this).select("text").attr("opacity",1);if(s(e)s.range()[0]-10)(e>1e-10||e<-1e-10)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0)}),s.domain()[0]==s.domain()[1]&&s.domain()[0]==0&&m.selectAll("g.nv-axisMaxMin").style("opacity",function(e,t){return t?0:1}));if(u&&(t.orient()==="top"||t.orient()==="bottom")){var L=[];m.selectAll("g.nv-axisMaxMin").each(function(e,t){try{t?L.push(s(e)-this.getBBox().width-4):L.push(s(e)+this.getBBox().width+4)}catch(n){t?L.push(s(e)-4):L.push(s(e)+4)}}),b.selectAll("g").each(function(e,t){if(s(e)L[1])e>1e-10||e<-1e-10?d3.select(this).remove():d3.select(this).select("text").remove()})}a&&b.selectAll(".tick").filter(function(e){return!parseFloat(Math.round(e.__data__*1e5)/1e6)&&e.__data__!==undefined}).classed("zero",!0),v=s.copy()}),m}var t=d3.svg.axis(),n={top:0,right:0,bottom:0,left:0},r=75,i=60,s=d3.scale.linear(),o=null,u=!0,a=!0,f=0,l=!0,c=!1,h=!1,p=null,d=12;t.scale(s).orient("bottom").tickFormat(function(e){return e});var v;return m.axis=t,d3.rebind(m,t,"orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"),d3.rebind(m,s,"domain","range","rangeBand","rangeBands"),m.options=e.utils.optionsFunc.bind(m),m.margin=function(e){return arguments.length?(n.top=typeof e.top!="undefined"?e.top:n.top,n.right=typeof e.right!="undefined"?e.right:n.right,n.bottom=typeof e.bottom!="undefined"?e.bottom:n.bottom,n.left=typeof e.left!="undefined"?e.left:n.left,m):n},m.width=function(e){return arguments.length?(r=e,m):r},m.ticks=function(e){return arguments.length?(p=e,m):p},m.height=function(e){return arguments.length?(i=e,m):i},m.axisLabel=function(e){return arguments.length?(o=e,m):o},m.showMaxMin=function(e){return arguments.length?(u=e,m):u},m.highlightZero=function(e){return arguments.length?(a=e,m):a},m.scale=function(e){return arguments.length?(s=e,t.scale(s),h=typeof s.rangeBands=="function",d3.rebind(m,s,"domain","range","rangeBand","rangeBands"),m):s},m.rotateYLabel=function(e){return arguments.length?(l=e,m):l},m.rotateLabels=function(e){return arguments.length?(f=e,m):f},m.staggerLabels=function(e){return arguments.length?(c=e,m):c},m.axisLabelDistance=function(e){return arguments.length?(d=e,m):d},m},e.models.bullet=function(){"use strict";function m(e){return e.each(function(e,n){var p=c-t.left-t.right,m=h-t.top-t.bottom,g=d3.select(this),y=i.call(this,e,n).slice().sort(d3.descending),b=s.call(this,e,n).slice().sort(d3.descending),w=o.call(this,e,n).slice().sort(d3.descending),E=u.call(this,e,n).slice(),S=a.call(this,e,n).slice(),x=f.call(this,e,n).slice(),T=d3.scale.linear().domain(d3.extent(d3.merge([l,y]))).range(r?[p,0]:[0,p]),N=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(T.range());this.__chart__=T;var C=d3.min(y),k=d3.max(y),L=y[1],A=g.selectAll("g.nv-wrap.nv-bullet").data([e]),O=A.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),M=O.append("g"),_=A.select("g");M.append("rect").attr("class","nv-range nv-rangeMax"),M.append("rect").attr("class","nv-range nv-rangeAvg"),M.append("rect").attr("class","nv-range nv-rangeMin"),M.append("rect").attr("class","nv-measure"),M.append("path").attr("class","nv-markerTriangle"),A.attr("transform","translate("+t.left+","+t.top+")");var D=function(e){return Math.abs(N(e)-N(0))},P=function(e){return Math.abs(T(e)-T(0))},H=function(e){return e<0?N(e):N(0)},B=function(e){return e<0?T(e):T(0)};_.select("rect.nv-rangeMax").attr("height",m).attr("width",P(k>0?k:C)).attr("x",B(k>0?k:C)).datum(k>0?k:C),_.select("rect.nv-rangeAvg").attr("height",m).attr("width",P(L)).attr("x",B(L)).datum(L),_.select("rect.nv-rangeMin").attr("height",m).attr("width",P(k)).attr("x",B(k)).attr("width",P(k>0?C:k)).attr("x",B(k>0?C:k)).datum(k>0?C:k),_.select("rect.nv-measure").style("fill",d).attr("height",m/3).attr("y",m/3).attr("width",w<0?T(0)-T(w[0]):T(w[0])-T(0)).attr("x",B(w)).on("mouseover",function(){v.elementMouseover({value:w[0],label:x[0]||"Current",pos:[T(w[0]),m/2]})}).on("mouseout",function(){v.elementMouseout({value:w[0],label:x[0]||"Current"})});var j=m/6;b[0]?_.selectAll("path.nv-markerTriangle").attr("transform",function(e){return"translate("+T(b[0])+","+m/2+")"}).attr("d","M0,"+j+"L"+j+","+ -j+" "+ -j+","+ -j+"Z").on("mouseover",function(){v.elementMouseover({value:b[0],label:S[0]||"Previous",pos:[T(b[0]),m/2]})}).on("mouseout",function(){v.elementMouseout({value:b[0],label:S[0]||"Previous"})}):_.selectAll("path.nv-markerTriangle").remove(),A.selectAll(".nv-range").on("mouseover",function(e,t){var n=E[t]||(t?t==1?"Mean":"Minimum":"Maximum");v.elementMouseover({value:e,label:n,pos:[T(e),m/2]})}).on("mouseout",function(e,t){var n=E[t]||(t?t==1?"Mean":"Minimum":"Maximum");v.elementMouseout({value:e,label:n})})}),m}var t={top:0,right:0,bottom:0,left:0},n="left",r=!1,i=function(e){return e.ranges},s=function(e){return e.markers},o=function(e){return e.measures},u=function(e){return e.rangeLabels?e.rangeLabels:[]},a=function(e){return e.markerLabels?e.markerLabels:[]},f=function(e){return e.measureLabels?e.measureLabels:[]},l=[0],c=380,h=30,p=null,d=e.utils.getColor(["#1f77b4"]),v=d3.dispatch("elementMouseover","elementMouseout");return m.dispatch=v,m.options=e.utils.optionsFunc.bind(m),m.orient=function(e){return arguments.length?(n=e,r=n=="right"||n=="bottom",m):n},m.ranges=function(e){return arguments.length?(i=e,m):i},m.markers=function(e){return arguments.length?(s=e,m):s},m.measures=function(e){return arguments.length?(o=e,m):o},m.forceX=function(e){return arguments.length?(l=e,m):l},m.width=function(e){return arguments.length?(c=e,m):c},m.height=function(e){return arguments.length?(h=e,m):h},m.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,m):t},m.tickFormat=function(e){return arguments.length?(p=e,m):p},m.color=function(t){return arguments.length?(d=e.utils.getColor(t),m):d},m},e.models.bulletChart=function(){"use strict";function m(e){return e.each(function(n,h){var g=d3.select(this),y=(a||parseInt(g.style("width"))||960)-i.left-i.right,b=f-i.top-i.bottom,w=this;m.update=function(){m(e)},m.container=this;if(!n||!s.call(this,n,h)){var E=g.selectAll(".nv-noData").data([p]);return E.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),E.attr("x",i.left+y/2).attr("y",18+i.top+b/2).text(function(e){return e}),m}g.selectAll(".nv-noData").remove();var S=s.call(this,n,h).slice().sort(d3.descending),x=o.call(this,n,h).slice().sort(d3.descending),T=u.call(this,n,h).slice().sort(d3.descending),N=g.selectAll("g.nv-wrap.nv-bulletChart").data([n]),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),k=C.append("g"),L=N.select("g");k.append("g").attr("class","nv-bulletWrap"),k.append("g").attr("class","nv-titles"),N.attr("transform","translate("+i.left+","+i.top+")");var A=d3.scale.linear().domain([0,Math.max(S[0],x[0],T[0])]).range(r?[y,0]:[0,y]),O=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(A.range());this.__chart__=A;var M=function(e){return Math.abs(O(e)-O(0))},_=function(e){return Math.abs(A(e)-A(0))},D=k.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(f-i.top-i.bottom)/2+")");D.append("text").attr("class","nv-title").text(function(e){return e.title}),D.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(e){return e.subtitle}),t.width(y).height(b);var P=L.select(".nv-bulletWrap");d3.transition(P).call(t);var H=l||A.tickFormat(y/100),B=L.selectAll("g.nv-tick").data(A.ticks(y/50),function(e){return this.textContent||H(e)}),j=B.enter().append("g").attr("class","nv-tick").attr("transform",function(e){return"translate("+O(e)+",0)"}).style("opacity",1e-6);j.append("line").attr("y1",b).attr("y2",b*7/6),j.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",b*7/6).text(H);var F=d3.transition(B).attr("transform",function(e){return"translate("+A(e)+",0)"}).style("opacity",1);F.select("line").attr("y1",b).attr("y2",b*7/6),F.select("text").attr("y",b*7/6),d3.transition(B.exit()).attr("transform",function(e){return"translate("+A(e)+",0)"}).style("opacity",1e-6).remove(),d.on("tooltipShow",function(e){e.key=n.title,c&&v(e,w.parentNode)})}),d3.timer.flush(),m}var t=e.models.bullet(),n="left",r=!1,i={top:5,right:40,bottom:20,left:120},s=function(e){return e.ranges},o=function(e){return e.markers},u=function(e){return e.measures},a=null,f=55,l=null,c=!0,h=function(e,t,n,r,i){return"

    "+t+"

    "+"

    "+n+"

    "},p="No Data Available.",d=d3.dispatch("tooltipShow","tooltipHide"),v=function(t,n){var r=t.pos[0]+(n.offsetLeft||0)+i.left,s=t.pos[1]+(n.offsetTop||0)+i.top,o=h(t.key,t.label,t.value,t,m);e.tooltip.show([r,s],o,t.value<0?"e":"w",null,n)};return t.dispatch.on("elementMouseover.tooltip",function(e){d.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){d.tooltipHide(e)}),d.on("tooltipHide",function(){c&&e.tooltip.cleanup()}),m.dispatch=d,m.bullet=t,d3.rebind(m,t,"color"),m.options=e.utils.optionsFunc.bind(m),m.orient=function(e){return arguments.length?(n=e,r=n=="right"||n=="bottom",m):n},m.ranges=function(e){return arguments.length?(s=e,m):s},m.markers=function(e){return arguments.length?(o=e,m):o},m.measures=function(e){return arguments.length?(u=e,m):u},m.width=function(e){return arguments.length?(a=e,m):a},m.height=function(e){return arguments.length?(f=e,m):f},m.margin=function(e){return arguments.length?(i.top=typeof e.top!="undefined"?e.top:i.top,i.right=typeof e.right!="undefined"?e.right:i.right,i.bottom=typeof e.bottom!="undefined"?e.bottom:i.bottom,i.left=typeof e.left!="undefined"?e.left:i.left,m):i},m.tickFormat=function(e){return arguments.length?(l=e,m):l},m.tooltips=function(e){return arguments.length?(c=e,m):c},m.tooltipContent=function(e){return arguments.length?(h=e,m):h},m.noData=function(e){return arguments.length?(p=e,m):p},m},e.models.cumulativeLineChart=function(){"use strict";function D(b){return b.each(function(b){function q(e,t){d3.select(D.container).style("cursor","ew-resize")}function R(e,t){M.x=d3.event.x,M.i=Math.round(O.invert(M.x)),rt()}function U(e,t){d3.select(D.container).style("cursor","auto"),x.index=M.i,k.stateChange(x)}function rt(){nt.data([M]);var e=D.transitionDuration();D.transitionDuration(0),D.update(),D.transitionDuration(e)}var A=d3.select(this).classed("nv-chart-"+S,!0),H=this,B=(f||parseInt(A.style("width"))||960)-u.left-u.right,j=(l||parseInt(A.style("height"))||400)-u.top-u.bottom;D.update=function(){A.transition().duration(L).call(D)},D.container=this,x.disabled=b.map(function(e){return!!e.disabled});if(!T){var F;T={};for(F in x)x[F]instanceof Array?T[F]=x[F].slice(0):T[F]=x[F]}var I=d3.behavior.drag().on("dragstart",q).on("drag",R).on("dragend",U);if(!b||!b.length||!b.filter(function(e){return e.values.length}).length){var z=A.selectAll(".nv-noData").data([N]);return z.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),z.attr("x",u.left+B/2).attr("y",u.top+j/2).text(function(e){return e}),D}A.selectAll(".nv-noData").remove(),w=t.xScale(),E=t.yScale();if(!y){var W=b.filter(function(e){return!e.disabled}).map(function(e,n){var r=d3.extent(e.values,t.y());return r[0]<-0.95&&(r[0]=-0.95),[(r[0]-r[1])/(1+r[1]),(r[1]-r[0])/(1+r[0])]}),X=[d3.min(W,function(e){return e[0]}),d3.max(W,function(e){return e[1]})];t.yDomain(X)}else t.yDomain(null);O.domain([0,b[0].values.length-1]).range([0,B]).clamp(!0);var b=P(M.i,b),V=g?"none":"all",$=A.selectAll("g.nv-wrap.nv-cumulativeLine").data([b]),J=$.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),K=$.select("g");J.append("g").attr("class","nv-interactive"),J.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),J.append("g").attr("class","nv-y nv-axis"),J.append("g").attr("class","nv-background"),J.append("g").attr("class","nv-linesWrap").style("pointer-events",V),J.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),J.append("g").attr("class","nv-legendWrap"),J.append("g").attr("class","nv-controlsWrap"),c&&(i.width(B),K.select(".nv-legendWrap").datum(b).call(i),u.top!=i.height()&&(u.top=i.height(),j=(l||parseInt(A.style("height"))||400)-u.top-u.bottom),K.select(".nv-legendWrap").attr("transform","translate(0,"+ -u.top+")"));if(m){var Q=[{key:"Re-scale y-axis",disabled:!y}];s.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),K.select(".nv-controlsWrap").datum(Q).attr("transform","translate(0,"+ -u.top+")").call(s)}$.attr("transform","translate("+u.left+","+u.top+")"),d&&K.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)");var G=b.filter(function(e){return e.tempDisabled});$.select(".tempDisabled").remove(),G.length&&$.append("text").attr("class","tempDisabled").attr("x",B/2).attr("y","-.71em").style("text-anchor","end").text(G.map(function(e){return e.key}).join(", ")+" values cannot be calculated for this time period."),g&&(o.width(B).height(j).margin({left:u.left,top:u.top}).svgContainer(A).xScale(w),$.select(".nv-interactive").call(o)),J.select(".nv-background").append("rect"),K.select(".nv-background rect").attr("width",B).attr("height",j),t.y(function(e){return e.display.y}).width(B).height(j).color(b.map(function(e,t){return e.color||a(e,t)}).filter(function(e,t){return!b[t].disabled&&!b[t].tempDisabled}));var Y=K.select(".nv-linesWrap").datum(b.filter(function(e){return!e.disabled&&!e.tempDisabled}));Y.call(t),b.forEach(function(e,t){e.seriesIndex=t});var Z=b.filter(function(e){return!e.disabled&&!!C(e)}),et=K.select(".nv-avgLinesWrap").selectAll("line").data(Z,function(e){return e.key}),tt=function(e){var t=E(C(e));return t<0?0:t>j?j:t};et.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(e,n){return t.color()(e,e.seriesIndex)}).attr("x1",0).attr("x2",B).attr("y1",tt).attr("y2",tt),et.style("stroke-opacity",function(e){var t=E(C(e));return t<0||t>j?0:1}).attr("x1",0).attr("x2",B).attr("y1",tt).attr("y2",tt),et.exit().remove();var nt=Y.selectAll(".nv-indexLine").data([M]);nt.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(I),nt.attr("transform",function(e){return"translate("+O(e.i)+",0)"}).attr("height",j),h&&(n.scale(w).ticks(Math.min(b[0].values.length,B/70)).tickSize(-j,0),K.select(".nv-x.nv-axis").attr("transform","translate(0,"+E.range()[0]+")"),d3.transition(K.select(".nv-x.nv-axis")).call(n)),p&&(r.scale(E).ticks(j/36).tickSize(-B,0),d3.transition(K.select(".nv-y.nv-axis")).call(r)),K.select(".nv-background rect").on("click",function(){M.x=d3.mouse(this)[0],M.i=Math.round(O.invert(M.x)),x.index=M.i,k.stateChange(x),rt()}),t.dispatch.on("elementClick",function(e){M.i=e.pointIndex,M.x=O(M.i),x.index=M.i,k.stateChange(x),rt()}),s.dispatch.on("legendClick",function(e,t){e.disabled=!e.disabled,y=!e.disabled,x.rescaleY=y,k.stateChange(x),D.update()}),i.dispatch.on("stateChange",function(e){x.disabled=e.disabled,k.stateChange(x),D.update()}),o.dispatch.on("elementMousemove",function(i){t.clearHighlights();var s,f,l,c=[];b.filter(function(e,t){return e.seriesIndex=t,!e.disabled}).forEach(function(n,r){f=e.interactiveBisect(n.values,i.pointXValue,D.x()),t.highlightPoint(r,f,!0);var o=n.values[f];if(typeof o=="undefined")return;typeof s=="undefined"&&(s=o),typeof l=="undefined"&&(l=D.xScale()(D.x()(o,f))),c.push({key:n.key,value:D.y()(o,f),color:a(n,n.seriesIndex)})});if(c.length>2){var h=D.yScale().invert(i.mouseY),p=Math.abs(D.yScale().domain()[0]-D.yScale().domain()[1]),d=.03*p,m=e.nearestValueIndex(c.map(function(e){return e.value}),h,d);m!==null&&(c[m].highlight=!0)}var g=n.tickFormat()(D.x()(s,f),f);o.tooltip.position({left:l+u.left,top:i.mouseY+u.top}).chartContainer(H.parentNode).enabled(v).valueFormatter(function(e,t){return r.tickFormat()(e)}).data({value:g,series:c})(),o.renderGuideLine(l)}),o.dispatch.on("elementMouseout",function(e){k.tooltipHide(),t.clearHighlights()}),k.on("tooltipShow",function(e){v&&_(e,H.parentNode)}),k.on("changeState",function(e){typeof e.disabled!="undefined"&&(b.forEach(function(t,n){t.disabled=e.disabled[n]}),x.disabled=e.disabled),typeof e.index!="undefined"&&(M.i=e.index,M.x=O(M.i),x.index=e.index,nt.data([M])),typeof e.rescaleY!="undefined"&&(y=e.rescaleY),D.update()})}),D}function P(e,n){return n.map(function(n,r){if(!n.values)return n;var i=t.y()(n.values[e],e);return i<-0.95&&!A?(n.tempDisabled=!0,n):(n.tempDisabled=!1,n.values= -n.values.map(function(e,n){return e.display={y:(t.y()(e,n)-i)/(1+i)},e}),n)})}var t=e.models.line(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.models.legend(),o=e.interactiveGuideline(),u={top:30,right:30,bottom:50,left:60},a=e.utils.defaultColor(),f=null,l=null,c=!0,h=!0,p=!0,d=!1,v=!0,m=!0,g=!1,y=!0,b=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},w,E,S=t.id(),x={index:0,rescaleY:y},T=null,N="No Data Available.",C=function(e){return e.average},k=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),L=250,A=!1;n.orient("bottom").tickPadding(7),r.orient(d?"right":"left"),s.updateState(!1);var O=d3.scale.linear(),M={i:0,x:0},_=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=b(i.series.key,a,f,i,D);e.tooltip.show([o,u],l,null,null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+u.left,e.pos[1]+u.top],k.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){k.tooltipHide(e)}),k.on("tooltipHide",function(){v&&e.tooltip.cleanup()}),D.dispatch=k,D.lines=t,D.legend=i,D.xAxis=n,D.yAxis=r,D.interactiveLayer=o,d3.rebind(D,t,"defined","isArea","x","y","xScale","yScale","size","xDomain","yDomain","xRange","yRange","forceX","forceY","interactive","clipEdge","clipVoronoi","useVoronoi","id"),D.options=e.utils.optionsFunc.bind(D),D.margin=function(e){return arguments.length?(u.top=typeof e.top!="undefined"?e.top:u.top,u.right=typeof e.right!="undefined"?e.right:u.right,u.bottom=typeof e.bottom!="undefined"?e.bottom:u.bottom,u.left=typeof e.left!="undefined"?e.left:u.left,D):u},D.width=function(e){return arguments.length?(f=e,D):f},D.height=function(e){return arguments.length?(l=e,D):l},D.color=function(t){return arguments.length?(a=e.utils.getColor(t),i.color(a),D):a},D.rescaleY=function(e){return arguments.length?(y=e,D):y},D.showControls=function(e){return arguments.length?(m=e,D):m},D.useInteractiveGuideline=function(e){return arguments.length?(g=e,e===!0&&(D.interactive(!1),D.useVoronoi(!1)),D):g},D.showLegend=function(e){return arguments.length?(c=e,D):c},D.showXAxis=function(e){return arguments.length?(h=e,D):h},D.showYAxis=function(e){return arguments.length?(p=e,D):p},D.rightAlignYAxis=function(e){return arguments.length?(d=e,r.orient(e?"right":"left"),D):d},D.tooltips=function(e){return arguments.length?(v=e,D):v},D.tooltipContent=function(e){return arguments.length?(b=e,D):b},D.state=function(e){return arguments.length?(x=e,D):x},D.defaultState=function(e){return arguments.length?(T=e,D):T},D.noData=function(e){return arguments.length?(N=e,D):N},D.average=function(e){return arguments.length?(C=e,D):C},D.transitionDuration=function(e){return arguments.length?(L=e,D):L},D.noErrorCheck=function(e){return arguments.length?(A=e,D):A},D},e.models.discreteBar=function(){"use strict";function E(e){return e.each(function(e){var i=n-t.left-t.right,E=r-t.top-t.bottom,S=d3.select(this);e.forEach(function(e,t){e.values.forEach(function(e){e.series=t})});var T=p&&d?[]:e.map(function(e){return e.values.map(function(e,t){return{x:u(e,t),y:a(e,t),y0:e.y0}})});s.domain(p||d3.merge(T).map(function(e){return e.x})).rangeBands(v||[0,i],.1),o.domain(d||d3.extent(d3.merge(T).map(function(e){return e.y}).concat(f))),c?o.range(m||[E-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]):o.range(m||[E,0]),b=b||s,w=w||o.copy().range([o(0),o(0)]);var N=S.selectAll("g.nv-wrap.nv-discretebar").data([e]),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),k=C.append("g"),L=N.select("g");k.append("g").attr("class","nv-groups"),N.attr("transform","translate("+t.left+","+t.top+")");var A=N.select(".nv-groups").selectAll(".nv-group").data(function(e){return e},function(e){return e.key});A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),A.exit().transition().style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),A.attr("class",function(e,t){return"nv-group nv-series-"+t}).classed("hover",function(e){return e.hover}),A.transition().style("stroke-opacity",1).style("fill-opacity",.75);var O=A.selectAll("g.nv-bar").data(function(e){return e.values});O.exit().remove();var M=O.enter().append("g").attr("transform",function(e,t,n){return"translate("+(s(u(e,t))+s.rangeBand()*.05)+", "+o(0)+")"}).on("mouseover",function(t,n){d3.select(this).classed("hover",!0),g.elementMouseover({value:a(t,n),point:t,series:e[t.series],pos:[s(u(t,n))+s.rangeBand()*(t.series+.5)/e.length,o(a(t,n))],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("mouseout",function(t,n){d3.select(this).classed("hover",!1),g.elementMouseout({value:a(t,n),point:t,series:e[t.series],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("click",function(t,n){g.elementClick({value:a(t,n),point:t,series:e[t.series],pos:[s(u(t,n))+s.rangeBand()*(t.series+.5)/e.length,o(a(t,n))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(t,n){g.elementDblClick({value:a(t,n),point:t,series:e[t.series],pos:[s(u(t,n))+s.rangeBand()*(t.series+.5)/e.length,o(a(t,n))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()});M.append("rect").attr("height",0).attr("width",s.rangeBand()*.9/e.length),c?(M.append("text").attr("text-anchor","middle"),O.select("text").text(function(e,t){return h(a(e,t))}).transition().attr("x",s.rangeBand()*.9/2).attr("y",function(e,t){return a(e,t)<0?o(a(e,t))-o(0)+12:-4})):O.selectAll("text").remove(),O.attr("class",function(e,t){return a(e,t)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(e,t){return e.color||l(e,t)}).style("stroke",function(e,t){return e.color||l(e,t)}).select("rect").attr("class",y).transition().attr("width",s.rangeBand()*.9/e.length),O.transition().attr("transform",function(e,t){var n=s(u(e,t))+s.rangeBand()*.05,r=a(e,t)<0?o(0):o(0)-o(a(e,t))<1?o(0)-1:o(a(e,t));return"translate("+n+", "+r+")"}).select("rect").attr("height",function(e,t){return Math.max(Math.abs(o(a(e,t))-o(d&&d[0]||0))||1)}),b=s.copy(),w=o.copy()}),E}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=Math.floor(Math.random()*1e4),s=d3.scale.ordinal(),o=d3.scale.linear(),u=function(e){return e.x},a=function(e){return e.y},f=[0],l=e.utils.defaultColor(),c=!1,h=d3.format(",.2f"),p,d,v,m,g=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout"),y="discreteBar",b,w;return E.dispatch=g,E.options=e.utils.optionsFunc.bind(E),E.x=function(e){return arguments.length?(u=e,E):u},E.y=function(e){return arguments.length?(a=e,E):a},E.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,E):t},E.width=function(e){return arguments.length?(n=e,E):n},E.height=function(e){return arguments.length?(r=e,E):r},E.xScale=function(e){return arguments.length?(s=e,E):s},E.yScale=function(e){return arguments.length?(o=e,E):o},E.xDomain=function(e){return arguments.length?(p=e,E):p},E.yDomain=function(e){return arguments.length?(d=e,E):d},E.xRange=function(e){return arguments.length?(v=e,E):v},E.yRange=function(e){return arguments.length?(m=e,E):m},E.forceY=function(e){return arguments.length?(f=e,E):f},E.color=function(t){return arguments.length?(l=e.utils.getColor(t),E):l},E.id=function(e){return arguments.length?(i=e,E):i},E.showValues=function(e){return arguments.length?(c=e,E):c},E.valueFormat=function(e){return arguments.length?(h=e,E):h},E.rectClass=function(e){return arguments.length?(y=e,E):y},E},e.models.discreteBarChart=function(){"use strict";function w(e){return e.each(function(e){var u=d3.select(this),p=this,E=(s||parseInt(u.style("width"))||960)-i.left-i.right,S=(o||parseInt(u.style("height"))||400)-i.top-i.bottom;w.update=function(){g.beforeUpdate(),u.transition().duration(y).call(w)},w.container=this;if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var T=u.selectAll(".nv-noData").data([m]);return T.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),T.attr("x",i.left+E/2).attr("y",i.top+S/2).text(function(e){return e}),w}u.selectAll(".nv-noData").remove(),d=t.xScale(),v=t.yScale().clamp(!0);var N=u.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([e]),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),k=C.append("defs"),L=N.select("g");C.append("g").attr("class","nv-x nv-axis"),C.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),C.append("g").attr("class","nv-barsWrap"),L.attr("transform","translate("+i.left+","+i.top+")"),l&&L.select(".nv-y.nv-axis").attr("transform","translate("+E+",0)"),t.width(E).height(S);var A=L.select(".nv-barsWrap").datum(e.filter(function(e){return!e.disabled}));A.transition().call(t),k.append("clipPath").attr("id","nv-x-label-clip-"+t.id()).append("rect"),L.select("#nv-x-label-clip-"+t.id()+" rect").attr("width",d.rangeBand()*(c?2:1)).attr("height",16).attr("x",-d.rangeBand()/(c?1:2));if(a){n.scale(d).ticks(E/100).tickSize(-S,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+(v.range()[0]+(t.showValues()&&v.domain()[0]<0?16:0))+")"),L.select(".nv-x.nv-axis").transition().call(n);var O=L.select(".nv-x.nv-axis").selectAll("g");c&&O.selectAll("text").attr("transform",function(e,t,n){return"translate(0,"+(n%2==0?"5":"17")+")"})}f&&(r.scale(v).ticks(S/36).tickSize(-E,0),L.select(".nv-y.nv-axis").transition().call(r)),L.select(".nv-zeroLine line").attr("x1",0).attr("x2",E).attr("y1",v(0)).attr("y2",v(0)),g.on("tooltipShow",function(e){h&&b(e,p.parentNode)})}),w}var t=e.models.discreteBar(),n=e.models.axis(),r=e.models.axis(),i={top:15,right:10,bottom:50,left:60},s=null,o=null,u=e.utils.getColor(),a=!0,f=!0,l=!1,c=!1,h=!0,p=function(e,t,n,r,i){return"

    "+t+"

    "+"

    "+n+"

    "},d,v,m="No Data Available.",g=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate"),y=250;n.orient("bottom").highlightZero(!1).showMaxMin(!1).tickFormat(function(e){return e}),r.orient(l?"right":"left").tickFormat(d3.format(",.1f"));var b=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=p(i.series.key,a,f,i,w);e.tooltip.show([o,u],l,i.value<0?"n":"s",null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+i.left,e.pos[1]+i.top],g.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){g.tooltipHide(e)}),g.on("tooltipHide",function(){h&&e.tooltip.cleanup()}),w.dispatch=g,w.discretebar=t,w.xAxis=n,w.yAxis=r,d3.rebind(w,t,"x","y","xDomain","yDomain","xRange","yRange","forceX","forceY","id","showValues","valueFormat"),w.options=e.utils.optionsFunc.bind(w),w.margin=function(e){return arguments.length?(i.top=typeof e.top!="undefined"?e.top:i.top,i.right=typeof e.right!="undefined"?e.right:i.right,i.bottom=typeof e.bottom!="undefined"?e.bottom:i.bottom,i.left=typeof e.left!="undefined"?e.left:i.left,w):i},w.width=function(e){return arguments.length?(s=e,w):s},w.height=function(e){return arguments.length?(o=e,w):o},w.color=function(n){return arguments.length?(u=e.utils.getColor(n),t.color(u),w):u},w.showXAxis=function(e){return arguments.length?(a=e,w):a},w.showYAxis=function(e){return arguments.length?(f=e,w):f},w.rightAlignYAxis=function(e){return arguments.length?(l=e,r.orient(e?"right":"left"),w):l},w.staggerLabels=function(e){return arguments.length?(c=e,w):c},w.tooltips=function(e){return arguments.length?(h=e,w):h},w.tooltipContent=function(e){return arguments.length?(p=e,w):p},w.noData=function(e){return arguments.length?(m=e,w):m},w.transitionDuration=function(e){return arguments.length?(y=e,w):y},w},e.models.distribution=function(){"use strict";function l(e){return e.each(function(e){var a=n-(i==="x"?t.left+t.right:t.top+t.bottom),l=i=="x"?"y":"x",c=d3.select(this);f=f||u;var h=c.selectAll("g.nv-distribution").data([e]),p=h.enter().append("g").attr("class","nvd3 nv-distribution"),d=p.append("g"),v=h.select("g");h.attr("transform","translate("+t.left+","+t.top+")");var m=v.selectAll("g.nv-dist").data(function(e){return e},function(e){return e.key});m.enter().append("g"),m.attr("class",function(e,t){return"nv-dist nv-series-"+t}).style("stroke",function(e,t){return o(e,t)});var g=m.selectAll("line.nv-dist"+i).data(function(e){return e.values});g.enter().append("line").attr(i+"1",function(e,t){return f(s(e,t))}).attr(i+"2",function(e,t){return f(s(e,t))}),m.exit().selectAll("line.nv-dist"+i).transition().attr(i+"1",function(e,t){return u(s(e,t))}).attr(i+"2",function(e,t){return u(s(e,t))}).style("stroke-opacity",0).remove(),g.attr("class",function(e,t){return"nv-dist"+i+" nv-dist"+i+"-"+t}).attr(l+"1",0).attr(l+"2",r),g.transition().attr(i+"1",function(e,t){return u(s(e,t))}).attr(i+"2",function(e,t){return u(s(e,t))}),f=u.copy()}),l}var t={top:0,right:0,bottom:0,left:0},n=400,r=8,i="x",s=function(e){return e[i]},o=e.utils.defaultColor(),u=d3.scale.linear(),a,f;return l.options=e.utils.optionsFunc.bind(l),l.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,l):t},l.width=function(e){return arguments.length?(n=e,l):n},l.axis=function(e){return arguments.length?(i=e,l):i},l.size=function(e){return arguments.length?(r=e,l):r},l.getData=function(e){return arguments.length?(s=d3.functor(e),l):s},l.scale=function(e){return arguments.length?(u=e,l):u},l.color=function(t){return arguments.length?(o=e.utils.getColor(t),l):o},l},e.models.historicalBar=function(){"use strict";function w(E){return E.each(function(w){var E=n-t.left-t.right,S=r-t.top-t.bottom,T=d3.select(this);s.domain(d||d3.extent(w[0].values.map(u).concat(f))),c?s.range(m||[E*.5/w[0].values.length,E*(w[0].values.length-.5)/w[0].values.length]):s.range(m||[0,E]),o.domain(v||d3.extent(w[0].values.map(a).concat(l))).range(g||[S,0]),s.domain()[0]===s.domain()[1]&&(s.domain()[0]?s.domain([s.domain()[0]-s.domain()[0]*.01,s.domain()[1]+s.domain()[1]*.01]):s.domain([-1,1])),o.domain()[0]===o.domain()[1]&&(o.domain()[0]?o.domain([o.domain()[0]+o.domain()[0]*.01,o.domain()[1]-o.domain()[1]*.01]):o.domain([-1,1]));var N=T.selectAll("g.nv-wrap.nv-historicalBar-"+i).data([w[0].values]),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+i),k=C.append("defs"),L=C.append("g"),A=N.select("g");L.append("g").attr("class","nv-bars"),N.attr("transform","translate("+t.left+","+t.top+")"),T.on("click",function(e,t){y.chartClick({data:e,index:t,pos:d3.event,id:i})}),k.append("clipPath").attr("id","nv-chart-clip-path-"+i).append("rect"),N.select("#nv-chart-clip-path-"+i+" rect").attr("width",E).attr("height",S),A.attr("clip-path",h?"url(#nv-chart-clip-path-"+i+")":"");var O=N.select(".nv-bars").selectAll(".nv-bar").data(function(e){return e},function(e,t){return u(e,t)});O.exit().remove();var M=O.enter().append("rect").attr("x",0).attr("y",function(t,n){return e.utils.NaNtoZero(o(Math.max(0,a(t,n))))}).attr("height",function(t,n){return e.utils.NaNtoZero(Math.abs(o(a(t,n))-o(0)))}).attr("transform",function(e,t){return"translate("+(s(u(e,t))-E/w[0].values.length*.45)+",0)"}).on("mouseover",function(e,t){if(!b)return;d3.select(this).classed("hover",!0),y.elementMouseover({point:e,series:w[0],pos:[s(u(e,t)),o(a(e,t))],pointIndex:t,seriesIndex:0,e:d3.event})}).on("mouseout",function(e,t){if(!b)return;d3.select(this).classed("hover",!1),y.elementMouseout({point:e,series:w[0],pointIndex:t,seriesIndex:0,e:d3.event})}).on("click",function(e,t){if(!b)return;y.elementClick({value:a(e,t),data:e,index:t,pos:[s(u(e,t)),o(a(e,t))],e:d3.event,id:i}),d3.event.stopPropagation()}).on("dblclick",function(e,t){if(!b)return;y.elementDblClick({value:a(e,t),data:e,index:t,pos:[s(u(e,t)),o(a(e,t))],e:d3.event,id:i}),d3.event.stopPropagation()});O.attr("fill",function(e,t){return p(e,t)}).attr("class",function(e,t,n){return(a(e,t)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+n+"-"+t}).transition().attr("transform",function(e,t){return"translate("+(s(u(e,t))-E/w[0].values.length*.45)+",0)"}).attr("width",E/w[0].values.length*.9),O.transition().attr("y",function(t,n){var r=a(t,n)<0?o(0):o(0)-o(a(t,n))<1?o(0)-1:o(a(t,n));return e.utils.NaNtoZero(r)}).attr("height",function(t,n){return e.utils.NaNtoZero(Math.max(Math.abs(o(a(t,n))-o(0)),1))})}),w}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=Math.floor(Math.random()*1e4),s=d3.scale.linear(),o=d3.scale.linear(),u=function(e){return e.x},a=function(e){return e.y},f=[],l=[0],c=!1,h=!0,p=e.utils.defaultColor(),d,v,m,g,y=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout"),b=!0;return w.highlightPoint=function(e,t){d3.select(".nv-historicalBar-"+i).select(".nv-bars .nv-bar-0-"+e).classed("hover",t)},w.clearHighlights=function(){d3.select(".nv-historicalBar-"+i).select(".nv-bars .nv-bar.hover").classed("hover",!1)},w.dispatch=y,w.options=e.utils.optionsFunc.bind(w),w.x=function(e){return arguments.length?(u=e,w):u},w.y=function(e){return arguments.length?(a=e,w):a},w.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,w):t},w.width=function(e){return arguments.length?(n=e,w):n},w.height=function(e){return arguments.length?(r=e,w):r},w.xScale=function(e){return arguments.length?(s=e,w):s},w.yScale=function(e){return arguments.length?(o=e,w):o},w.xDomain=function(e){return arguments.length?(d=e,w):d},w.yDomain=function(e){return arguments.length?(v=e,w):v},w.xRange=function(e){return arguments.length?(m=e,w):m},w.yRange=function(e){return arguments.length?(g=e,w):g},w.forceX=function(e){return arguments.length?(f=e,w):f},w.forceY=function(e){return arguments.length?(l=e,w):l},w.padData=function(e){return arguments.length?(c=e,w):c},w.clipEdge=function(e){return arguments.length?(h=e,w):h},w.color=function(t){return arguments.length?(p=e.utils.getColor(t),w):p},w.id=function(e){return arguments.length?(i=e,w):i},w.interactive=function(e){return arguments.length?(b=!1,w):b},w},e.models.historicalBarChart=function(){"use strict";function x(e){return e.each(function(d){var T=d3.select(this),N=this,C=(u||parseInt(T.style("width"))||960)-s.left-s.right,k=(a||parseInt(T.style("height"))||400)-s.top-s.bottom;x.update=function(){T.transition().duration(E).call(x)},x.container=this,g.disabled=d.map(function(e){return!!e.disabled});if(!y){var L;y={};for(L in g)g[L]instanceof Array?y[L]=g[L].slice(0):y[L]=g[L]}if(!d||!d.length||!d.filter(function(e){return e.values.length}).length){var A=T.selectAll(".nv-noData").data([b]);return A.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),A.attr("x",s.left+C/2).attr("y",s.top+k/2).text(function(e){return e}),x}T.selectAll(".nv-noData").remove(),v=t.xScale(),m=t.yScale();var O=T.selectAll("g.nv-wrap.nv-historicalBarChart").data([d]),M=O.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),_=O.select("g");M.append("g").attr("class","nv-x nv-axis"),M.append("g").attr("class","nv-y nv-axis"),M.append("g").attr("class","nv-barsWrap"),M.append("g").attr("class","nv-legendWrap"),f&&(i.width(C),_.select(".nv-legendWrap").datum(d).call(i),s.top!=i.height()&&(s.top=i.height(),k=(a||parseInt(T.style("height"))||400)-s.top-s.bottom),O.select(".nv-legendWrap").attr("transform","translate(0,"+ -s.top+")")),O.attr("transform","translate("+s.left+","+s.top+")"),h&&_.select(".nv-y.nv-axis").attr("transform","translate("+C+",0)"),t.width(C).height(k).color(d.map(function(e,t){return e.color||o(e,t)}).filter(function(e,t){return!d[t].disabled}));var D=_.select(".nv-barsWrap").datum(d.filter(function(e){return!e.disabled}));D.transition().call(t),l&&(n.scale(v).tickSize(-k,0),_.select(".nv-x.nv-axis").attr("transform","translate(0,"+m.range()[0]+")"),_.select(".nv-x.nv-axis").transition().call(n)),c&&(r.scale(m).ticks(k/36).tickSize(-C,0),_.select(".nv-y.nv-axis").transition().call(r)),i.dispatch.on("legendClick",function(t,n){t.disabled=!t.disabled,d.filter(function(e){return!e.disabled}).length||d.map(function(e){return e.disabled=!1,O.selectAll(".nv-series").classed("disabled",!1),e}),g.disabled=d.map(function(e){return!!e.disabled}),w.stateChange(g),e.transition().call(x)}),i.dispatch.on("legendDblclick",function(e){d.forEach(function(e){e.disabled=!0}),e.disabled=!1,g.disabled=d.map(function(e){return!!e.disabled}),w.stateChange(g),x.update()}),w.on("tooltipShow",function(e){p&&S(e,N.parentNode)}),w.on("changeState",function(e){typeof e.disabled!="undefined"&&(d.forEach(function(t,n){t.disabled=e.disabled[n]}),g.disabled=e.disabled),x.update()})}),x}var t=e.models.historicalBar(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s={top:30,right:90,bottom:50,left:90},o=e.utils.defaultColor(),u=null,a=null,f=!1,l=!0,c=!0,h=!1,p=!0,d=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},v,m,g={},y=null,b="No Data Available.",w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),E=250;n.orient("bottom").tickPadding(7),r.orient(h?"right":"left");var S=function(i,s){if(s){var o=d3.select(s).select("svg"),u=o.node()?o.attr("viewBox"):null;if(u){u=u.split(" ");var a=parseInt(o.style("width"))/u[2];i.pos[0]=i.pos[0]*a,i.pos[1]=i.pos[1]*a}}var f=i.pos[0]+(s.offsetLeft||0),l=i.pos[1]+(s.offsetTop||0),c=n.tickFormat()(t.x()(i.point,i.pointIndex)),h=r.tickFormat()(t.y()(i.point,i.pointIndex)),p=d(i.series.key,c,h,i,x);e.tooltip.show([f,l],p,null,null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+s.left,e.pos[1]+s.top],w.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){w.tooltipHide(e)}),w.on("tooltipHide",function(){p&&e.tooltip.cleanup()}),x.dispatch=w,x.bars=t,x.legend=i,x.xAxis=n,x.yAxis=r,d3.rebind(x,t,"defined","isArea","x","y","size","xScale","yScale","xDomain","yDomain","xRange","yRange","forceX","forceY","interactive","clipEdge","clipVoronoi","id","interpolate","highlightPoint","clearHighlights","interactive"),x.options=e.utils.optionsFunc.bind(x),x.margin=function(e){return arguments.length?(s.top=typeof e.top!="undefined"?e.top:s.top,s.right=typeof e.right!="undefined"?e.right:s.right,s.bottom=typeof e.bottom!="undefined"?e.bottom:s.bottom,s.left=typeof e.left!="undefined"?e.left:s.left,x):s},x.width=function(e){return arguments.length?(u=e,x):u},x.height=function(e){return arguments.length?(a=e,x):a},x.color=function(t){return arguments.length?(o=e.utils.getColor(t),i.color(o),x):o},x.showLegend=function(e){return arguments.length?(f=e,x):f},x.showXAxis=function(e){return arguments.length?(l=e,x):l},x.showYAxis=function(e){return arguments.length?(c=e,x):c},x.rightAlignYAxis=function(e){return arguments.length?(h=e,r.orient(e?"right":"left"),x):h},x.tooltips=function(e){return arguments.length?(p=e,x):p},x.tooltipContent=function(e){return arguments.length?(d=e,x):d},x.state=function(e){return arguments.length?(g=e,x):g},x.defaultState=function(e){return arguments.length?(y=e,x):y},x.noData=function(e){return arguments.length?(b=e,x):b},x.transitionDuration=function(e){return arguments.length?(E=e,x):E},x},e.models.indentedTree=function(){"use strict";function g(e){return e.each(function(e){function k(e,t,n){d3.event.stopPropagation();if(d3.event.shiftKey&&!n)return d3.event.shiftKey=!1,e.values&&e.values.forEach(function(e){(e.values||e._values)&&k(e,0,!0)}),!0;if(!O(e))return!0;e.values?(e._values=e.values,e.values=null):(e.values=e._values,e._values=null),g.update()}function L(e){return e._values&&e._values.length?h:e.values&&e.values.length?p:""}function A(e){return e._values&&e._values.length}function O(e){var t=e.values||e._values;return t&&t.length}var t=1,n=d3.select(this),i=d3.layout.tree().children(function(e){return e.values}).size([r,f]);g.update=function(){n.transition().duration(600).call(g)},e[0]||(e[0]={key:a});var s=i.nodes(e[0]),y=d3.select(this).selectAll("div").data([[s]]),b=y.enter().append("div").attr("class","nvd3 nv-wrap nv-indentedtree"),w=b.append("table"),E=y.select("table").attr("width","100%").attr("class",c);if(o){var S=w.append("thead"),x=S.append("tr");l.forEach(function(e){x.append("th").attr("width",e.width?e.width:"10%").style("text-align",e.type=="numeric"?"right":"left").append("span").text(e.label)})}var T=E.selectAll("tbody").data(function(e){return e});T.enter().append("tbody"),t=d3.max(s,function(e){return e.depth}),i.size([r,t*f]);var N=T.selectAll("tr").data(function(e){return e.filter(function(e){return u&&!e.children?u(e):!0})},function(e,t){return e.id||e.id||++m});N.exit().remove(),N.select("img.nv-treeicon").attr("src",L).classed("folded",A);var C=N.enter().append("tr");l.forEach(function(e,t){var n=C.append("td").style("padding-left",function(e){return(t?0:e.depth*f+12+(L(e)?0:16))+"px"},"important").style("text-align",e.type=="numeric"?"right":"left");t==0&&n.append("img").classed("nv-treeicon",!0).classed("nv-folded",A).attr("src",L).style("width","14px").style("height","14px").style("padding","0 1px").style("display",function(e){return L(e)?"inline-block":"none"}).on("click",k),n.each(function(n){!t&&v(n)?d3.select(this).append("a").attr("href",v).attr("class",d3.functor(e.classes)).append("span"):d3.select(this).append("span"),d3.select(this).select("span").attr("class",d3.functor(e.classes)).text(function(t){return e.format?e.format(t):t[e.key]||"-"})}),e.showCount&&(n.append("span").attr("class","nv-childrenCount"),N.selectAll("span.nv-childrenCount").text(function(e){return e.values&&e.values.length||e._values&&e._values.length?"("+(e.values&&e.values.filter(function(e){return u?u(e):!0}).length||e._values&&e._values.filter(function(e){return u?u(e):!0}).length||0)+")":""}))}),N.order().on("click",function(e){d.elementClick({row:this,data:e,pos:[e.x,e.y]})}).on("dblclick",function(e){d.elementDblclick({row:this,data:e,pos:[e.x,e.y]})}).on("mouseover",function(e){d.elementMouseover({row:this,data:e,pos:[e.x,e.y]})}).on("mouseout",function(e){d.elementMouseout({row:this,data:e,pos:[e.x,e.y]})})}),g}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=e.utils.defaultColor(),s=Math.floor(Math.random()*1e4),o=!0,u=!1,a="No Data Available.",f=20,l=[{key:"key",label:"Name",type:"text"}],c=null,h="images/grey-plus.png",p="images/grey-minus.png",d=d3.dispatch("elementClick","elementDblclick","elementMouseover","elementMouseout"),v=function(e){return e.url},m=0;return g.options=e.utils.optionsFunc.bind(g),g.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,g):t},g.width=function(e){return arguments.length?(n=e,g):n},g.height=function(e){return arguments.length?(r=e,g):r},g.color=function(t){return arguments.length?(i=e.utils.getColor(t),scatter.color(i),g):i},g.id=function(e){return arguments.length?(s=e,g):s},g.header=function(e){return arguments.length?(o=e,g):o},g.noData=function(e){return arguments.length?(a=e,g):a},g.filterZero=function(e){return arguments.length?(u=e,g):u},g.columns=function(e){return arguments.length?(l=e,g):l},g.tableClass=function(e){return arguments.length?(c=e,g):c},g.iconOpen=function(e){return arguments.length?(h=e,g):h},g.iconClose=function(e){return arguments.length?(p=e,g):p},g.getUrl=function(e){return arguments.length?(v=e,g):v},g},e.models.legend=function(){"use strict";function c(h){return h.each(function(c){var h=n-t.left-t.right,p=d3.select(this),d=p.selectAll("g.nv-legend").data([c]),v=d.enter().append("g").attr("class","nvd3 nv-legend").append("g"),m=d.select("g");d.attr("transform","translate("+t.left+","+t.top+")");var g=m.selectAll(".nv-series").data(function(e){return e}),y=g.enter().append("g").attr("class","nv-series").on("mouseover",function(e,t){l.legendMouseover(e,t)}).on("mouseout",function(e,t){l.legendMouseout(e,t)}).on("click",function(e,t){l.legendClick(e,t),a&&(f?(c.forEach(function(e){e.disabled=!0}),e.disabled=!1):(e.disabled=!e.disabled,c.every(function(e){return e.disabled})&&c.forEach(function(e){e.disabled=!1})),l.stateChange({disabled:c.map(function(e){return!!e.disabled})}))}).on("dblclick",function(e,t){l.legendDblclick(e,t),a&&(c.forEach(function(e){e.disabled=!0}),e.disabled=!1,l.stateChange({disabled:c.map(function(e){return!!e.disabled})}))});y.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),y.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8"),g.classed("disabled",function(e){return e.disabled}),g.exit().remove(),g.select("circle").style("fill",function(e,t){return e.color||s(e,t)}).style("stroke",function(e,t){return e.color||s(e,t)}),g.select("text").text(i);if(o){var b=[];g.each(function(t,n){var r=d3.select(this).select("text"),i;try{i=r.getComputedTextLength();if(i<=0)throw Error()}catch(s){i=e.utils.calcApproxTextWidth(r)}b.push(i+28)});var w=0,E=0,S=[];while(Eh&&w>1){S=[],w--;for(var x=0;x(S[x%w]||0)&&(S[x%w]=b[x]);E=S.reduce(function(e,t,n,r){return e+t})}var T=[];for(var N=0,C=0;NA&&(A=L),"translate("+O+","+k+")"}),m.attr("transform","translate("+(n-t.right-A)+","+t.top+")"),r=t.top+t.bottom+k+15}}),c}var t={top:5,right:0,bottom:5,left:0},n=400,r=20,i=function(e){return e.key},s=e.utils.defaultColor(),o=!0,u=!0,a=!0,f=!1,l=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange");return c.dispatch=l,c.options=e.utils.optionsFunc.bind(c),c.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,c):t},c.width=function(e){return arguments.length?(n=e,c):n},c.height=function(e){return arguments.length?(r=e,c):r},c.key=function(e){return arguments.length?(i=e,c):i},c.color=function(t){return arguments.length?(s=e.utils.getColor(t),c):s},c.align=function(e){return arguments.length?(o=e,c):o},c.rightAlign=function(e){return arguments.length?(u=e,c):u},c.updateState=function(e){return arguments.length?(a=e,c):a},c.radioButtonMode=function(e){return arguments.length?(f=e,c):f},c},e.models.line=function(){"use strict";function m(g){return g.each(function(m){var g=r-n.left-n.right,b=i-n.top-n.bottom,w=d3.select(this);c=t.xScale(),h=t.yScale(),d=d||c,v=v||h;var E=w.selectAll("g.nv-wrap.nv-line").data([m]),S=E.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),T=S.append("defs"),N=S.append("g"),C=E.select("g");N.append("g").attr("class","nv-groups"),N.append("g").attr("class","nv-scatterWrap"),E.attr("transform","translate("+n.left+","+n.top+")"),t.width(g).height(b);var k=E.select(".nv-scatterWrap");k.transition().call(t),T.append("clipPath").attr("id","nv-edge-clip-"+t.id()).append("rect"),E.select("#nv-edge-clip-"+t.id()+" rect").attr("width",g).attr("height",b),C.attr("clip-path",l?"url(#nv-edge-clip-"+t.id()+")":""),k.attr("clip-path",l?"url(#nv-edge-clip-"+t.id()+")":"");var L=E.select(".nv-groups").selectAll(".nv-group").data(function(e){return e},function(e){return e.key});L.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),L.exit().remove(),L.attr("class",function(e,t){return"nv-group nv-series-"+t}).classed("hover",function(e){return e.hover}).style("fill",function(e,t){return s(e,t)}).style("stroke",function(e,t){return s(e,t)}),L.transition().style("stroke-opacity",1).style("fill-opacity",.5);var A=L.selectAll("path.nv-area").data(function(e){return f(e)?[e]:[]});A.enter().append("path").attr("class","nv-area").attr("d",function(t){return d3.svg.area().interpolate(p).defined(a).x(function(t,n){return e. -utils.NaNtoZero(d(o(t,n)))}).y0(function(t,n){return e.utils.NaNtoZero(v(u(t,n)))}).y1(function(e,t){return v(h.domain()[0]<=0?h.domain()[1]>=0?0:h.domain()[1]:h.domain()[0])}).apply(this,[t.values])}),L.exit().selectAll("path.nv-area").remove(),A.transition().attr("d",function(t){return d3.svg.area().interpolate(p).defined(a).x(function(t,n){return e.utils.NaNtoZero(c(o(t,n)))}).y0(function(t,n){return e.utils.NaNtoZero(h(u(t,n)))}).y1(function(e,t){return h(h.domain()[0]<=0?h.domain()[1]>=0?0:h.domain()[1]:h.domain()[0])}).apply(this,[t.values])});var O=L.selectAll("path.nv-line").data(function(e){return[e.values]});O.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(p).defined(a).x(function(t,n){return e.utils.NaNtoZero(d(o(t,n)))}).y(function(t,n){return e.utils.NaNtoZero(v(u(t,n)))})),O.transition().attr("d",d3.svg.line().interpolate(p).defined(a).x(function(t,n){return e.utils.NaNtoZero(c(o(t,n)))}).y(function(t,n){return e.utils.NaNtoZero(h(u(t,n)))})),d=c.copy(),v=h.copy()}),m}var t=e.models.scatter(),n={top:0,right:0,bottom:0,left:0},r=960,i=500,s=e.utils.defaultColor(),o=function(e){return e.x},u=function(e){return e.y},a=function(e,t){return!isNaN(u(e,t))&&u(e,t)!==null},f=function(e){return e.area},l=!1,c,h,p="linear";t.size(16).sizeDomain([16,256]);var d,v;return m.dispatch=t.dispatch,m.scatter=t,d3.rebind(m,t,"id","interactive","size","xScale","yScale","zScale","xDomain","yDomain","xRange","yRange","sizeDomain","forceX","forceY","forceSize","clipVoronoi","useVoronoi","clipRadius","padData","highlightPoint","clearHighlights"),m.options=e.utils.optionsFunc.bind(m),m.margin=function(e){return arguments.length?(n.top=typeof e.top!="undefined"?e.top:n.top,n.right=typeof e.right!="undefined"?e.right:n.right,n.bottom=typeof e.bottom!="undefined"?e.bottom:n.bottom,n.left=typeof e.left!="undefined"?e.left:n.left,m):n},m.width=function(e){return arguments.length?(r=e,m):r},m.height=function(e){return arguments.length?(i=e,m):i},m.x=function(e){return arguments.length?(o=e,t.x(e),m):o},m.y=function(e){return arguments.length?(u=e,t.y(e),m):u},m.clipEdge=function(e){return arguments.length?(l=e,m):l},m.color=function(n){return arguments.length?(s=e.utils.getColor(n),t.color(s),m):s},m.interpolate=function(e){return arguments.length?(p=e,m):p},m.defined=function(e){return arguments.length?(a=e,m):a},m.isArea=function(e){return arguments.length?(f=d3.functor(e),m):f},m},e.models.lineChart=function(){"use strict";function N(m){return m.each(function(m){var C=d3.select(this),k=this,L=(a||parseInt(C.style("width"))||960)-o.left-o.right,A=(f||parseInt(C.style("height"))||400)-o.top-o.bottom;N.update=function(){C.transition().duration(x).call(N)},N.container=this,b.disabled=m.map(function(e){return!!e.disabled});if(!w){var O;w={};for(O in b)b[O]instanceof Array?w[O]=b[O].slice(0):w[O]=b[O]}if(!m||!m.length||!m.filter(function(e){return e.values.length}).length){var M=C.selectAll(".nv-noData").data([E]);return M.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),M.attr("x",o.left+L/2).attr("y",o.top+A/2).text(function(e){return e}),N}C.selectAll(".nv-noData").remove(),g=t.xScale(),y=t.yScale();var _=C.selectAll("g.nv-wrap.nv-lineChart").data([m]),D=_.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),P=_.select("g");D.append("rect").style("opacity",0),D.append("g").attr("class","nv-x nv-axis"),D.append("g").attr("class","nv-y nv-axis"),D.append("g").attr("class","nv-linesWrap"),D.append("g").attr("class","nv-legendWrap"),D.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",L).attr("height",A>0?A:0),l&&(i.width(L),P.select(".nv-legendWrap").datum(m).call(i),o.top!=i.height()&&(o.top=i.height(),A=(f||parseInt(C.style("height"))||400)-o.top-o.bottom),_.select(".nv-legendWrap").attr("transform","translate(0,"+ -o.top+")")),_.attr("transform","translate("+o.left+","+o.top+")"),p&&P.select(".nv-y.nv-axis").attr("transform","translate("+L+",0)"),d&&(s.width(L).height(A).margin({left:o.left,top:o.top}).svgContainer(C).xScale(g),_.select(".nv-interactive").call(s)),t.width(L).height(A).color(m.map(function(e,t){return e.color||u(e,t)}).filter(function(e,t){return!m[t].disabled}));var H=P.select(".nv-linesWrap").datum(m.filter(function(e){return!e.disabled}));H.transition().call(t),c&&(n.scale(g).ticks(L/100).tickSize(-A,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+y.range()[0]+")"),P.select(".nv-x.nv-axis").transition().call(n)),h&&(r.scale(y).ticks(A/36).tickSize(-L,0),P.select(".nv-y.nv-axis").transition().call(r)),i.dispatch.on("stateChange",function(e){b=e,S.stateChange(b),N.update()}),s.dispatch.on("elementMousemove",function(i){t.clearHighlights();var a,f,l,c=[];m.filter(function(e,t){return e.seriesIndex=t,!e.disabled}).forEach(function(n,r){f=e.interactiveBisect(n.values,i.pointXValue,N.x()),t.highlightPoint(r,f,!0);var s=n.values[f];if(typeof s=="undefined")return;typeof a=="undefined"&&(a=s),typeof l=="undefined"&&(l=N.xScale()(N.x()(s,f))),c.push({key:n.key,value:N.y()(s,f),color:u(n,n.seriesIndex)})});if(c.length>2){var h=N.yScale().invert(i.mouseY),p=Math.abs(N.yScale().domain()[0]-N.yScale().domain()[1]),d=.03*p,g=e.nearestValueIndex(c.map(function(e){return e.value}),h,d);g!==null&&(c[g].highlight=!0)}var y=n.tickFormat()(N.x()(a,f));s.tooltip.position({left:l+o.left,top:i.mouseY+o.top}).chartContainer(k.parentNode).enabled(v).valueFormatter(function(e,t){return r.tickFormat()(e)}).data({value:y,series:c})(),s.renderGuideLine(l)}),s.dispatch.on("elementMouseout",function(e){S.tooltipHide(),t.clearHighlights()}),S.on("tooltipShow",function(e){v&&T(e,k.parentNode)}),S.on("changeState",function(e){typeof e.disabled!="undefined"&&m.length===e.disabled.length&&(m.forEach(function(t,n){t.disabled=e.disabled[n]}),b.disabled=e.disabled),N.update()})}),N}var t=e.models.line(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.interactiveGuideline(),o={top:30,right:20,bottom:50,left:60},u=e.utils.defaultColor(),a=null,f=null,l=!0,c=!0,h=!0,p=!1,d=!1,v=!0,m=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},g,y,b={},w=null,E="No Data Available.",S=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),x=250;n.orient("bottom").tickPadding(7),r.orient(p?"right":"left");var T=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=m(i.series.key,a,f,i,N);e.tooltip.show([o,u],l,null,null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+o.left,e.pos[1]+o.top],S.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){S.tooltipHide(e)}),S.on("tooltipHide",function(){v&&e.tooltip.cleanup()}),N.dispatch=S,N.lines=t,N.legend=i,N.xAxis=n,N.yAxis=r,N.interactiveLayer=s,d3.rebind(N,t,"defined","isArea","x","y","size","xScale","yScale","xDomain","yDomain","xRange","yRange","forceX","forceY","interactive","clipEdge","clipVoronoi","useVoronoi","id","interpolate"),N.options=e.utils.optionsFunc.bind(N),N.margin=function(e){return arguments.length?(o.top=typeof e.top!="undefined"?e.top:o.top,o.right=typeof e.right!="undefined"?e.right:o.right,o.bottom=typeof e.bottom!="undefined"?e.bottom:o.bottom,o.left=typeof e.left!="undefined"?e.left:o.left,N):o},N.width=function(e){return arguments.length?(a=e,N):a},N.height=function(e){return arguments.length?(f=e,N):f},N.color=function(t){return arguments.length?(u=e.utils.getColor(t),i.color(u),N):u},N.showLegend=function(e){return arguments.length?(l=e,N):l},N.showXAxis=function(e){return arguments.length?(c=e,N):c},N.showYAxis=function(e){return arguments.length?(h=e,N):h},N.rightAlignYAxis=function(e){return arguments.length?(p=e,r.orient(e?"right":"left"),N):p},N.useInteractiveGuideline=function(e){return arguments.length?(d=e,e===!0&&(N.interactive(!1),N.useVoronoi(!1)),N):d},N.tooltips=function(e){return arguments.length?(v=e,N):v},N.tooltipContent=function(e){return arguments.length?(m=e,N):m},N.state=function(e){return arguments.length?(b=e,N):b},N.defaultState=function(e){return arguments.length?(w=e,N):w},N.noData=function(e){return arguments.length?(E=e,N):E},N.transitionDuration=function(e){return arguments.length?(x=e,N):x},N},e.models.linePlusBarChart=function(){"use strict";function T(e){return e.each(function(e){var l=d3.select(this),c=this,v=(a||parseInt(l.style("width"))||960)-u.left-u.right,N=(f||parseInt(l.style("height"))||400)-u.top-u.bottom;T.update=function(){l.transition().call(T)},b.disabled=e.map(function(e){return!!e.disabled});if(!w){var C;w={};for(C in b)b[C]instanceof Array?w[C]=b[C].slice(0):w[C]=b[C]}if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var k=l.selectAll(".nv-noData").data([E]);return k.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),k.attr("x",u.left+v/2).attr("y",u.top+N/2).text(function(e){return e}),T}l.selectAll(".nv-noData").remove();var L=e.filter(function(e){return!e.disabled&&e.bar}),A=e.filter(function(e){return!e.bar});m=A.filter(function(e){return!e.disabled}).length&&A.filter(function(e){return!e.disabled})[0].values.length?t.xScale():n.xScale(),g=n.yScale(),y=t.yScale();var O=d3.select(this).selectAll("g.nv-wrap.nv-linePlusBar").data([e]),M=O.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),_=O.select("g");M.append("g").attr("class","nv-x nv-axis"),M.append("g").attr("class","nv-y1 nv-axis"),M.append("g").attr("class","nv-y2 nv-axis"),M.append("g").attr("class","nv-barsWrap"),M.append("g").attr("class","nv-linesWrap"),M.append("g").attr("class","nv-legendWrap"),p&&(o.width(v/2),_.select(".nv-legendWrap").datum(e.map(function(e){return e.originalKey=e.originalKey===undefined?e.key:e.originalKey,e.key=e.originalKey+(e.bar?" (left axis)":" (right axis)"),e})).call(o),u.top!=o.height()&&(u.top=o.height(),N=(f||parseInt(l.style("height"))||400)-u.top-u.bottom),_.select(".nv-legendWrap").attr("transform","translate("+v/2+","+ -u.top+")")),O.attr("transform","translate("+u.left+","+u.top+")"),t.width(v).height(N).color(e.map(function(e,t){return e.color||h(e,t)}).filter(function(t,n){return!e[n].disabled&&!e[n].bar})),n.width(v).height(N).color(e.map(function(e,t){return e.color||h(e,t)}).filter(function(t,n){return!e[n].disabled&&e[n].bar}));var D=_.select(".nv-barsWrap").datum(L.length?L:[{values:[]}]),P=_.select(".nv-linesWrap").datum(A[0]&&!A[0].disabled?A:[{values:[]}]);d3.transition(D).call(n),d3.transition(P).call(t),r.scale(m).ticks(v/100).tickSize(-N,0),_.select(".nv-x.nv-axis").attr("transform","translate(0,"+g.range()[0]+")"),d3.transition(_.select(".nv-x.nv-axis")).call(r),i.scale(g).ticks(N/36).tickSize(-v,0),d3.transition(_.select(".nv-y1.nv-axis")).style("opacity",L.length?1:0).call(i),s.scale(y).ticks(N/36).tickSize(L.length?0:-v,0),_.select(".nv-y2.nv-axis").style("opacity",A.length?1:0).attr("transform","translate("+v+",0)"),d3.transition(_.select(".nv-y2.nv-axis")).call(s),o.dispatch.on("stateChange",function(e){b=e,S.stateChange(b),T.update()}),S.on("tooltipShow",function(e){d&&x(e,c.parentNode)}),S.on("changeState",function(t){typeof t.disabled!="undefined"&&(e.forEach(function(e,n){e.disabled=t.disabled[n]}),b.disabled=t.disabled),T.update()})}),T}var t=e.models.line(),n=e.models.historicalBar(),r=e.models.axis(),i=e.models.axis(),s=e.models.axis(),o=e.models.legend(),u={top:30,right:60,bottom:50,left:60},a=null,f=null,l=function(e){return e.x},c=function(e){return e.y},h=e.utils.defaultColor(),p=!0,d=!0,v=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},m,g,y,b={},w=null,E="No Data Available.",S=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState");n.padData(!0),t.clipEdge(!1).padData(!0),r.orient("bottom").tickPadding(7).highlightZero(!1),i.orient("left"),s.orient("right");var x=function(n,o){var u=n.pos[0]+(o.offsetLeft||0),a=n.pos[1]+(o.offsetTop||0),f=r.tickFormat()(t.x()(n.point,n.pointIndex)),l=(n.series.bar?i:s).tickFormat()(t.y()(n.point,n.pointIndex)),c=v(n.series.key,f,l,n,T);e.tooltip.show([u,a],c,n.value<0?"n":"s",null,o)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+u.left,e.pos[1]+u.top],S.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){S.tooltipHide(e)}),n.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+u.left,e.pos[1]+u.top],S.tooltipShow(e)}),n.dispatch.on("elementMouseout.tooltip",function(e){S.tooltipHide(e)}),S.on("tooltipHide",function(){d&&e.tooltip.cleanup()}),T.dispatch=S,T.legend=o,T.lines=t,T.bars=n,T.xAxis=r,T.y1Axis=i,T.y2Axis=s,d3.rebind(T,t,"defined","size","clipVoronoi","interpolate"),T.options=e.utils.optionsFunc.bind(T),T.x=function(e){return arguments.length?(l=e,t.x(e),n.x(e),T):l},T.y=function(e){return arguments.length?(c=e,t.y(e),n.y(e),T):c},T.margin=function(e){return arguments.length?(u.top=typeof e.top!="undefined"?e.top:u.top,u.right=typeof e.right!="undefined"?e.right:u.right,u.bottom=typeof e.bottom!="undefined"?e.bottom:u.bottom,u.left=typeof e.left!="undefined"?e.left:u.left,T):u},T.width=function(e){return arguments.length?(a=e,T):a},T.height=function(e){return arguments.length?(f=e,T):f},T.color=function(t){return arguments.length?(h=e.utils.getColor(t),o.color(h),T):h},T.showLegend=function(e){return arguments.length?(p=e,T):p},T.tooltips=function(e){return arguments.length?(d=e,T):d},T.tooltipContent=function(e){return arguments.length?(v=e,T):v},T.state=function(e){return arguments.length?(b=e,T):b},T.defaultState=function(e){return arguments.length?(w=e,T):w},T.noData=function(e){return arguments.length?(E=e,T):E},T},e.models.lineWithFocusChart=function(){"use strict";function k(e){return e.each(function(e){function U(e){var t=+(e=="e"),n=t?1:-1,r=M/3;return"M"+.5*n+","+r+"A6,6 0 0 "+t+" "+6.5*n+","+(r+6)+"V"+(2*r-6)+"A6,6 0 0 "+t+" "+.5*n+","+2*r+"Z"+"M"+2.5*n+","+(r+8)+"V"+(2*r-8)+"M"+4.5*n+","+(r+8)+"V"+(2*r-8)}function z(){a.empty()||a.extent(w),I.data([a.empty()?g.domain():w]).each(function(e,t){var n=g(e[0])-v.range()[0],r=v.range()[1]-g(e[1]);d3.select(this).select(".left").attr("width",n<0?0:n),d3.select(this).select(".right").attr("x",g(e[1])).attr("width",r<0?0:r)})}function W(){w=a.empty()?null:a.extent();var n=a.empty()?g.domain():a.extent();if(Math.abs(n[0]-n[1])<=1)return;T.brush({extent:n,brush:a}),z();var s=H.select(".nv-focus .nv-linesWrap").datum(e.filter(function(e){return!e.disabled}).map(function(e,r){return{key:e.key,values:e.values.filter(function(e,r){return t.x()(e,r)>=n[0]&&t.x()(e,r)<=n[1]})}}));s.transition().duration(N).call(t),H.select(".nv-focus .nv-x.nv-axis").transition().duration(N).call(r),H.select(".nv-focus .nv-y.nv-axis").transition().duration(N).call(i)}var S=d3.select(this),L=this,A=(h||parseInt(S.style("width"))||960)-f.left-f.right,O=(p||parseInt(S.style("height"))||400)-f.top-f.bottom-d,M=d-l.top-l.bottom;k.update=function(){S.transition().duration(N).call(k)},k.container=this;if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var _=S.selectAll(".nv-noData").data([x]);return _.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),_.attr("x",f.left+A/2).attr("y",f.top+O/2).text(function(e){return e}),k}S.selectAll(".nv-noData").remove(),v=t.xScale(),m=t.yScale(),g=n.xScale(),y=n.yScale();var D=S.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([e]),P=D.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),H=D.select("g");P.append("g").attr("class","nv-legendWrap");var B=P.append("g").attr("class","nv-focus");B.append("g").attr("class","nv-x nv-axis"),B.append("g").attr("class","nv-y nv-axis"),B.append("g").attr("class","nv-linesWrap");var j=P.append("g").attr("class","nv-context");j.append("g").attr("class","nv-x nv-axis"),j.append("g").attr("class","nv-y nv-axis"),j.append("g").attr("class","nv-linesWrap"),j.append("g").attr("class","nv-brushBackground"),j.append("g").attr("class","nv-x nv-brush"),b&&(u.width(A),H.select(".nv-legendWrap").datum(e).call(u),f.top!=u.height()&&(f.top=u.height(),O=(p||parseInt(S.style("height"))||400)-f.top-f.bottom-d),H.select(".nv-legendWrap").attr("transform","translate(0,"+ -f.top+")")),D.attr("transform","translate("+f.left+","+f.top+")"),t.width(A).height(O).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),n.defined(t.defined()).width(A).height(M).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),H.select(".nv-context").attr("transform","translate(0,"+(O+f.bottom+l.top)+")");var F=H.select(".nv-context .nv-linesWrap").datum(e.filter(function(e){return!e.disabled}));d3.transition(F).call(n),r.scale(v).ticks(A/100).tickSize(-O,0),i.scale(m).ticks(O/36).tickSize(-A,0),H.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+O+")"),a.x(g).on("brush",function(){var e=k.transitionDuration();k.transitionDuration(0),W(),k.transitionDuration(e)}),w&&a.extent(w);var I=H.select(".nv-brushBackground").selectAll("g").data([w||a.extent()]),q=I.enter().append("g");q.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),q.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var R=H.select(".nv-x.nv-brush").call(a);R.selectAll("rect").attr("height",M),R.selectAll(".resize").append("path").attr("d",U),W(),s.scale(g).ticks(A/100).tickSize(-M,0),H.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+y.range()[0]+")"),d3.transition(H.select(".nv-context .nv-x.nv-axis")).call(s),o.scale(y).ticks(M/36).tickSize(-A,0),d3.transition(H.select(".nv-context .nv-y.nv-axis")).call(o),H.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+y.range()[0]+")"),u.dispatch.on("stateChange",function(e){k.update()}),T.on("tooltipShow",function(e){E&&C(e,L.parentNode)})}),k}var t=e.models.line(),n=e.models.line(),r=e.models.axis(),i=e.models.axis(),s=e.models.axis(),o=e.models.axis(),u=e.models.legend(),a=d3.svg.brush(),f={top:30,right:30,bottom:30,left:60},l={top:0,right:30,bottom:20,left:60},c=e.utils.defaultColor(),h=null,p=null,d=100,v,m,g,y,b=!0,w=null,E=!0,S=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},x="No Data Available.",T=d3.dispatch("tooltipShow","tooltipHide","brush"),N=250;t.clipEdge(!0),n.interactive(!1),r.orient("bottom").tickPadding(5),i.orient("left"),s.orient("bottom").tickPadding(5),o.orient("left");var C=function(n,s){var o=n.pos[0]+(s.offsetLeft||0),u=n.pos[1]+(s.offsetTop||0),a=r.tickFormat()(t.x()(n.point,n.pointIndex)),f=i.tickFormat()(t.y()(n.point,n.pointIndex)),l=S(n.series.key,a,f,n,k);e.tooltip.show([o,u],l,null,null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+f.left,e.pos[1]+f.top],T.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),T.on("tooltipHide",function(){E&&e.tooltip.cleanup()}),k.dispatch=T,k.legend=u,k.lines=t,k.lines2=n,k.xAxis=r,k.yAxis=i,k.x2Axis=s,k.y2Axis=o,d3.rebind(k,t,"defined","isArea","size","xDomain","yDomain","xRange","yRange","forceX","forceY","interactive","clipEdge","clipVoronoi","id"),k.options=e.utils.optionsFunc.bind(k),k.x=function(e){return arguments.length?(t.x(e),n.x(e),k):t.x},k.y=function(e){return arguments.length?(t.y(e),n.y(e),k):t.y},k.margin=function(e){return arguments.length?(f.top=typeof e.top!="undefined"?e.top:f.top,f.right=typeof e.right!="undefined"?e.right:f.right,f.bottom=typeof e.bottom!="undefined"?e.bottom:f.bottom,f.left=typeof e.left!="undefined"?e.left:f.left,k):f},k.margin2=function(e){return arguments.length?(l=e,k):l},k.width=function(e){return arguments.length?(h=e,k):h},k.height=function(e){return arguments.length?(p=e,k):p},k.height2=function(e){return arguments.length?(d=e,k):d},k.color=function(t){return arguments.length?(c=e.utils.getColor(t),u.color(c),k):c},k.showLegend=function(e){return arguments.length?(b=e,k):b},k.tooltips=function(e){return arguments.length?(E=e,k):E},k.tooltipContent=function(e){return arguments.length?(S=e,k):S},k.interpolate=function(e){return arguments.length?(t.interpolate(e),n.interpolate(e),k):t.interpolate()},k.noData=function(e){return arguments.length?(x=e,k):x},k.xTickFormat=function(e){return arguments.length?(r.tickFormat(e),s.tickFormat(e),k):r.tickFormat()},k.yTickFormat=function(e){return arguments.length?(i.tickFormat(e),o.tickFormat(e),k):i.tickFormat()},k.brushExtent=function(e){return arguments.length?(w=e,k):w},k.transitionDuration=function(e){return arguments.length?(N=e,k):N},k},e.models.linePlusBarWithFocusChart=function(){"use strict";function B(e){return e.each(function(e){function nt(e){var t=+(e=="e"),n=t?1:-1,r=q/3;return"M"+.5*n+","+r+"A6,6 0 0 "+t+" "+6.5*n+","+(r+6)+"V"+(2*r-6)+"A6,6 0 0 "+t+" "+.5*n+","+2*r+"Z"+"M"+2.5*n+","+(r+8)+"V"+(2*r-8)+"M"+4.5*n+","+(r+8)+"V"+(2*r-8)}function rt(){h.empty()||h.extent(x),Z.data([h.empty()?k.domain():x]).each(function(e,t){var n=k(e[0])-k.range()[0],r=k.range()[1]-k(e[1]);d3.select(this).select(".left").attr("width",n<0?0:n),d3.select(this).select(".right").attr("x",k(e[1])).attr("width",r<0?0:r)})}function it(){x=h.empty()?null:h.extent(),S=h.empty()?k.domain():h.extent(),D.brush({extent:S,brush:h}),rt(),r.width(F).height(I).color(e.map(function(e,t){return e.color||w(e,t)}).filter(function(t,n){return!e[n].disabled&&e[n].bar})),t.width(F).height(I).color(e.map(function(e,t){return e.color||w(e,t)}).filter(function(t,n){return!e[n].disabled&&!e[n].bar}));var n=J.select(".nv-focus .nv-barsWrap").datum(U.length?U.map(function(e,t){return{key:e.key,values:e.values.filter(function(e,t){return r.x()(e,t)>=S[0]&&r.x()(e,t)<=S[1]})}}):[{values:[]}]),i=J.select(".nv-focus .nv-linesWrap").datum(z[0].disabled?[{values:[]}]:z.map(function(e,n){return{key:e.key,values:e.values.filter(function(e,n){return t.x()(e,n)>=S[0]&&t.x()(e,n)<=S[1]})}}));U.length?C=r.xScale():C=t.xScale(),s.scale(C).ticks(F/100).tickSize(-I,0),s.domain([Math.ceil(S[0]),Math.floor(S[1])]),J.select(".nv-x.nv-axis").transition().duration(P).call(s),n.transition().duration(P).call(r),i.transition().duration(P).call(t),J.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L.range()[0]+")"),u.scale(L).ticks(I/36).tickSize(-F,0),J.select(".nv-focus .nv-y1.nv-axis").style("opacity",U.length?1:0),a.scale(A).ticks(I/36).tickSize(U.length?0:-F,0),J.select(".nv-focus .nv-y2.nv-axis").style("opacity",z.length?1:0).attr("transform","translate("+C.range()[1]+",0)"),J.select(".nv-focus .nv-y1.nv-axis").transition().duration(P).call(u),J.select(".nv-focus .nv-y2.nv-axis").transition().duration(P).call(a)}var N=d3.select(this),j=this,F=(v||parseInt(N.style("width"))||960)-p.left-p.right,I=(m||parseInt(N.style("height"))||400)-p.top-p.bottom-g,q=g-d.top-d.bottom;B.update=function(){N.transition().duration(P).call(B)},B.container=this;if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var R=N.selectAll(".nv-noData").data([_]);return R.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),R.attr("x",p.left+F/2).attr("y",p.top+I/2).text(function(e){return e}),B}N.selectAll(".nv-noData").remove();var U=e.filter(function(e){return!e.disabled&&e.bar}),z=e.filter(function(e){return!e.bar});C=r.xScale(),k=o.scale(),L=r.yScale(),A=t.yScale(),O=i.yScale(),M=n.yScale();var W=e.filter(function(e){return!e.disabled&&e.bar}).map(function(e){return e.values.map(function(e,t){return{x:y(e,t),y:b(e,t)}})}),X=e.filter(function(e){return!e.disabled&&!e.bar}).map(function(e){return e.values.map(function(e,t){return{x:y(e,t),y:b(e,t)}})});C.range([0,F]),k.domain(d3.extent(d3.merge(W.concat(X)),function(e){return e.x})).range([0,F]);var V=N.selectAll("g.nv-wrap.nv-linePlusBar").data([e]),$=V.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),J=V.select("g");$.append("g").attr("class","nv-legendWrap");var K=$.append("g").attr("class","nv-focus");K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y1 nv-axis"),K.append("g").attr("class","nv-y2 nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-linesWrap");var Q=$.append("g").attr("class","nv-context");Q.append("g").attr("class","nv-x nv-axis"),Q.append("g").attr("class","nv-y1 nv-axis"),Q.append("g").attr("class","nv-y2 nv-axis"),Q.append("g").attr("class","nv-barsWrap"),Q.append("g").attr("class","nv-linesWrap"),Q.append("g").attr("class","nv-brushBackground"),Q.append("g").attr("class","nv-x nv-brush"),E&&(c.width(F/2),J.select(".nv-legendWrap").datum(e.map(function(e){return e.originalKey=e.originalKey===undefined?e.key:e.originalKey,e.key=e.originalKey+(e.bar?" (left axis)":" (right axis)"),e})).call(c),p.top!=c.height()&&(p.top=c.height(),I=(m||parseInt(N.style("height"))||400)-p.top-p.bottom-g),J.select(".nv-legendWrap").attr("transform","translate("+F/2+","+ -p.top+")")),V.attr("transform","translate("+p.left+","+p.top+")"),i.width(F).height(q).color(e.map(function(e,t){return e.color||w(e,t)}).filter(function(t,n){return!e[n].disabled&&e[n].bar})),n.width(F).height(q).color(e.map(function(e,t){return e.color||w(e,t)}).filter(function(t,n){return!e[n].disabled&&!e[n].bar}));var G=J.select(".nv-context .nv-barsWrap").datum(U.length?U:[{values:[]}]),Y=J.select(".nv-context .nv-linesWrap").datum(z[0].disabled?[{values:[]}]:z);J.select(".nv-context").attr("transform","translate(0,"+(I+p.bottom+d.top)+")"),G.transition().call(i),Y.transition().call(n),h.x(k).on("brush",it),x&&h.extent(x);var Z=J.select(".nv-brushBackground").selectAll("g").data([x||h.extent()]),et=Z.enter().append("g");et.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",q),et.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",q);var tt=J.select(".nv-x.nv-brush").call(h);tt.selectAll("rect").attr("height",q),tt.selectAll(".resize").append("path").attr("d",nt),o.ticks(F/100).tickSize(-q,0),J.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+O.range()[0]+")"),J.select(".nv-context .nv-x.nv-axis").transition().call(o),f.scale(O).ticks(q/36).tickSize(-F,0),J.select(".nv-context .nv-y1.nv-axis").style("opacity",U.length?1:0).attr("transform","translate(0,"+k.range()[0]+")"),J.select(".nv-context .nv-y1.nv-axis").transition().call(f),l.scale(M).ticks(q/36).tickSize(U.length?0:-F,0),J.select(".nv-context .nv-y2.nv-axis").style("opacity",z.length?1:0).attr("transform","translate("+k.range()[1]+",0)"),J.select(".nv-context .nv-y2.nv-axis").transition().call(l),c.dispatch.on("stateChange",function(e){B.update()}),D.on("tooltipShow",function(e){T&&H(e,j.parentNode)}),it()}),B}var t=e.models.line(),n=e.models.line(),r=e.models.historicalBar(),i=e.models.historicalBar(),s=e.models.axis(),o=e.models.axis(),u=e.models.axis(),a=e.models.axis(),f=e.models.axis(),l=e.models.axis(),c=e.models.legend(),h=d3.svg.brush(),p={top:30,right:30,bottom:30,left:60},d={top:0,right:30,bottom:20,left:60},v=null,m=null,g=100,y=function(e){return e.x},b=function(e){return e.y},w=e.utils.defaultColor(),E=!0,S,x=null,T=!0,N=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},C,k,L,A,O,M,_="No Data Available.",D=d3.dispatch("tooltipShow","tooltipHide","brush"),P=0;t.clipEdge(!0),n.interactive(!1),s.orient("bottom").tickPadding(5),u.orient("left"),a.orient("right"),o.orient("bottom").tickPadding(5),f.orient("left"),l.orient("right");var H=function(n,r){S&&(n.pointIndex+=Math.ceil(S[0]));var i=n.pos[0]+(r.offsetLeft||0),o=n.pos[1]+(r.offsetTop||0),f=s.tickFormat()(t.x()(n.point,n.pointIndex)),l=(n.series.bar?u:a).tickFormat()(t.y()(n.point,n.pointIndex)),c=N(n.series.key,f,l,n,B);e.tooltip.show([i,o],c,n.value<0?"n":"s",null,r)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+p.left,e.pos[1]+p.top],D.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){D.tooltipHide(e)}),r.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+p.left,e.pos[1]+p.top],D.tooltipShow(e)}),r.dispatch.on("elementMouseout.tooltip",function(e){D.tooltipHide(e)}),D.on("tooltipHide",function(){T&&e.tooltip.cleanup()}),B.dispatch=D,B.legend=c,B.lines=t,B.lines2=n,B.bars=r,B.bars2=i,B.xAxis=s,B.x2Axis=o,B.y1Axis=u,B.y2Axis=a,B.y3Axis=f,B.y4Axis=l,d3.rebind(B,t,"defined","size","clipVoronoi","interpolate"),B.options=e.utils.optionsFunc.bind(B),B.x=function(e){return arguments.length?(y=e,t.x(e),r.x(e),B):y},B.y=function(e){return arguments.length?(b=e,t.y(e),r.y(e),B):b},B.margin=function(e){return arguments.length?(p.top=typeof e.top!="undefined"?e.top:p.top,p.right=typeof e.right!="undefined"?e.right:p.right,p.bottom=typeof e.bottom!="undefined"?e.bottom:p.bottom,p.left=typeof e.left!="undefined"?e.left:p.left,B):p},B.width=function(e){return arguments.length?(v=e,B):v},B.height=function(e){return arguments.length?(m=e,B):m},B.color=function(t){return arguments.length?(w=e.utils.getColor(t),c.color(w),B):w},B.showLegend=function(e){return arguments.length?(E=e,B):E},B.tooltips=function(e){return arguments.length?(T=e,B):T},B.tooltipContent=function(e){return arguments.length?(N=e,B):N},B.noData=function(e){return arguments.length?(_=e,B):_},B.brushExtent=function(e){return arguments.length?(x=e,B):x},B},e.models.multiBar=function(){"use strict";function C(e){return e.each(function(e){var C=n-t.left-t.right,k=r-t.top-t.bottom,L=d3.select(this);d&&e.length&&(d=[{values:e[0].values.map(function(e){return{x:e.x,y:0,series:e.series,size:.01}})}]),c&&(e=d3.layout.stack().offset(h).values(function(e){return e.values}).y(a)(!e.length&&d?d:e)),e.forEach(function(e,t){e.values.forEach(function(e){e.series=t})}),c&&e[0].values.map(function(t,n){var r=0,i=0;e.map(function(e){var t=e.values[n];t.size=Math.abs(t.y),t.y<0?(t.y1=i,i-=t.size):(t.y1=t.size+r,r+=t.size)})});var A=y&&b?[]:e.map(function(e){return e.values.map(function(e,t){return{x:u(e,t),y:a(e,t),y0:e.y0,y1:e.y1}})});i.domain(y||d3.merge(A).map(function(e){return e.x})).rangeBands(w||[0,C],S),s.domain(b||d3.extent(d3.merge(A).map(function(e){return c?e.y>0?e.y1:e.y1+e.y:e.y}).concat(f))).range(E||[k,0]),i.domain()[0]===i.domain()[1]&&(i.domain()[0]?i.domain([i.domain()[0]-i.domain()[0]*.01,i.domain()[1]+i.domain()[1]*.01]):i.domain([-1,1])),s.domain()[0]===s.domain()[1]&&(s.domain()[0]?s.domain([s.domain()[0]+s.domain()[0]*.01,s.domain()[1]-s.domain()[1]*.01]):s.domain([-1,1])),T=T||i,N=N||s;var O=L.selectAll("g.nv-wrap.nv-multibar").data([e]),M=O.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),_=M.append("defs"),D=M.append("g"),P=O.select("g");D.append("g").attr("class","nv-groups"),O.attr("transform","translate("+t.left+","+t.top+")"),_.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),O.select("#nv-edge-clip-"+o+" rect").attr("width",C).attr("height",k),P.attr("clip-path",l?"url(#nv-edge-clip-"+o+")":"");var H=O.select(".nv-groups").selectAll(".nv-group").data(function(e){return e},function(e,t){return t});H.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),H.exit().transition().selectAll("rect.nv-bar").delay(function(t,n){return n*g/e[0].values.length}).attr("y",function(e){return c?N(e.y0):N(0)}).attr("height",0).remove(),H.attr("class",function(e,t){return"nv-group nv-series-"+t}).classed("hover",function(e){return e.hover}).style("fill",function(e,t){return p(e,t)}).style("stroke",function(e,t){return p(e,t)}),H.transition().style("stroke-opacity",1).style("fill-opacity",.75);var B=H.selectAll("rect.nv-bar").data(function(t){return d&&!e.length?d.values:t.values});B.exit().remove();var j=B.enter().append("rect").attr("class",function(e,t){return a(e,t)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(t,n,r){return c?0:r*i.rangeBand()/e.length}).attr("y",function(e){return N(c?e.y0:0)}).attr("height",0).attr("width",i.rangeBand()/(c?1:e.length)).attr("transform",function(e,t){return"translate("+i(u(e,t))+",0)"});B.style("fill",function(e,t,n){return p(e,n,t)}).style("stroke",function(e,t,n){return p(e,n,t)}).on("mouseover",function(t,n){d3.select(this).classed("hover",!0),x.elementMouseover({value:a(t,n),point:t,series:e[t.series],pos:[i(u(t,n))+i.rangeBand()*(c?e.length/2:t.series+.5)/e.length,s(a(t,n)+(c?t.y0:0))],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("mouseout",function(t,n){d3.select(this).classed("hover",!1),x.elementMouseout({value:a(t,n),point:t,series:e[t.series],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("click",function(t,n){x.elementClick({value:a(t,n),point:t,series:e[t.series],pos:[i(u(t,n))+i.rangeBand()*(c?e.length/2:t.series+.5)/e.length -,s(a(t,n)+(c?t.y0:0))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(t,n){x.elementDblClick({value:a(t,n),point:t,series:e[t.series],pos:[i(u(t,n))+i.rangeBand()*(c?e.length/2:t.series+.5)/e.length,s(a(t,n)+(c?t.y0:0))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()}),B.attr("class",function(e,t){return a(e,t)<0?"nv-bar negative":"nv-bar positive"}).transition().attr("transform",function(e,t){return"translate("+i(u(e,t))+",0)"}),v&&(m||(m=e.map(function(){return!0})),B.style("fill",function(e,t,n){return d3.rgb(v(e,t)).darker(m.map(function(e,t){return t}).filter(function(e,t){return!m[t]})[n]).toString()}).style("stroke",function(e,t,n){return d3.rgb(v(e,t)).darker(m.map(function(e,t){return t}).filter(function(e,t){return!m[t]})[n]).toString()})),c?B.transition().delay(function(t,n){return n*g/e[0].values.length}).attr("y",function(e,t){return s(c?e.y1:0)}).attr("height",function(e,t){return Math.max(Math.abs(s(e.y+(c?e.y0:0))-s(c?e.y0:0)),1)}).attr("x",function(t,n){return c?0:t.series*i.rangeBand()/e.length}).attr("width",i.rangeBand()/(c?1:e.length)):B.transition().delay(function(t,n){return n*g/e[0].values.length}).attr("x",function(t,n){return t.series*i.rangeBand()/e.length}).attr("width",i.rangeBand()/e.length).attr("y",function(e,t){return a(e,t)<0?s(0):s(0)-s(a(e,t))<1?s(0)-1:s(a(e,t))||0}).attr("height",function(e,t){return Math.max(Math.abs(s(a(e,t))-s(0)),1)||0}),T=i.copy(),N=s.copy()}),C}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=d3.scale.ordinal(),s=d3.scale.linear(),o=Math.floor(Math.random()*1e4),u=function(e){return e.x},a=function(e){return e.y},f=[0],l=!0,c=!1,h="zero",p=e.utils.defaultColor(),d=!1,v=null,m,g=1200,y,b,w,E,S=.1,x=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout"),T,N;return C.dispatch=x,C.options=e.utils.optionsFunc.bind(C),C.x=function(e){return arguments.length?(u=e,C):u},C.y=function(e){return arguments.length?(a=e,C):a},C.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,C):t},C.width=function(e){return arguments.length?(n=e,C):n},C.height=function(e){return arguments.length?(r=e,C):r},C.xScale=function(e){return arguments.length?(i=e,C):i},C.yScale=function(e){return arguments.length?(s=e,C):s},C.xDomain=function(e){return arguments.length?(y=e,C):y},C.yDomain=function(e){return arguments.length?(b=e,C):b},C.xRange=function(e){return arguments.length?(w=e,C):w},C.yRange=function(e){return arguments.length?(E=e,C):E},C.forceY=function(e){return arguments.length?(f=e,C):f},C.stacked=function(e){return arguments.length?(c=e,C):c},C.stackOffset=function(e){return arguments.length?(h=e,C):h},C.clipEdge=function(e){return arguments.length?(l=e,C):l},C.color=function(t){return arguments.length?(p=e.utils.getColor(t),C):p},C.barColor=function(t){return arguments.length?(v=e.utils.getColor(t),C):v},C.disabled=function(e){return arguments.length?(m=e,C):m},C.id=function(e){return arguments.length?(o=e,C):o},C.hideable=function(e){return arguments.length?(d=e,C):d},C.delay=function(e){return arguments.length?(g=e,C):g},C.groupSpacing=function(e){return arguments.length?(S=e,C):S},C},e.models.multiBarChart=function(){"use strict";function A(e){return e.each(function(e){var b=d3.select(this),O=this,M=(u||parseInt(b.style("width"))||960)-o.left-o.right,_=(a||parseInt(b.style("height"))||400)-o.top-o.bottom;A.update=function(){b.transition().duration(k).call(A)},A.container=this,S.disabled=e.map(function(e){return!!e.disabled});if(!x){var D;x={};for(D in S)S[D]instanceof Array?x[D]=S[D].slice(0):x[D]=S[D]}if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var P=b.selectAll(".nv-noData").data([T]);return P.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),P.attr("x",o.left+M/2).attr("y",o.top+_/2).text(function(e){return e}),A}b.selectAll(".nv-noData").remove(),w=t.xScale(),E=t.yScale();var H=b.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([e]),B=H.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),j=H.select("g");B.append("g").attr("class","nv-x nv-axis"),B.append("g").attr("class","nv-y nv-axis"),B.append("g").attr("class","nv-barsWrap"),B.append("g").attr("class","nv-legendWrap"),B.append("g").attr("class","nv-controlsWrap"),c&&(i.width(M-C()),t.barColor()&&e.forEach(function(e,t){e.color=d3.rgb("#ccc").darker(t*1.5).toString()}),j.select(".nv-legendWrap").datum(e).call(i),o.top!=i.height()&&(o.top=i.height(),_=(a||parseInt(b.style("height"))||400)-o.top-o.bottom),j.select(".nv-legendWrap").attr("transform","translate("+C()+","+ -o.top+")"));if(l){var F=[{key:"Grouped",disabled:t.stacked()},{key:"Stacked",disabled:!t.stacked()}];s.width(C()).color(["#444","#444","#444"]),j.select(".nv-controlsWrap").datum(F).attr("transform","translate(0,"+ -o.top+")").call(s)}H.attr("transform","translate("+o.left+","+o.top+")"),d&&j.select(".nv-y.nv-axis").attr("transform","translate("+M+",0)"),t.disabled(e.map(function(e){return e.disabled})).width(M).height(_).color(e.map(function(e,t){return e.color||f(e,t)}).filter(function(t,n){return!e[n].disabled}));var I=j.select(".nv-barsWrap").datum(e.filter(function(e){return!e.disabled}));I.transition().call(t);if(h){n.scale(w).ticks(M/100).tickSize(-_,0),j.select(".nv-x.nv-axis").attr("transform","translate(0,"+E.range()[0]+")"),j.select(".nv-x.nv-axis").transition().call(n);var q=j.select(".nv-x.nv-axis > g").selectAll("g");q.selectAll("line, text").style("opacity",1);if(m){var R=function(e,t){return"translate("+e+","+t+")"},U=5,z=17;q.selectAll("text").attr("transform",function(e,t,n){return R(0,n%2==0?U:z)});var W=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;j.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(e,t){return R(0,t===0||W%2!==0?z:U)})}v&&q.filter(function(t,n){return n%Math.ceil(e[0].values.length/(M/100))!==0}).selectAll("text, line").style("opacity",0),g&&q.selectAll(".tick text").attr("transform","rotate("+g+" 0,0)").style("text-anchor",g>0?"start":"end"),j.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}p&&(r.scale(E).ticks(_/36).tickSize(-M,0),j.select(".nv-y.nv-axis").transition().call(r)),i.dispatch.on("stateChange",function(e){S=e,N.stateChange(S),A.update()}),s.dispatch.on("legendClick",function(e,n){if(!e.disabled)return;F=F.map(function(e){return e.disabled=!0,e}),e.disabled=!1;switch(e.key){case"Grouped":t.stacked(!1);break;case"Stacked":t.stacked(!0)}S.stacked=t.stacked(),N.stateChange(S),A.update()}),N.on("tooltipShow",function(e){y&&L(e,O.parentNode)}),N.on("changeState",function(n){typeof n.disabled!="undefined"&&(e.forEach(function(e,t){e.disabled=n.disabled[t]}),S.disabled=n.disabled),typeof n.stacked!="undefined"&&(t.stacked(n.stacked),S.stacked=n.stacked),A.update()})}),A}var t=e.models.multiBar(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.models.legend(),o={top:30,right:20,bottom:50,left:60},u=null,a=null,f=e.utils.defaultColor(),l=!0,c=!0,h=!0,p=!0,d=!1,v=!0,m=!1,g=0,y=!0,b=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" on "+t+"

    "},w,E,S={stacked:!1},x=null,T="No Data Available.",N=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),C=function(){return l?180:0},k=250;t.stacked(!1),n.orient("bottom").tickPadding(7).highlightZero(!0).showMaxMin(!1).tickFormat(function(e){return e}),r.orient(d?"right":"left").tickFormat(d3.format(",.1f")),s.updateState(!1);var L=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=b(i.series.key,a,f,i,A);e.tooltip.show([o,u],l,i.value<0?"n":"s",null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+o.left,e.pos[1]+o.top],N.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){N.tooltipHide(e)}),N.on("tooltipHide",function(){y&&e.tooltip.cleanup()}),A.dispatch=N,A.multibar=t,A.legend=i,A.xAxis=n,A.yAxis=r,d3.rebind(A,t,"x","y","xDomain","yDomain","xRange","yRange","forceX","forceY","clipEdge","id","stacked","stackOffset","delay","barColor","groupSpacing"),A.options=e.utils.optionsFunc.bind(A),A.margin=function(e){return arguments.length?(o.top=typeof e.top!="undefined"?e.top:o.top,o.right=typeof e.right!="undefined"?e.right:o.right,o.bottom=typeof e.bottom!="undefined"?e.bottom:o.bottom,o.left=typeof e.left!="undefined"?e.left:o.left,A):o},A.width=function(e){return arguments.length?(u=e,A):u},A.height=function(e){return arguments.length?(a=e,A):a},A.color=function(t){return arguments.length?(f=e.utils.getColor(t),i.color(f),A):f},A.showControls=function(e){return arguments.length?(l=e,A):l},A.showLegend=function(e){return arguments.length?(c=e,A):c},A.showXAxis=function(e){return arguments.length?(h=e,A):h},A.showYAxis=function(e){return arguments.length?(p=e,A):p},A.rightAlignYAxis=function(e){return arguments.length?(d=e,r.orient(e?"right":"left"),A):d},A.reduceXTicks=function(e){return arguments.length?(v=e,A):v},A.rotateLabels=function(e){return arguments.length?(g=e,A):g},A.staggerLabels=function(e){return arguments.length?(m=e,A):m},A.tooltip=function(e){return arguments.length?(b=e,A):b},A.tooltips=function(e){return arguments.length?(y=e,A):y},A.tooltipContent=function(e){return arguments.length?(b=e,A):b},A.state=function(e){return arguments.length?(S=e,A):S},A.defaultState=function(e){return arguments.length?(x=e,A):x},A.noData=function(e){return arguments.length?(T=e,A):T},A.transitionDuration=function(e){return arguments.length?(k=e,A):k},A},e.models.multiBarHorizontal=function(){"use strict";function C(e){return e.each(function(e){var i=n-t.left-t.right,y=r-t.top-t.bottom,C=d3.select(this);p&&(e=d3.layout.stack().offset("zero").values(function(e){return e.values}).y(a)(e)),e.forEach(function(e,t){e.values.forEach(function(e){e.series=t})}),p&&e[0].values.map(function(t,n){var r=0,i=0;e.map(function(e){var t=e.values[n];t.size=Math.abs(t.y),t.y<0?(t.y1=i-t.size,i-=t.size):(t.y1=r,r+=t.size)})});var k=b&&w?[]:e.map(function(e){return e.values.map(function(e,t){return{x:u(e,t),y:a(e,t),y0:e.y0,y1:e.y1}})});s.domain(b||d3.merge(k).map(function(e){return e.x})).rangeBands(E||[0,y],.1),o.domain(w||d3.extent(d3.merge(k).map(function(e){return p?e.y>0?e.y1+e.y:e.y1:e.y}).concat(f))),d&&!p?o.range(S||[o.domain()[0]<0?m:0,i-(o.domain()[1]>0?m:0)]):o.range(S||[0,i]),T=T||s,N=N||d3.scale.linear().domain(o.domain()).range([o(0),o(0)]);var L=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([e]),A=L.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),O=A.append("defs"),M=A.append("g"),_=L.select("g");M.append("g").attr("class","nv-groups"),L.attr("transform","translate("+t.left+","+t.top+")");var D=L.select(".nv-groups").selectAll(".nv-group").data(function(e){return e},function(e,t){return t});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().transition().style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(e,t){return"nv-group nv-series-"+t}).classed("hover",function(e){return e.hover}).style("fill",function(e,t){return l(e,t)}).style("stroke",function(e,t){return l(e,t)}),D.transition().style("stroke-opacity",1).style("fill-opacity",.75);var P=D.selectAll("g.nv-bar").data(function(e){return e.values});P.exit().remove();var H=P.enter().append("g").attr("transform",function(t,n,r){return"translate("+N(p?t.y0:0)+","+(p?0:r*s.rangeBand()/e.length+s(u(t,n)))+")"});H.append("rect").attr("width",0).attr("height",s.rangeBand()/(p?1:e.length)),P.on("mouseover",function(t,n){d3.select(this).classed("hover",!0),x.elementMouseover({value:a(t,n),point:t,series:e[t.series],pos:[o(a(t,n)+(p?t.y0:0)),s(u(t,n))+s.rangeBand()*(p?e.length/2:t.series+.5)/e.length],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("mouseout",function(t,n){d3.select(this).classed("hover",!1),x.elementMouseout({value:a(t,n),point:t,series:e[t.series],pointIndex:n,seriesIndex:t.series,e:d3.event})}).on("click",function(t,n){x.elementClick({value:a(t,n),point:t,series:e[t.series],pos:[s(u(t,n))+s.rangeBand()*(p?e.length/2:t.series+.5)/e.length,o(a(t,n)+(p?t.y0:0))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(t,n){x.elementDblClick({value:a(t,n),point:t,series:e[t.series],pos:[s(u(t,n))+s.rangeBand()*(p?e.length/2:t.series+.5)/e.length,o(a(t,n)+(p?t.y0:0))],pointIndex:n,seriesIndex:t.series,e:d3.event}),d3.event.stopPropagation()}),H.append("text"),d&&!p?(P.select("text").attr("text-anchor",function(e,t){return a(e,t)<0?"end":"start"}).attr("y",s.rangeBand()/(e.length*2)).attr("dy",".32em").text(function(e,t){return g(a(e,t))}),P.transition().select("text").attr("x",function(e,t){return a(e,t)<0?-4:o(a(e,t))-o(0)+4})):P.selectAll("text").text(""),v&&!p?(H.append("text").classed("nv-bar-label",!0),P.select("text.nv-bar-label").attr("text-anchor",function(e,t){return a(e,t)<0?"start":"end"}).attr("y",s.rangeBand()/(e.length*2)).attr("dy",".32em").text(function(e,t){return u(e,t)}),P.transition().select("text.nv-bar-label").attr("x",function(e,t){return a(e,t)<0?o(0)-o(a(e,t))+4:-4})):P.selectAll("text.nv-bar-label").text(""),P.attr("class",function(e,t){return a(e,t)<0?"nv-bar negative":"nv-bar positive"}),c&&(h||(h=e.map(function(){return!0})),P.style("fill",function(e,t,n){return d3.rgb(c(e,t)).darker(h.map(function(e,t){return t}).filter(function(e,t){return!h[t]})[n]).toString()}).style("stroke",function(e,t,n){return d3.rgb(c(e,t)).darker(h.map(function(e,t){return t}).filter(function(e,t){return!h[t]})[n]).toString()})),p?P.transition().attr("transform",function(e,t){return"translate("+o(e.y1)+","+s(u(e,t))+")"}).select("rect").attr("width",function(e,t){return Math.abs(o(a(e,t)+e.y0)-o(e.y0))}).attr("height",s.rangeBand()):P.transition().attr("transform",function(t,n){return"translate("+(a(t,n)<0?o(a(t,n)):o(0))+","+(t.series*s.rangeBand()/e.length+s(u(t,n)))+")"}).select("rect").attr("height",s.rangeBand()/e.length).attr("width",function(e,t){return Math.max(Math.abs(o(a(e,t))-o(0)),1)}),T=s.copy(),N=o.copy()}),C}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=Math.floor(Math.random()*1e4),s=d3.scale.ordinal(),o=d3.scale.linear(),u=function(e){return e.x},a=function(e){return e.y},f=[0],l=e.utils.defaultColor(),c=null,h,p=!1,d=!1,v=!1,m=60,g=d3.format(",.2f"),y=1200,b,w,E,S,x=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout"),T,N;return C.dispatch=x,C.options=e.utils.optionsFunc.bind(C),C.x=function(e){return arguments.length?(u=e,C):u},C.y=function(e){return arguments.length?(a=e,C):a},C.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,C):t},C.width=function(e){return arguments.length?(n=e,C):n},C.height=function(e){return arguments.length?(r=e,C):r},C.xScale=function(e){return arguments.length?(s=e,C):s},C.yScale=function(e){return arguments.length?(o=e,C):o},C.xDomain=function(e){return arguments.length?(b=e,C):b},C.yDomain=function(e){return arguments.length?(w=e,C):w},C.xRange=function(e){return arguments.length?(E=e,C):E},C.yRange=function(e){return arguments.length?(S=e,C):S},C.forceY=function(e){return arguments.length?(f=e,C):f},C.stacked=function(e){return arguments.length?(p=e,C):p},C.color=function(t){return arguments.length?(l=e.utils.getColor(t),C):l},C.barColor=function(t){return arguments.length?(c=e.utils.getColor(t),C):c},C.disabled=function(e){return arguments.length?(h=e,C):h},C.id=function(e){return arguments.length?(i=e,C):i},C.delay=function(e){return arguments.length?(y=e,C):y},C.showValues=function(e){return arguments.length?(d=e,C):d},C.showBarLabels=function(e){return arguments.length?(v=e,C):v},C.valueFormat=function(e){return arguments.length?(g=e,C):g},C.valuePadding=function(e){return arguments.length?(m=e,C):m},C},e.models.multiBarHorizontalChart=function(){"use strict";function C(e){return e.each(function(e){var d=d3.select(this),m=this,k=(u||parseInt(d.style("width"))||960)-o.left-o.right,L=(a||parseInt(d.style("height"))||400)-o.top-o.bottom;C.update=function(){d.transition().duration(T).call(C)},C.container=this,b.disabled=e.map(function(e){return!!e.disabled});if(!w){var A;w={};for(A in b)b[A]instanceof Array?w[A]=b[A].slice(0):w[A]=b[A]}if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var O=d.selectAll(".nv-noData").data([E]);return O.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),O.attr("x",o.left+k/2).attr("y",o.top+L/2).text(function(e){return e}),C}d.selectAll(".nv-noData").remove(),g=t.xScale(),y=t.yScale();var M=d.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([e]),_=M.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),D=M.select("g");_.append("g").attr("class","nv-x nv-axis"),_.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),_.append("g").attr("class","nv-barsWrap"),_.append("g").attr("class","nv-legendWrap"),_.append("g").attr("class","nv-controlsWrap"),c&&(i.width(k-x()),t.barColor()&&e.forEach(function(e,t){e.color=d3.rgb("#ccc").darker(t*1.5).toString()}),D.select(".nv-legendWrap").datum(e).call(i),o.top!=i.height()&&(o.top=i.height(),L=(a||parseInt(d.style("height"))||400)-o.top-o.bottom),D.select(".nv-legendWrap").attr("transform","translate("+x()+","+ -o.top+")"));if(l){var P=[{key:"Grouped",disabled:t.stacked()},{key:"Stacked",disabled:!t.stacked()}];s.width(x()).color(["#444","#444","#444"]),D.select(".nv-controlsWrap").datum(P).attr("transform","translate(0,"+ -o.top+")").call(s)}M.attr("transform","translate("+o.left+","+o.top+")"),t.disabled(e.map(function(e){return e.disabled})).width(k).height(L).color(e.map(function(e,t){return e.color||f(e,t)}).filter(function(t,n){return!e[n].disabled}));var H=D.select(".nv-barsWrap").datum(e.filter(function(e){return!e.disabled}));H.transition().call(t);if(h){n.scale(g).ticks(L/24).tickSize(-k,0),D.select(".nv-x.nv-axis").transition().call(n);var B=D.select(".nv-x.nv-axis").selectAll("g");B.selectAll("line, text")}p&&(r.scale(y).ticks(k/100).tickSize(-L,0),D.select(".nv-y.nv-axis").attr("transform","translate(0,"+L+")"),D.select(".nv-y.nv-axis").transition().call(r)),D.select(".nv-zeroLine line").attr("x1",y(0)).attr("x2",y(0)).attr("y1",0).attr("y2",-L),i.dispatch.on("stateChange",function(e){b=e,S.stateChange(b),C.update()}),s.dispatch.on("legendClick",function(e,n){if(!e.disabled)return;P=P.map(function(e){return e.disabled=!0,e}),e.disabled=!1;switch(e.key){case"Grouped":t.stacked(!1);break;case"Stacked":t.stacked(!0)}b.stacked=t.stacked(),S.stateChange(b),C.update()}),S.on("tooltipShow",function(e){v&&N(e,m.parentNode)}),S.on("changeState",function(n){typeof n.disabled!="undefined"&&(e.forEach(function(e,t){e.disabled=n.disabled[t]}),b.disabled=n.disabled),typeof n.stacked!="undefined"&&(t.stacked(n.stacked),b.stacked=n.stacked),C.update()})}),C}var t=e.models.multiBarHorizontal(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend().height(30),s=e.models.legend().height(30),o={top:30,right:20,bottom:50,left:60},u=null,a=null,f=e.utils.defaultColor(),l=!0,c=!0,h=!0,p=!0,d=!1,v=!0,m=function(e,t,n,r,i){return"

    "+e+" - "+t+"

    "+"

    "+n+"

    "},g,y,b={stacked:d},w=null,E="No Data Available.",S=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),x=function(){return l?180:0},T=250;t.stacked(d),n.orient("left").tickPadding(5).highlightZero(!1).showMaxMin(!1).tickFormat(function(e){return e}),r.orient("bottom").tickFormat(d3.format(",.1f")),s.updateState(!1);var N=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=m(i.series.key,a,f,i,C);e.tooltip.show([o,u],l,i.value<0?"e":"w",null,s)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+o.left,e.pos[1]+o.top],S.tooltipShow(e)}),t.dispatch.on("elementMouseout.tooltip",function(e){S.tooltipHide(e)}),S.on("tooltipHide",function(){v&&e.tooltip.cleanup()}),C.dispatch=S,C.multibar=t,C.legend=i,C.xAxis=n,C.yAxis=r,d3.rebind(C,t,"x","y","xDomain","yDomain","xRange","yRange","forceX","forceY","clipEdge","id","delay","showValues","showBarLabels","valueFormat","stacked","barColor"),C.options=e.utils.optionsFunc.bind(C),C.margin=function(e){return arguments.length?(o.top=typeof e.top!="undefined"?e.top:o.top,o.right=typeof e.right!="undefined"?e.right:o.right,o.bottom=typeof e.bottom!="undefined"?e.bottom:o.bottom,o.left=typeof e.left!="undefined"?e.left:o.left,C):o},C.width=function(e){return arguments.length?(u=e,C):u},C.height=function(e){return arguments.length?(a=e,C):a},C.color=function(t){return arguments.length?(f=e.utils.getColor(t),i.color(f),C):f},C.showControls=function(e){return arguments.length?(l=e,C):l},C.showLegend=function(e){return arguments.length?(c=e,C):c},C.showXAxis=function(e){return arguments.length?(h=e,C):h},C.showYAxis=function(e){return arguments.length?(p=e,C):p},C.tooltip=function(e){return arguments.length?(m=e,C):m},C.tooltips=function(e){return arguments.length?(v=e,C):v},C.tooltipContent=function(e){return arguments.length?(m=e,C):m},C.state=function(e){return arguments.length?(b=e,C):b},C.defaultState=function(e){return arguments.length?(w=e,C):w},C.noData=function(e){return arguments.length?(E=e,C):E},C.transitionDuration=function(e){return arguments.length?(T=e,C):T},C},e.models.multiChart=function(){"use strict";function C(e){return e.each(function(e){var u=d3.select(this),f=this;C.update=function(){u.transition().call(C)},C.container=this;var k=(r||parseInt(u.style("width"))||960)-t.left-t.right,L=(i||parseInt(u.style("height"))||400)-t.top-t.bottom,A=e.filter(function(e){return!e.disabled&&e.type=="line"&&e.yAxis==1}),O=e.filter(function(e){return!e.disabled&&e.type=="line"&&e.yAxis==2}),M=e.filter(function(e){return!e.disabled&&e.type=="bar"&&e.yAxis==1}),_=e.filter(function(e){return!e.disabled&&e.type=="bar"&&e.yAxis==2}),D=e.filter(function(e){return!e.disabled&&e.type=="area"&&e.yAxis==1}),P=e.filter(function(e){return!e.disabled&&e.type=="area"&&e.yAxis==2}),H=e.filter(function(e){return!e.disabled&&e.yAxis==1}).map(function(e){return e.values.map(function(e,t){return{x:e.x,y:e.y}})}),B=e.filter(function(e){return!e.disabled&&e.yAxis==2}).map(function(e){return e.values.map(function(e,t){return{x:e.x,y:e.y}})});a.domain(d3.extent(d3.merge(H.concat(B)),function(e){return e.x})).range([0,k]);var j=u.selectAll("g.wrap.multiChart").data([e]),F=j.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");F.append("g").attr("class","x axis"),F.append("g").attr("class","y1 axis"),F.append("g").attr("class","y2 axis"),F.append("g").attr("class","lines1Wrap"),F.append("g").attr("class","lines2Wrap"),F.append("g").attr("class","bars1Wrap"),F.append("g").attr("class","bars2Wrap"),F.append("g").attr("class","stack1Wrap"),F.append("g").attr("class","stack2Wrap"),F.append("g").attr("class","legendWrap");var I=j.select("g");s&&(x.width(k/2),I.select(".legendWrap").datum(e.map(function(e){return e.originalKey=e.originalKey===undefined?e.key:e.originalKey,e.key=e.originalKey+(e.yAxis==1?"":" (right axis)"),e})).call(x),t.top!=x.height()&&(t.top=x.height(),L=(i||parseInt(u.style("height"))||400)-t.top-t.bottom),I.select(".legendWrap").attr("transform","translate("+k/2+","+ -t.top+")")),d.width(k).height(L).interpolate("monotone").color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==1&&e[n].type=="line"})),v.width(k).height(L).interpolate("monotone").color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==2&&e[n].type=="line"})),m.width(k).height(L).color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==1&&e[n].type=="bar"})),g.width(k).height(L).color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==2&&e[n].type=="bar"})),y.width(k).height(L).color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==1&&e[n].type=="area"})),b.width(k).height(L).color(e.map(function(e,t){return e.color||n[t%n.length]}).filter(function(t,n){return!e[n].disabled&&e[n].yAxis==2&&e[n].type=="area"})),I.attr("transform","translate("+t.left+","+t.top+")");var q=I.select(".lines1Wrap").datum(A),R=I.select(".bars1Wrap").datum(M),U=I.select(".stack1Wrap").datum(D),z=I.select(".lines2Wrap").datum(O),W=I.select(".bars2Wrap").datum(_),X=I.select(".stack2Wrap").datum(P),V=D.length?D.map(function(e){return e.values}).reduce(function(e,t){return e.map(function(e,n){return{x:e.x,y:e.y+t[n].y}})}).concat([{x:0,y:0}]):[],$=P.length?P.map(function(e){return e.values}).reduce(function(e,t){return e.map(function(e,n){return{x:e.x,y:e.y+t[n].y}})}).concat([{x:0,y:0}]):[];h.domain(l||d3.extent(d3.merge(H).concat(V),function(e){return e.y})).range([0,L]),p.domain(c||d3.extent(d3.merge(B).concat($),function(e){return e.y})).range([0,L]),d.yDomain(h.domain()),m.yDomain(h.domain()),y.yDomain(h.domain()),v.yDomain(p.domain()),g.yDomain(p.domain()),b.yDomain(p.domain()),D.length&&d3.transition(U).call(y),P.length&&d3.transition(X).call(b),M.length&&d3.transition(R).call(m),_.length&&d3.transition(W).call(g),A.length&&d3.transition(q).call(d),O.length&&d3.transition(z).call(v),w.ticks(k/100).tickSize(-L,0),I.select(".x.axis").attr("transform","translate(0,"+L+")"),d3.transition(I.select(".x.axis")).call(w),E.ticks(L/36).tickSize(-k,0),d3.transition(I.select(".y1.axis")).call(E),S.ticks(L/36).tickSize(-k,0),d3.transition(I.select(".y2.axis")).call(S),I.select(".y2.axis").style("opacity",B.length?1:0).attr("transform","translate("+a.range()[1]+",0)"),x.dispatch.on("stateChange",function(e){C.update()}),T.on("tooltipShow",function(e){o&&N(e,f.parentNode)})}),C}var t={top:30,right:20,bottom:50,left:60},n=d3.scale.category20().range(),r=null,i=null,s=!0,o=!0,u=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" at "+t+"

    "},a,f,l,c,a=d3.scale.linear(),h=d3.scale.linear(),p=d3.scale.linear(),d=e.models.line().yScale(h),v=e.models.line().yScale(p),m=e.models.multiBar().stacked(!1).yScale(h),g=e.models.multiBar().stacked(!1).yScale(p),y=e.models.stackedArea().yScale(h),b=e.models.stackedArea().yScale(p),w=e.models.axis().scale(a).orient("bottom").tickPadding(5),E=e.models.axis().scale(h).orient("left"),S=e.models.axis().scale(p).orient("right"),x=e.models.legend().height(30),T=d3.dispatch("tooltipShow","tooltipHide"),N=function(t,n){var r=t.pos[0]+(n.offsetLeft||0),i=t.pos[1]+(n.offsetTop||0),s=w.tickFormat()(d.x()(t.point,t.pointIndex)),o=(t.series.yAxis==2?S:E).tickFormat()(d.y()(t.point,t.pointIndex)),a=u(t.series.key,s,o,t,C);e.tooltip.show([r,i],a,undefined,undefined,n.offsetParent)};return d.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),d.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),v.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),v.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),m.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),m.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),g.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),g.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),y.dispatch.on("tooltipShow",function(e){if(!Math.round(y.y()(e.point)*100))return setTimeout(function(){d3.selectAll(".point.hover").classed("hover",!1)},0),!1;e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),y.dispatch.on("tooltipHide",function(e){T.tooltipHide(e)}),b.dispatch.on("tooltipShow",function(e){if(!Math.round(b.y()(e.point)*100))return setTimeout(function(){d3.selectAll(".point.hover").classed("hover",!1)},0),!1;e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),b.dispatch.on("tooltipHide",function(e){T.tooltipHide(e)}),d.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),d.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),v.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+t.left,e.pos[1]+t.top],T.tooltipShow(e)}),v.dispatch.on("elementMouseout.tooltip",function(e){T.tooltipHide(e)}),T.on("tooltipHide",function(){o&&e.tooltip.cleanup()}),C.dispatch=T,C.lines1=d,C.lines2=v,C.bars1=m,C.bars2=g,C.stack1=y,C.stack2=b,C.xAxis=w,C.yAxis1=E,C.yAxis2=S,C.options=e.utils.optionsFunc.bind(C),C.x=function(e){return arguments.length?(getX=e,d.x(e),m.x(e),C):getX},C.y=function(e){return arguments.length?(getY=e,d.y(e),m.y(e),C):getY},C.yDomain1=function(e){return arguments.length?(l=e,C):l},C.yDomain2=function(e){return arguments.length?(c=e,C):c},C.margin=function(e){return arguments.length?(t=e,C):t},C.width=function(e){return arguments.length?(r=e,C):r},C.height=function(e){return arguments.length?(i=e,C):i},C.color=function(e){return arguments.length?(n=e,x.color(e),C):n},C.showLegend=function(e){return arguments.length?(s=e,C):s},C.tooltips=function(e){return arguments.length?(o=e,C):o},C.tooltipContent=function(e){return arguments.length?(u=e,C):u},C},e.models.ohlcBar=function(){"use strict";function x(e){return e.each(function(e){var g=n-t.left-t.right,x=r-t.top-t.bottom,T=d3.select(this);s.domain(y||d3.extent(e[0].values.map(u).concat(p))),v?s.range(w||[g*.5/e[0].values.length,g*(e[0].values.length-.5)/e[0].values.length]):s.range(w||[0,g]),o.domain(b||[d3.min(e[0].values.map(h).concat(d)),d3.max(e[0].values.map(c).concat(d))]).range(E||[x,0]),s.domain()[0]===s.domain()[1]&&(s.domain()[0]?s.domain([s.domain()[0]-s.domain()[0]*.01,s.domain()[1]+s.domain()[1]*.01]):s.domain([-1,1])),o.domain()[0]===o.domain()[1]&&(o.domain()[0]?o.domain([o.domain()[0]+o.domain()[0]*.01,o.domain()[1]-o.domain()[1]*.01]):o.domain([-1,1]));var N=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([e[0].values]),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),k=C.append("defs"),L=C.append("g"),A=N.select("g");L.append("g").attr("class","nv-ticks"),N.attr("transform","translate("+t.left+","+t.top+")"),T.on("click",function(e,t){S.chartClick({data:e,index:t,pos:d3.event,id:i})}),k.append("clipPath").attr("id","nv-chart-clip-path-"+i).append("rect"),N.select("#nv-chart-clip-path-"+i+" rect").attr("width",g).attr("height",x),A.attr("clip-path",m?"url(#nv-chart-clip-path-"+i+")":"");var O=N.select(".nv-ticks").selectAll(".nv-tick").data(function(e){return e});O.exit().remove();var M=O.enter().append("path").attr("class",function(e,t,n){return(f(e,t)>l(e,t)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+n+"-"+t}).attr("d",function(t,n){var r=g/e[0].values.length*.9;return"m0,0l0,"+(o(f(t,n))-o(c(t,n)))+"l"+ -r/2+",0l"+r/2+",0l0,"+(o(h(t,n))-o(f(t,n)))+"l0,"+(o(l(t,n))-o(h(t,n)))+"l"+r/2+",0l"+ -r/2+",0z"}).attr("transform",function(e,t){return"translate("+s(u(e,t))+","+o(c(e,t))+")"}).on("mouseover",function(t,n){d3.select(this).classed("hover",!0),S.elementMouseover({point:t,series:e[0],pos:[s(u(t,n)),o(a(t,n))],pointIndex:n,seriesIndex:0,e:d3.event})}).on("mouseout",function(t,n){d3.select(this).classed("hover",!1),S.elementMouseout({point:t,series:e[0],pointIndex:n,seriesIndex:0,e:d3.event})}).on("click",function(e,t){S.elementClick({value:a(e,t),data:e,index:t,pos:[s(u(e,t)),o(a(e,t))],e:d3.event,id:i}),d3.event.stopPropagation()}).on("dblclick",function(e,t){S.elementDblClick({value:a(e,t),data:e,index:t,pos:[s(u(e,t)),o(a(e,t))],e:d3.event,id:i}),d3.event.stopPropagation()});O.attr("class",function(e,t,n){return(f(e,t)>l(e,t)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+n+"-"+t}),d3.transition(O).attr("transform",function(e,t){return"translate("+s(u(e,t))+","+o(c(e,t))+")"}).attr("d",function(t,n){var r=g/e[0].values.length*.9;return"m0,0l0,"+(o(f(t,n))-o(c(t,n)))+"l"+ -r/2+",0l"+r/2+",0l0,"+(o(h(t,n))-o(f(t,n)))+"l0,"+(o(l(t,n))-o(h(t,n)))+"l"+r/2+",0l"+ -r/2+",0z"})}),x}var t={top:0 -,right:0,bottom:0,left:0},n=960,r=500,i=Math.floor(Math.random()*1e4),s=d3.scale.linear(),o=d3.scale.linear(),u=function(e){return e.x},a=function(e){return e.y},f=function(e){return e.open},l=function(e){return e.close},c=function(e){return e.high},h=function(e){return e.low},p=[],d=[],v=!1,m=!0,g=e.utils.defaultColor(),y,b,w,E,S=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout");return x.dispatch=S,x.options=e.utils.optionsFunc.bind(x),x.x=function(e){return arguments.length?(u=e,x):u},x.y=function(e){return arguments.length?(a=e,x):a},x.open=function(e){return arguments.length?(f=e,x):f},x.close=function(e){return arguments.length?(l=e,x):l},x.high=function(e){return arguments.length?(c=e,x):c},x.low=function(e){return arguments.length?(h=e,x):h},x.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,x):t},x.width=function(e){return arguments.length?(n=e,x):n},x.height=function(e){return arguments.length?(r=e,x):r},x.xScale=function(e){return arguments.length?(s=e,x):s},x.yScale=function(e){return arguments.length?(o=e,x):o},x.xDomain=function(e){return arguments.length?(y=e,x):y},x.yDomain=function(e){return arguments.length?(b=e,x):b},x.xRange=function(e){return arguments.length?(w=e,x):w},x.yRange=function(e){return arguments.length?(E=e,x):E},x.forceX=function(e){return arguments.length?(p=e,x):p},x.forceY=function(e){return arguments.length?(d=e,x):d},x.padData=function(e){return arguments.length?(v=e,x):v},x.clipEdge=function(e){return arguments.length?(m=e,x):m},x.color=function(t){return arguments.length?(g=e.utils.getColor(t),x):g},x.id=function(e){return arguments.length?(i=e,x):i},x},e.models.pie=function(){"use strict";function S(e){return e.each(function(e){function q(e){var t=(e.startAngle+e.endAngle)*90/Math.PI-90;return t>90?t-180:t}function R(e){e.endAngle=isNaN(e.endAngle)?0:e.endAngle,e.startAngle=isNaN(e.startAngle)?0:e.startAngle,m||(e.innerRadius=0);var t=d3.interpolate(this._current,e);return this._current=t(0),function(e){return A(t(e))}}function U(e){e.innerRadius=0;var t=d3.interpolate({startAngle:0,endAngle:0},e);return function(e){return A(t(e))}}var o=n-t.left-t.right,f=r-t.top-t.bottom,S=Math.min(o,f)/2,x=S-S/5,T=d3.select(this),N=T.selectAll(".nv-wrap.nv-pie").data(e),C=N.enter().append("g").attr("class","nvd3 nv-wrap nv-pie nv-chart-"+u),k=C.append("g"),L=N.select("g");k.append("g").attr("class","nv-pie"),k.append("g").attr("class","nv-pieLabels"),N.attr("transform","translate("+t.left+","+t.top+")"),L.select(".nv-pie").attr("transform","translate("+o/2+","+f/2+")"),L.select(".nv-pieLabels").attr("transform","translate("+o/2+","+f/2+")"),T.on("click",function(e,t){E.chartClick({data:e,index:t,pos:d3.event,id:u})});var A=d3.svg.arc().outerRadius(x);y&&A.startAngle(y),b&&A.endAngle(b),m&&A.innerRadius(S*w);var O=d3.layout.pie().sort(null).value(function(e){return e.disabled?0:s(e)}),M=N.select(".nv-pie").selectAll(".nv-slice").data(O),_=N.select(".nv-pieLabels").selectAll(".nv-label").data(O);M.exit().remove(),_.exit().remove();var D=M.enter().append("g").attr("class","nv-slice").on("mouseover",function(e,t){d3.select(this).classed("hover",!0),E.elementMouseover({label:i(e.data),value:s(e.data),point:e.data,pointIndex:t,pos:[d3.event.pageX,d3.event.pageY],id:u})}).on("mouseout",function(e,t){d3.select(this).classed("hover",!1),E.elementMouseout({label:i(e.data),value:s(e.data),point:e.data,index:t,id:u})}).on("click",function(e,t){E.elementClick({label:i(e.data),value:s(e.data),point:e.data,index:t,pos:d3.event,id:u}),d3.event.stopPropagation()}).on("dblclick",function(e,t){E.elementDblClick({label:i(e.data),value:s(e.data),point:e.data,index:t,pos:d3.event,id:u}),d3.event.stopPropagation()});M.attr("fill",function(e,t){return a(e,t)}).attr("stroke",function(e,t){return a(e,t)});var P=D.append("path").each(function(e){this._current=e});M.select("path").transition().attr("d",A).attrTween("d",R);if(l){var H=d3.svg.arc().innerRadius(0);c&&(H=A),h&&(H=d3.svg.arc().outerRadius(A.outerRadius())),_.enter().append("g").classed("nv-label",!0).each(function(e,t){var n=d3.select(this);n.attr("transform",function(e){if(g){e.outerRadius=x+10,e.innerRadius=x+15;var t=(e.startAngle+e.endAngle)/2*(180/Math.PI);return(e.startAngle+e.endAngle)/2v?r[p]:""})}}),S}var t={top:0,right:0,bottom:0,left:0},n=500,r=500,i=function(e){return e.x},s=function(e){return e.y},o=function(e){return e.description},u=Math.floor(Math.random()*1e4),a=e.utils.defaultColor(),f=d3.format(",.2f"),l=!0,c=!0,h=!1,p="key",v=.02,m=!1,g=!1,y=!1,b=!1,w=.5,E=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout");return S.dispatch=E,S.options=e.utils.optionsFunc.bind(S),S.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,S):t},S.width=function(e){return arguments.length?(n=e,S):n},S.height=function(e){return arguments.length?(r=e,S):r},S.values=function(t){return e.log("pie.values() is no longer supported."),S},S.x=function(e){return arguments.length?(i=e,S):i},S.y=function(e){return arguments.length?(s=d3.functor(e),S):s},S.description=function(e){return arguments.length?(o=e,S):o},S.showLabels=function(e){return arguments.length?(l=e,S):l},S.labelSunbeamLayout=function(e){return arguments.length?(g=e,S):g},S.donutLabelsOutside=function(e){return arguments.length?(h=e,S):h},S.pieLabelsOutside=function(e){return arguments.length?(c=e,S):c},S.labelType=function(e){return arguments.length?(p=e,p=p||"key",S):p},S.donut=function(e){return arguments.length?(m=e,S):m},S.donutRatio=function(e){return arguments.length?(w=e,S):w},S.startAngle=function(e){return arguments.length?(y=e,S):y},S.endAngle=function(e){return arguments.length?(b=e,S):b},S.id=function(e){return arguments.length?(u=e,S):u},S.color=function(t){return arguments.length?(a=e.utils.getColor(t),S):a},S.valueFormat=function(e){return arguments.length?(f=e,S):f},S.labelThreshold=function(e){return arguments.length?(v=e,S):v},S},e.models.pieChart=function(){"use strict";function v(e){return e.each(function(e){var u=d3.select(this),a=this,f=(i||parseInt(u.style("width"))||960)-r.left-r.right,d=(s||parseInt(u.style("height"))||400)-r.top-r.bottom;v.update=function(){u.transition().call(v)},v.container=this,l.disabled=e.map(function(e){return!!e.disabled});if(!c){var m;c={};for(m in l)l[m]instanceof Array?c[m]=l[m].slice(0):c[m]=l[m]}if(!e||!e.length){var g=u.selectAll(".nv-noData").data([h]);return g.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),g.attr("x",r.left+f/2).attr("y",r.top+d/2).text(function(e){return e}),v}u.selectAll(".nv-noData").remove();var y=u.selectAll("g.nv-wrap.nv-pieChart").data([e]),b=y.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),w=y.select("g");b.append("g").attr("class","nv-pieWrap"),b.append("g").attr("class","nv-legendWrap"),o&&(n.width(f).key(t.x()),y.select(".nv-legendWrap").datum(e).call(n),r.top!=n.height()&&(r.top=n.height(),d=(s||parseInt(u.style("height"))||400)-r.top-r.bottom),y.select(".nv-legendWrap").attr("transform","translate(0,"+ -r.top+")")),y.attr("transform","translate("+r.left+","+r.top+")"),t.width(f).height(d);var E=w.select(".nv-pieWrap").datum([e]);d3.transition(E).call(t),n.dispatch.on("stateChange",function(e){l=e,p.stateChange(l),v.update()}),t.dispatch.on("elementMouseout.tooltip",function(e){p.tooltipHide(e)}),p.on("changeState",function(t){typeof t.disabled!="undefined"&&(e.forEach(function(e,n){e.disabled=t.disabled[n]}),l.disabled=t.disabled),v.update()})}),v}var t=e.models.pie(),n=e.models.legend(),r={top:30,right:20,bottom:20,left:20},i=null,s=null,o=!0,u=e.utils.defaultColor(),a=!0,f=function(e,t,n,r){return"

    "+e+"

    "+"

    "+t+"

    "},l={},c=null,h="No Data Available.",p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),d=function(n,r){var i=t.description()(n.point)||t.x()(n.point),s=n.pos[0]+(r&&r.offsetLeft||0),o=n.pos[1]+(r&&r.offsetTop||0),u=t.valueFormat()(t.y()(n.point)),a=f(i,u,n,v);e.tooltip.show([s,o],a,n.value<0?"n":"s",null,r)};return t.dispatch.on("elementMouseover.tooltip",function(e){e.pos=[e.pos[0]+r.left,e.pos[1]+r.top],p.tooltipShow(e)}),p.on("tooltipShow",function(e){a&&d(e)}),p.on("tooltipHide",function(){a&&e.tooltip.cleanup()}),v.legend=n,v.dispatch=p,v.pie=t,d3.rebind(v,t,"valueFormat","values","x","y","description","id","showLabels","donutLabelsOutside","pieLabelsOutside","labelType","donut","donutRatio","labelThreshold"),v.options=e.utils.optionsFunc.bind(v),v.margin=function(e){return arguments.length?(r.top=typeof e.top!="undefined"?e.top:r.top,r.right=typeof e.right!="undefined"?e.right:r.right,r.bottom=typeof e.bottom!="undefined"?e.bottom:r.bottom,r.left=typeof e.left!="undefined"?e.left:r.left,v):r},v.width=function(e){return arguments.length?(i=e,v):i},v.height=function(e){return arguments.length?(s=e,v):s},v.color=function(r){return arguments.length?(u=e.utils.getColor(r),n.color(u),t.color(u),v):u},v.showLegend=function(e){return arguments.length?(o=e,v):o},v.tooltips=function(e){return arguments.length?(a=e,v):a},v.tooltipContent=function(e){return arguments.length?(f=e,v):f},v.state=function(e){return arguments.length?(l=e,v):l},v.defaultState=function(e){return arguments.length?(c=e,v):c},v.noData=function(e){return arguments.length?(h=e,v):h},v},e.models.scatter=function(){"use strict";function I(q){return q.each(function(I){function Q(){if(!g)return!1;var e,i=d3.merge(I.map(function(e,t){return e.values.map(function(e,n){var r=f(e,n),i=l(e,n);return[o(r)+Math.random()*1e-7,u(i)+Math.random()*1e-7,t,n,e]}).filter(function(e,t){return b(e[4],t)})}));if(D===!0){if(x){var a=X.select("defs").selectAll(".nv-point-clips").data([s]).enter();a.append("clipPath").attr("class","nv-point-clips").attr("id","nv-points-clip-"+s);var c=X.select("#nv-points-clip-"+s).selectAll("circle").data(i);c.enter().append("circle").attr("r",T),c.exit().remove(),c.attr("cx",function(e){return e[0]}).attr("cy",function(e){return e[1]}),X.select(".nv-point-paths").attr("clip-path","url(#nv-points-clip-"+s+")")}i.length&&(i.push([o.range()[0]-20,u.range()[0]-20,null,null]),i.push([o.range()[1]+20,u.range()[1]+20,null,null]),i.push([o.range()[0]-20,u.range()[0]+20,null,null]),i.push([o.range()[1]+20,u.range()[1]-20,null,null]));var h=d3.geom.polygon([[-10,-10],[-10,r+10],[n+10,r+10],[n+10,-10]]),p=d3.geom.voronoi(i).map(function(e,t){return{data:h.clip(e),series:i[t][2],point:i[t][3]}}),d=X.select(".nv-point-paths").selectAll("path").data(p);d.enter().append("path").attr("class",function(e,t){return"nv-path-"+t}),d.exit().remove(),d.attr("d",function(e){return e.data.length===0?"M 0 0":"M"+e.data.join("L")+"Z"});var v=function(e,n){if(F)return 0;var r=I[e.series];if(typeof r=="undefined")return;var i=r.values[e.point];n({point:i,series:r,pos:[o(f(i,e.point))+t.left,u(l(i,e.point))+t.top],seriesIndex:e.series,pointIndex:e.point})};d.on("click",function(e){v(e,_.elementClick)}).on("mouseover",function(e){v(e,_.elementMouseover)}).on("mouseout",function(e,t){v(e,_.elementMouseout)})}else X.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(e,n){if(F||!I[e.series])return 0;var r=I[e.series],i=r.values[n];_.elementClick({point:i,series:r,pos:[o(f(i,n))+t.left,u(l(i,n))+t.top],seriesIndex:e.series,pointIndex:n})}).on("mouseover",function(e,n){if(F||!I[e.series])return 0;var r=I[e.series],i=r.values[n];_.elementMouseover({point:i,series:r,pos:[o(f(i,n))+t.left,u(l(i,n))+t.top],seriesIndex:e.series,pointIndex:n})}).on("mouseout",function(e,t){if(F||!I[e.series])return 0;var n=I[e.series],r=n.values[t];_.elementMouseout({point:r,series:n,seriesIndex:e.series,pointIndex:t})});F=!1}var q=n-t.left-t.right,R=r-t.top-t.bottom,U=d3.select(this);I.forEach(function(e,t){e.values.forEach(function(e){e.series=t})});var W=N&&C&&A?[]:d3.merge(I.map(function(e){return e.values.map(function(e,t){return{x:f(e,t),y:l(e,t),size:c(e,t)}})}));o.domain(N||d3.extent(W.map(function(e){return e.x}).concat(d))),w&&I[0]?o.range(k||[(q*E+q)/(2*I[0].values.length),q-q*(1+E)/(2*I[0].values.length)]):o.range(k||[0,q]),u.domain(C||d3.extent(W.map(function(e){return e.y}).concat(v))).range(L||[R,0]),a.domain(A||d3.extent(W.map(function(e){return e.size}).concat(m))).range(O||[16,256]);if(o.domain()[0]===o.domain()[1]||u.domain()[0]===u.domain()[1])M=!0;o.domain()[0]===o.domain()[1]&&(o.domain()[0]?o.domain([o.domain()[0]-o.domain()[0]*.01,o.domain()[1]+o.domain()[1]*.01]):o.domain([-1,1])),u.domain()[0]===u.domain()[1]&&(u.domain()[0]?u.domain([u.domain()[0]-u.domain()[0]*.01,u.domain()[1]+u.domain()[1]*.01]):u.domain([-1,1])),isNaN(o.domain()[0])&&o.domain([-1,1]),isNaN(u.domain()[0])&&u.domain([-1,1]),P=P||o,H=H||u,B=B||a;var X=U.selectAll("g.nv-wrap.nv-scatter").data([I]),V=X.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+s+(M?" nv-single-point":"")),$=V.append("defs"),J=V.append("g"),K=X.select("g");J.append("g").attr("class","nv-groups"),J.append("g").attr("class","nv-point-paths"),X.attr("transform","translate("+t.left+","+t.top+")"),$.append("clipPath").attr("id","nv-edge-clip-"+s).append("rect"),X.select("#nv-edge-clip-"+s+" rect").attr("width",q).attr("height",R>0?R:0),K.attr("clip-path",S?"url(#nv-edge-clip-"+s+")":""),F=!0;var G=X.select(".nv-groups").selectAll(".nv-group").data(function(e){return e},function(e){return e.key});G.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),G.exit().remove(),G.attr("class",function(e,t){return"nv-group nv-series-"+t}).classed("hover",function(e){return e.hover}),G.transition().style("fill",function(e,t){return i(e,t)}).style("stroke",function(e,t){return i(e,t)}).style("stroke-opacity",1).style("fill-opacity",.5);if(p){var Y=G.selectAll("circle.nv-point").data(function(e){return e.values},y);Y.enter().append("circle").style("fill",function(e,t){return e.color}).style("stroke",function(e,t){return e.color}).attr("cx",function(t,n){return e.utils.NaNtoZero(P(f(t,n)))}).attr("cy",function(t,n){return e.utils.NaNtoZero(H(l(t,n)))}).attr("r",function(e,t){return Math.sqrt(a(c(e,t))/Math.PI)}),Y.exit().remove(),G.exit().selectAll("path.nv-point").transition().attr("cx",function(t,n){return e.utils.NaNtoZero(o(f(t,n)))}).attr("cy",function(t,n){return e.utils.NaNtoZero(u(l(t,n)))}).remove(),Y.each(function(e,t){d3.select(this).classed("nv-point",!0).classed("nv-point-"+t,!0).classed("hover",!1)}),Y.transition().attr("cx",function(t,n){return e.utils.NaNtoZero(o(f(t,n)))}).attr("cy",function(t,n){return e.utils.NaNtoZero(u(l(t,n)))}).attr("r",function(e,t){return Math.sqrt(a(c(e,t))/Math.PI)})}else{var Y=G.selectAll("path.nv-point").data(function(e){return e.values});Y.enter().append("path").style("fill",function(e,t){return e.color}).style("stroke",function(e,t){return e.color}).attr("transform",function(e,t){return"translate("+P(f(e,t))+","+H(l(e,t))+")"}).attr("d",d3.svg.symbol().type(h).size(function(e,t){return a(c(e,t))})),Y.exit().remove(),G.exit().selectAll("path.nv-point").transition().attr("transform",function(e,t){return"translate("+o(f(e,t))+","+u(l(e,t))+")"}).remove(),Y.each(function(e,t){d3.select(this).classed("nv-point",!0).classed("nv-point-"+t,!0).classed("hover",!1)}),Y.transition().attr("transform",function(e,t){return"translate("+o(f(e,t))+","+u(l(e,t))+")"}).attr("d",d3.svg.symbol().type(h).size(function(e,t){return a(c(e,t))}))}clearTimeout(j),j=setTimeout(Q,300),P=o.copy(),H=u.copy(),B=a.copy()}),I}var t={top:0,right:0,bottom:0,left:0},n=960,r=500,i=e.utils.defaultColor(),s=Math.floor(Math.random()*1e5),o=d3.scale.linear(),u=d3.scale.linear(),a=d3.scale.linear(),f=function(e){return e.x},l=function(e){return e.y},c=function(e){return e.size||1},h=function(e){return e.shape||"circle"},p=!0,d=[],v=[],m=[],g=!0,y=null,b=function(e){return!e.notActive},w=!1,E=.1,S=!1,x=!0,T=function(){return 25},N=null,C=null,k=null,L=null,A=null,O=null,M=!1,_=d3.dispatch("elementClick","elementMouseover","elementMouseout"),D=!0,P,H,B,j,F=!1;return I.clearHighlights=function(){d3.selectAll(".nv-chart-"+s+" .nv-point.hover").classed("hover",!1)},I.highlightPoint=function(e,t,n){d3.select(".nv-chart-"+s+" .nv-series-"+e+" .nv-point-"+t).classed("hover",n)},_.on("elementMouseover.point",function(e){g&&I.highlightPoint(e.seriesIndex,e.pointIndex,!0)}),_.on("elementMouseout.point",function(e){g&&I.highlightPoint(e.seriesIndex,e.pointIndex,!1)}),I.dispatch=_,I.options=e.utils.optionsFunc.bind(I),I.x=function(e){return arguments.length?(f=d3.functor(e),I):f},I.y=function(e){return arguments.length?(l=d3.functor(e),I):l},I.size=function(e){return arguments.length?(c=d3.functor(e),I):c},I.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,I):t},I.width=function(e){return arguments.length?(n=e,I):n},I.height=function(e){return arguments.length?(r=e,I):r},I.xScale=function(e){return arguments.length?(o=e,I):o},I.yScale=function(e){return arguments.length?(u=e,I):u},I.zScale=function(e){return arguments.length?(a=e,I):a},I.xDomain=function(e){return arguments.length?(N=e,I):N},I.yDomain=function(e){return arguments.length?(C=e,I):C},I.sizeDomain=function(e){return arguments.length?(A=e,I):A},I.xRange=function(e){return arguments.length?(k=e,I):k},I.yRange=function(e){return arguments.length?(L=e,I):L},I.sizeRange=function(e){return arguments.length?(O=e,I):O},I.forceX=function(e){return arguments.length?(d=e,I):d},I.forceY=function(e){return arguments.length?(v=e,I):v},I.forceSize=function(e){return arguments.length?(m=e,I):m},I.interactive=function(e){return arguments.length?(g=e,I):g},I.pointKey=function(e){return arguments.length?(y=e,I):y},I.pointActive=function(e){return arguments.length?(b=e,I):b},I.padData=function(e){return arguments.length?(w=e,I):w},I.padDataOuter=function(e){return arguments.length?(E=e,I):E},I.clipEdge=function(e){return arguments.length?(S=e,I):S},I.clipVoronoi=function(e){return arguments.length?(x=e,I):x},I.useVoronoi=function(e){return arguments.length?(D=e,D===!1&&(x=!1),I):D},I.clipRadius=function(e){return arguments.length?(T=e,I):T},I.color=function(t){return arguments.length?(i=e.utils.getColor(t),I):i},I.shape=function(e){return arguments.length?(h=e,I):h},I.onlyCircles=function(e){return arguments.length?(p=e,I):p},I.id=function(e){return arguments.length?(s=e,I):s},I.singlePoint=function(e){return arguments.length?(M=e,I):M},I},e.models.scatterChart=function(){"use strict";function F(e){return e.each(function(e){function K(){if(T)return X.select(".nv-point-paths").style("pointer-events","all"),!1;X.select(".nv-point-paths").style("pointer-events","none");var i=d3.mouse(this);h.distortion(x).focus(i[0]),p.distortion(x).focus(i[1]),X.select(".nv-scatterWrap").call(t),b&&X.select(".nv-x.nv-axis").call(n),w&&X.select(".nv-y.nv-axis").call(r),X.select(".nv-distributionX").datum(e.filter(function(e){return!e.disabled})).call(o),X.select(".nv-distributionY").datum(e.filter(function(e){return!e.disabled})).call(u)}var C=d3.select(this),k=this,L=(f||parseInt(C.style("width"))||960)-a.left-a.right,I=(l||parseInt(C.style("height"))||400)-a.top-a.bottom;F.update=function(){C.transition().duration(D).call(F)},F.container=this,A.disabled=e.map(function(e){return!!e.disabled});if(!O){var q;O={};for(q in A)A[q]instanceof Array?O[q]=A[q].slice(0):O[q]=A[q]}if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var R=C.selectAll(".nv-noData").data([_]);return R.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),R.attr("x",a.left+L/2).attr("y",a.top+I/2).text(function(e){return e}),F}C.selectAll(".nv-noData").remove(),P=P||h,H=H||p;var U=C.selectAll("g.nv-wrap.nv-scatterChart").data([e]),z=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+t.id()),W=z.append("g"),X=U.select("g");W.append("rect").attr("class","nvd3 nv-background"),W.append("g").attr("class","nv-x nv-axis"),W.append("g").attr("class","nv-y nv-axis"),W.append("g").attr("class","nv-scatterWrap"),W.append("g").attr("class","nv-distWrap"),W.append("g").attr("class","nv-legendWrap"),W.append("g").attr("class","nv-controlsWrap");if(y){var V=S?L/2:L;i.width(V),U.select(".nv-legendWrap").datum(e).call(i),a.top!=i.height()&&(a.top=i.height(),I=(l||parseInt(C.style("height"))||400)-a.top-a.bottom),U.select(".nv-legendWrap").attr("transform","translate("+(L-V)+","+ -a.top+")")}S&&(s.width(180).color(["#444"]),X.select(".nv-controlsWrap").datum(j).attr("transform","translate(0,"+ -a.top+")").call(s)),U.attr("transform","translate("+a.left+","+a.top+")"),E&&X.select(".nv-y.nv-axis").attr("transform","translate("+L+",0)"),t.width(L).height(I).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),d!==0&&t.xDomain(null),v!==0&&t.yDomain(null),U.select(".nv-scatterWrap").datum(e.filter(function(e){return!e.disabled})).call(t);if(d!==0){var $=h.domain()[1]-h.domain()[0];t.xDomain([h.domain()[0]-d*$,h.domain()[1]+d*$])}if(v!==0){var J=p.domain()[1]-p.domain()[0];t.yDomain([p.domain()[0]-v*J,p.domain()[1]+v*J])}(v!==0||d!==0)&&U.select(".nv-scatterWrap").datum(e.filter(function(e){return!e.disabled})).call(t),b&&(n.scale(h).ticks(n.ticks()&&n.ticks().length?n.ticks():L/100).tickSize(-I,0),X.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(n)),w&&(r.scale(p).ticks(r.ticks()&&r.ticks().length?r.ticks():I/36).tickSize(-L,0),X.select(".nv-y.nv-axis").call(r)),m&&(o.getData(t.x()).scale(h).width(L).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),W.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),X.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(e.filter(function(e){return!e.disabled})).call(o)),g&&(u.getData(t.y()).scale(p).width(I).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),W.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),X.select(".nv-distributionY").attr("transform","translate("+(E?L:-u.size())+",0)").datum(e.filter(function(e){return!e.disabled})).call(u)),d3.fisheye&&(X.select(".nv-background").attr("width",L).attr("height",I),X.select(".nv-background").on("mousemove",K),X.select(".nv-background").on("click",function(){T=!T}),t.dispatch.on("elementClick.freezeFisheye",function(){T=!T})),s.dispatch.on("legendClick",function(e,i){e.disabled=!e.disabled,x=e.disabled?0:2.5,X.select(".nv-background").style("pointer-events",e.disabled?"none":"all"),X.select(".nv-point-paths").style("pointer-events",e.disabled?"all":"none"),e.disabled?(h.distortion(x).focus(0),p.distortion(x).focus(0),X.select(".nv-scatterWrap").call(t),X.select(".nv-x.nv-axis").call(n),X.select(".nv-y.nv-axis").call(r)):T=!1,F.update()}),i.dispatch.on("stateChange",function(e){A.disabled=e.disabled,M.stateChange(A),F.update()}),t.dispatch.on("elementMouseover.tooltip",function(e){d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-distx-"+e.pointIndex).attr("y1",function(t,n){return e.pos[1]-I}),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-disty-"+e.pointIndex).attr("x2",e.pos[0]+o.size()),e.pos=[e.pos[0]+a.left,e.pos[1]+a.top],M.tooltipShow(e)}),M.on("tooltipShow",function(e){N&&B(e,k.parentNode)}),M.on("changeState",function(t){typeof t.disabled!="undefined"&&(e.forEach(function(e,n){e.disabled=t.disabled[n]}),A.disabled=t.disabled),F.update()}),P=h.copy(),H=p.copy()}),F}var t=e.models.scatter(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.models.legend(),o=e.models.distribution(),u=e.models.distribution(),a={top:30,right:20,bottom:50,left:75},f=null,l=null,c=e.utils.defaultColor(),h=d3.fisheye?d3.fisheye.scale(d3.scale.linear).distortion(0):t.xScale(),p=d3.fisheye?d3.fisheye.scale(d3.scale.linear).distortion(0):t.yScale(),d=0,v=0,m=!1,g=!1,y=!0,b=!0,w=!0,E=!1,S=!!d3.fisheye,x=0,T=!1,N=!0,C=function(e,t,n){return""+t+""},k=function(e,t,n){return""+n+""},L=null,A={},O=null,M=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),_="No Data Available.",D=250;t.xScale(h).yScale(p),n.orient("bottom").tickPadding(10),r.orient(E?"right":"left").tickPadding(10),o.axis("x"),u.axis("y"),s.updateState(!1);var P,H,B=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),f=i.pos[0]+(s.offsetLeft||0),l=p.range()[0]+a.top+(s.offsetTop||0),c=h.range()[0]+a.left+(s.offsetLeft||0),d=i.pos[1]+(s.offsetTop||0),v=n.tickFormat()(t.x()(i.point,i.pointIndex)),m=r.tickFormat()(t.y()(i.point,i.pointIndex));C!=null&&e.tooltip.show([f,l],C(i.series.key,v,m,i,F),"n",1,s,"x-nvtooltip"),k!=null&&e.tooltip.show([c,d],k(i.series.key,v,m,i,F),"e",1,s,"y-nvtooltip"),L!=null&&e.tooltip.show([o,u],L(i.series.key,v,m,i,F),i.value<0?"n":"s",null,s)},j=[{key:"Magnify",disabled:!0}];return t.dispatch.on("elementMouseout.tooltip",function(e){M.tooltipHide(e),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-distx-"+e.pointIndex).attr("y1",0),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-disty-"+e.pointIndex).attr("x2",u.size())}),M.on("tooltipHide",function(){N&&e.tooltip.cleanup()}),F.dispatch=M,F.scatter=t,F.legend=i,F.controls=s,F.xAxis=n,F.yAxis=r,F.distX=o,F.distY=u,d3.rebind(F,t,"id","interactive","pointActive","x","y","shape","size","xScale","yScale","zScale","xDomain","yDomain","xRange","yRange","sizeDomain","sizeRange","forceX","forceY","forceSize","clipVoronoi","clipRadius","useVoronoi"),F.options=e.utils.optionsFunc.bind(F),F.margin=function(e){return arguments.length?(a.top=typeof e.top!="undefined"?e.top:a.top,a.right=typeof e.right!="undefined"?e.right:a.right,a.bottom=typeof e.bottom!="undefined"?e.bottom:a.bottom,a.left=typeof e.left!="undefined"?e.left:a.left,F):a},F.width=function(e){return arguments.length?(f=e,F):f},F.height=function(e){return arguments.length?(l=e,F):l},F.color=function(t){return arguments.length?(c=e.utils.getColor(t),i.color(c),o.color(c),u.color(c),F):c},F.showDistX=function(e){return arguments.length?(m=e,F):m},F.showDistY=function(e){return arguments.length?(g=e,F):g},F.showControls=function(e){return arguments.length?(S=e,F):S},F.showLegend=function(e){return arguments.length?(y=e,F):y},F.showXAxis=function(e){return arguments.length?(b=e,F):b},F.showYAxis=function(e){return arguments.length?(w=e,F):w},F.rightAlignYAxis=function(e){return arguments.length?(E=e,r.orient(e?"right":"left"),F):E},F.fisheye=function(e){return arguments.length?(x=e,F):x},F.xPadding=function(e){return arguments.length?(d=e,F):d},F.yPadding=function(e){return arguments.length?(v=e,F):v},F.tooltips=function(e){return arguments.length?(N=e,F):N},F.tooltipContent=function(e){return arguments.length?(L=e,F):L},F.tooltipXContent=function(e){return arguments.length?(C=e,F):C},F.tooltipYContent=function(e){return arguments.length?(k=e,F):k},F.state=function(e){return arguments.length?(A=e,F):A},F.defaultState=function(e){return arguments.length?(O=e,F):O},F.noData=function(e){return arguments.length?(_=e,F):_},F.transitionDuration=function(e){return arguments.length?(D=e,F):D},F},e.models.scatterPlusLineChart=function(){"use strict";function B(e){return e.each(function(e){function $(){if(S)return z.select(".nv-point-paths").style("pointer-events","all"),!1;z.select(".nv-point-paths").style("pointer-events","none");var i=d3.mouse(this);h.distortion(E).focus(i[0]),p.distortion(E).focus(i[1]),z.select(".nv-scatterWrap").datum(e.filter(function(e){return!e.disabled})).call(t),g&&z.select(".nv-x.nv-axis").call(n),y&&z.select(".nv-y.nv-axis").call(r),z.select(".nv-distributionX").datum(e.filter(function(e){return!e.disabled})).call(o),z.select(".nv-distributionY").datum(e.filter(function(e){return!e.disabled})).call(u)}var T=d3.select(this),N=this,C=(f||parseInt(T.style("width"))||960)-a.left-a.right,j=(l||parseInt(T.style("height"))||400)-a.top-a.bottom;B.update=function(){T.transition().duration(M).call(B)},B.container=this,k.disabled=e.map(function(e){return!!e.disabled});if(!L){var F;L={};for(F in k)k[F]instanceof Array?L[F]=k[F].slice(0):L[F]=k[F]}if(!e||!e.length||!e.filter(function(e){return e.values.length}).length){var I=T.selectAll(".nv-noData").data([O]);return I.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),I.attr("x",a.left+C/2).attr("y",a.top+j/2).text(function(e){return e}),B}T.selectAll(".nv-noData").remove(),h=t.xScale(),p=t.yScale(),_=_||h,D=D||p;var q=T.selectAll("g.nv-wrap.nv-scatterChart").data([e]),R=q.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+t.id()),U=R.append("g"),z=q.select("g");U.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),U.append("g").attr("class","nv-x nv-axis"),U.append("g").attr("class","nv-y nv-axis"),U.append("g").attr("class","nv-scatterWrap"),U.append("g").attr("class","nv-regressionLinesWrap"),U.append("g").attr("class","nv-distWrap"),U.append("g").attr("class","nv-legendWrap"),U.append("g").attr("class","nv-controlsWrap"),q.attr("transform","translate("+a.left+","+a.top+")"),b&&z.select(".nv-y.nv-axis").attr("transform","translate("+C+",0)"),m&&(i.width(C/2),q.select(".nv-legendWrap").datum(e).call(i),a.top!=i.height()&&(a.top=i.height(),j=(l||parseInt(T.style("height"))||400)-a.top-a.bottom),q.select(".nv-legendWrap").attr("transform","translate("+C/2+","+ -a.top+")")),w&&(s.width(180).color(["#444"]),z.select(".nv-controlsWrap").datum(H).attr("transform","translate(0,"+ -a.top+")").call(s)),t.width(C).height(j).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),q.select(".nv-scatterWrap").datum(e.filter(function(e){return!e.disabled})).call(t),q.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+t.id()+")");var W=q.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(e){return e});W.enter().append("g").attr("class","nv-regLines");var X=W.selectAll(".nv-regLine").data(function(e){return[e]}),V=X.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0);X.transition().attr("x1",h.range()[0]).attr("x2",h.range()[1]).attr("y1",function(e,t){return p(h.domain()[0]*e.slope+e.intercept)}).attr("y2",function(e,t){return p(h.domain()[1]*e.slope+e.intercept)}).style("stroke",function(e,t,n){return c(e,n)}).style("stroke-opacity",function(e,t){return e.disabled||typeof e.slope=="undefined"||typeof e.intercept=="undefined"?0:1}),g&&(n.scale(h).ticks(n.ticks()?n.ticks():C/100).tickSize(-j,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(n)),y&&(r.scale(p).ticks(r.ticks()?r.ticks():j/36).tickSize(-C,0),z.select(".nv-y.nv-axis").call(r)),d&&(o.getData(t.x()).scale(h).width(C).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),U.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),z.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(e.filter(function(e){return!e.disabled})).call(o)),v&&(u.getData(t.y()).scale(p).width( -j).color(e.map(function(e,t){return e.color||c(e,t)}).filter(function(t,n){return!e[n].disabled})),U.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),z.select(".nv-distributionY").attr("transform","translate("+(b?C:-u.size())+",0)").datum(e.filter(function(e){return!e.disabled})).call(u)),d3.fisheye&&(z.select(".nv-background").attr("width",C).attr("height",j),z.select(".nv-background").on("mousemove",$),z.select(".nv-background").on("click",function(){S=!S}),t.dispatch.on("elementClick.freezeFisheye",function(){S=!S})),s.dispatch.on("legendClick",function(e,i){e.disabled=!e.disabled,E=e.disabled?0:2.5,z.select(".nv-background").style("pointer-events",e.disabled?"none":"all"),z.select(".nv-point-paths").style("pointer-events",e.disabled?"all":"none"),e.disabled?(h.distortion(E).focus(0),p.distortion(E).focus(0),z.select(".nv-scatterWrap").call(t),z.select(".nv-x.nv-axis").call(n),z.select(".nv-y.nv-axis").call(r)):S=!1,B.update()}),i.dispatch.on("stateChange",function(e){k=e,A.stateChange(k),B.update()}),t.dispatch.on("elementMouseover.tooltip",function(e){d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-distx-"+e.pointIndex).attr("y1",e.pos[1]-j),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-disty-"+e.pointIndex).attr("x2",e.pos[0]+o.size()),e.pos=[e.pos[0]+a.left,e.pos[1]+a.top],A.tooltipShow(e)}),A.on("tooltipShow",function(e){x&&P(e,N.parentNode)}),A.on("changeState",function(t){typeof t.disabled!="undefined"&&(e.forEach(function(e,n){e.disabled=t.disabled[n]}),k.disabled=t.disabled),B.update()}),_=h.copy(),D=p.copy()}),B}var t=e.models.scatter(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.models.legend(),o=e.models.distribution(),u=e.models.distribution(),a={top:30,right:20,bottom:50,left:75},f=null,l=null,c=e.utils.defaultColor(),h=d3.fisheye?d3.fisheye.scale(d3.scale.linear).distortion(0):t.xScale(),p=d3.fisheye?d3.fisheye.scale(d3.scale.linear).distortion(0):t.yScale(),d=!1,v=!1,m=!0,g=!0,y=!0,b=!1,w=!!d3.fisheye,E=0,S=!1,x=!0,T=function(e,t,n){return""+t+""},N=function(e,t,n){return""+n+""},C=function(e,t,n,r){return"

    "+e+"

    "+"

    "+r+"

    "},k={},L=null,A=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),O="No Data Available.",M=250;t.xScale(h).yScale(p),n.orient("bottom").tickPadding(10),r.orient(b?"right":"left").tickPadding(10),o.axis("x"),u.axis("y"),s.updateState(!1);var _,D,P=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),f=i.pos[0]+(s.offsetLeft||0),l=p.range()[0]+a.top+(s.offsetTop||0),c=h.range()[0]+a.left+(s.offsetLeft||0),d=i.pos[1]+(s.offsetTop||0),v=n.tickFormat()(t.x()(i.point,i.pointIndex)),m=r.tickFormat()(t.y()(i.point,i.pointIndex));T!=null&&e.tooltip.show([f,l],T(i.series.key,v,m,i,B),"n",1,s,"x-nvtooltip"),N!=null&&e.tooltip.show([c,d],N(i.series.key,v,m,i,B),"e",1,s,"y-nvtooltip"),C!=null&&e.tooltip.show([o,u],C(i.series.key,v,m,i.point.tooltip,i,B),i.value<0?"n":"s",null,s)},H=[{key:"Magnify",disabled:!0}];return t.dispatch.on("elementMouseout.tooltip",function(e){A.tooltipHide(e),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-distx-"+e.pointIndex).attr("y1",0),d3.select(".nv-chart-"+t.id()+" .nv-series-"+e.seriesIndex+" .nv-disty-"+e.pointIndex).attr("x2",u.size())}),A.on("tooltipHide",function(){x&&e.tooltip.cleanup()}),B.dispatch=A,B.scatter=t,B.legend=i,B.controls=s,B.xAxis=n,B.yAxis=r,B.distX=o,B.distY=u,d3.rebind(B,t,"id","interactive","pointActive","x","y","shape","size","xScale","yScale","zScale","xDomain","yDomain","xRange","yRange","sizeDomain","sizeRange","forceX","forceY","forceSize","clipVoronoi","clipRadius","useVoronoi"),B.options=e.utils.optionsFunc.bind(B),B.margin=function(e){return arguments.length?(a.top=typeof e.top!="undefined"?e.top:a.top,a.right=typeof e.right!="undefined"?e.right:a.right,a.bottom=typeof e.bottom!="undefined"?e.bottom:a.bottom,a.left=typeof e.left!="undefined"?e.left:a.left,B):a},B.width=function(e){return arguments.length?(f=e,B):f},B.height=function(e){return arguments.length?(l=e,B):l},B.color=function(t){return arguments.length?(c=e.utils.getColor(t),i.color(c),o.color(c),u.color(c),B):c},B.showDistX=function(e){return arguments.length?(d=e,B):d},B.showDistY=function(e){return arguments.length?(v=e,B):v},B.showControls=function(e){return arguments.length?(w=e,B):w},B.showLegend=function(e){return arguments.length?(m=e,B):m},B.showXAxis=function(e){return arguments.length?(g=e,B):g},B.showYAxis=function(e){return arguments.length?(y=e,B):y},B.rightAlignYAxis=function(e){return arguments.length?(b=e,r.orient(e?"right":"left"),B):b},B.fisheye=function(e){return arguments.length?(E=e,B):E},B.tooltips=function(e){return arguments.length?(x=e,B):x},B.tooltipContent=function(e){return arguments.length?(C=e,B):C},B.tooltipXContent=function(e){return arguments.length?(T=e,B):T},B.tooltipYContent=function(e){return arguments.length?(N=e,B):N},B.state=function(e){return arguments.length?(k=e,B):k},B.defaultState=function(e){return arguments.length?(L=e,B):L},B.noData=function(e){return arguments.length?(O=e,B):O},B.transitionDuration=function(e){return arguments.length?(M=e,B):M},B},e.models.sparkline=function(){"use strict";function d(e){return e.each(function(e){var i=n-t.left-t.right,d=r-t.top-t.bottom,v=d3.select(this);s.domain(l||d3.extent(e,u)).range(h||[0,i]),o.domain(c||d3.extent(e,a)).range(p||[d,0]);var m=v.selectAll("g.nv-wrap.nv-sparkline").data([e]),g=m.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline"),b=g.append("g"),w=m.select("g");m.attr("transform","translate("+t.left+","+t.top+")");var E=m.selectAll("path").data(function(e){return[e]});E.enter().append("path"),E.exit().remove(),E.style("stroke",function(e,t){return e.color||f(e,t)}).attr("d",d3.svg.line().x(function(e,t){return s(u(e,t))}).y(function(e,t){return o(a(e,t))}));var S=m.selectAll("circle.nv-point").data(function(e){function n(t){if(t!=-1){var n=e[t];return n.pointIndex=t,n}return null}var t=e.map(function(e,t){return a(e,t)}),r=n(t.lastIndexOf(o.domain()[1])),i=n(t.indexOf(o.domain()[0])),s=n(t.length-1);return[i,r,s].filter(function(e){return e!=null})});S.enter().append("circle"),S.exit().remove(),S.attr("cx",function(e,t){return s(u(e,e.pointIndex))}).attr("cy",function(e,t){return o(a(e,e.pointIndex))}).attr("r",2).attr("class",function(e,t){return u(e,e.pointIndex)==s.domain()[1]?"nv-point nv-currentValue":a(e,e.pointIndex)==o.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),d}var t={top:2,right:0,bottom:2,left:0},n=400,r=32,i=!0,s=d3.scale.linear(),o=d3.scale.linear(),u=function(e){return e.x},a=function(e){return e.y},f=e.utils.getColor(["#000"]),l,c,h,p;return d.options=e.utils.optionsFunc.bind(d),d.margin=function(e){return arguments.length?(t.top=typeof e.top!="undefined"?e.top:t.top,t.right=typeof e.right!="undefined"?e.right:t.right,t.bottom=typeof e.bottom!="undefined"?e.bottom:t.bottom,t.left=typeof e.left!="undefined"?e.left:t.left,d):t},d.width=function(e){return arguments.length?(n=e,d):n},d.height=function(e){return arguments.length?(r=e,d):r},d.x=function(e){return arguments.length?(u=d3.functor(e),d):u},d.y=function(e){return arguments.length?(a=d3.functor(e),d):a},d.xScale=function(e){return arguments.length?(s=e,d):s},d.yScale=function(e){return arguments.length?(o=e,d):o},d.xDomain=function(e){return arguments.length?(l=e,d):l},d.yDomain=function(e){return arguments.length?(c=e,d):c},d.xRange=function(e){return arguments.length?(h=e,d):h},d.yRange=function(e){return arguments.length?(p=e,d):p},d.animate=function(e){return arguments.length?(i=e,d):i},d.color=function(t){return arguments.length?(f=e.utils.getColor(t),d):f},d},e.models.sparklinePlus=function(){"use strict";function v(e){return e.each(function(c){function O(){if(a)return;var e=C.selectAll(".nv-hoverValue").data(u),r=e.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);e.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),e.attr("transform",function(e){return"translate("+s(t.x()(c[e],e))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1);if(!u.length)return;r.append("line").attr("x1",0).attr("y1",-n.top).attr("x2",0).attr("y2",b),r.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-n.top).attr("text-anchor","end").attr("dy",".9em"),C.select(".nv-hoverValue .nv-xValue").text(f(t.x()(c[u[0]],u[0]))),r.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-n.top).attr("text-anchor","start").attr("dy",".9em"),C.select(".nv-hoverValue .nv-yValue").text(l(t.y()(c[u[0]],u[0])))}function M(){function r(e,n){var r=Math.abs(t.x()(e[0],0)-n),i=0;for(var s=0;s2){var h=M.yScale().invert(i.mouseY),p=Infinity,d=null;c.forEach(function(e,t){h=Math.abs(h);var n=Math.abs(e.stackedValue.y0),r=Math.abs(e.stackedValue.y);if(h>=n&&h<=r+n){d=t;return}}),d!=null&&(c[d].highlight=!0)}var v=n.tickFormat()(M.x()(s,a)),m=t.style()=="expand"?function(e,t){return d3.format(".1%")(e)}:function(e,t){return r.tickFormat()(e)};o.tooltip.position({left:f+u.left,top:i.mouseY+u.top}).chartContainer(D.parentNode).enabled(g).valueFormatter(m).data({value:v,series:c})(),o.renderGuideLine(f)}),o.dispatch.on("elementMouseout",function(e){N.tooltipHide(),t.clearHighlights()}),N.on("tooltipShow",function(e){g&&O(e,D.parentNode)}),N.on("changeState",function(e){typeof e.disabled!="undefined"&&y.length===e.disabled.length&&(y.forEach(function(t,n){t.disabled=e.disabled[n]}),S.disabled=e.disabled),typeof e.style!="undefined"&&t.style(e.style),M.update()})}),M}var t=e.models.stackedArea(),n=e.models.axis(),r=e.models.axis(),i=e.models.legend(),s=e.models.legend(),o=e.interactiveGuideline(),u={top:30,right:25,bottom:50,left:60},a=null,f=null,l=e.utils.defaultColor(),c=!0,h=!0,p=!0,d=!0,v=!1,m=!1,g=!0,y=function(e,t,n,r,i){return"

    "+e+"

    "+"

    "+n+" on "+t+"

    "},b,w,E=d3.format(",.2f"),S={style:t.style()},x=null,T="No Data Available.",N=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState"),C=250,k=["Stacked","Stream","Expanded"],L={},A=250;n.orient("bottom").tickPadding(7),r.orient(v?"right":"left"),s.updateState(!1);var O=function(i,s){var o=i.pos[0]+(s.offsetLeft||0),u=i.pos[1]+(s.offsetTop||0),a=n.tickFormat()(t.x()(i.point,i.pointIndex)),f=r.tickFormat()(t.y()(i.point,i.pointIndex)),l=y(i.series.key,a,f,i,M);e.tooltip.show([o,u],l,i.value<0?"n":"s",null,s)};return t.dispatch.on("tooltipShow",function(e){e.pos=[e.pos[0]+u.left,e.pos[1]+u.top],N.tooltipShow(e)}),t.dispatch.on("tooltipHide",function(e){N.tooltipHide(e)}),N.on("tooltipHide",function(){g&&e.tooltip.cleanup()}),M.dispatch=N,M.stacked=t,M.legend=i,M.controls=s,M.xAxis=n,M.yAxis=r,M.interactiveLayer=o,d3.rebind(M,t,"x","y","size","xScale","yScale","xDomain","yDomain","xRange","yRange","sizeDomain","interactive","useVoronoi","offset","order","style","clipEdge","forceX","forceY","forceSize","interpolate"),M.options=e.utils.optionsFunc.bind(M),M.margin=function(e){return arguments.length?(u.top=typeof e.top!="undefined"?e.top:u.top,u.right=typeof e.right!="undefined"?e.right:u.right,u.bottom=typeof e.bottom!="undefined"?e.bottom:u.bottom,u.left=typeof e.left!="undefined"?e.left:u.left,M):u},M.width=function(e){return arguments.length?(a=e,M):a},M.height=function(e){return arguments.length?(f=e,M):f},M.color=function(n){return arguments.length?(l=e.utils.getColor(n),i.color(l),t.color(l),M):l},M.showControls=function(e){return arguments.length?(c=e,M):c},M.showLegend=function(e){return arguments.length?(h=e,M):h},M.showXAxis=function(e){return arguments.length?(p=e,M):p},M.showYAxis=function(e){return arguments.length?(d=e,M):d},M.rightAlignYAxis=function(e){return arguments.length?(v=e,r.orient(e?"right":"left"),M):v},M.useInteractiveGuideline=function(e){return arguments.length?(m=e,e===!0&&(M.interactive(!1),M.useVoronoi(!1)),M):m},M.tooltip=function(e){return arguments.length?(y=e,M):y},M.tooltips=function(e){return arguments.length?(g=e,M):g},M.tooltipContent=function(e){return arguments.length?(y=e,M):y},M.state=function(e){return arguments.length?(S=e,M):S},M.defaultState=function(e){return arguments.length?(x=e,M):x},M.noData=function(e){return arguments.length?(T=e,M):T},M.transitionDuration=function(e){return arguments.length?(A=e,M):A},M.controlsData=function(e){return arguments.length?(k=e,M):k},M.controlLabels=function(e){return arguments.length?typeof e!="object"?L:(L=e,M):L},r.setTickFormat=r.tickFormat,r.tickFormat=function(e){return arguments.length?(E=e,r):E},M}})();!function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(n){return aa+n in this}function o(n){return n=aa+n,n in this&&delete this[n]}function a(){var n=[];return this.forEach(function(t){n.push(t)}),n}function c(){var n=0;for(var t in this)t.charCodeAt(0)===ca&&++n;return n}function s(){for(var n in this)if(n.charCodeAt(0)===ca)return!1;return!0}function l(){}function f(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function h(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=sa.length;r>e;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Mt(u[0]),Mt(u[1]),Mt(u[2]))}return(i=Va.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function zt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){if(m&&n%1)return"";var e=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var u=Xo.formatPrefix(n,h);n=u.scale(n),d=u.symbol}else n*=p;n=g(n,h);var c=n.lastIndexOf("."),x=0>c?n:n.substring(0,c),M=0>c?"":t+n.substring(c+1);!s&&f&&(x=i(x));var _=v.length+x.length+M.length+(y?0:e.length),b=l>_?new Array(_=l-_+1).join(r):"";return y&&(x=i(b+x)),e+=v,n=x+M,("<"===o?e+n+b:">"===o?b+e+n:"^"===o?b.substring(0,_>>=1)+e+n+b.substring(_):e+(y?n:b+n))+d}}}function qt(n){return n+""}function Tt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=Tt;var r=new Tt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=Tt;var r=new Tt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=Tt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=Tt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++ea;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=oa(_)>Sa,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?ka:-ka):_,b^h>=e^m>=e){var S=fe(se(f),se(n));pe(S);var k=fe(u,S);pe(k);var E=(b^_>=0?-1:1)*X(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function ze(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Te(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)0?0:3:oa(r[0]-e)0?2:1:oa(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),zc>t&&(zc=t),t>Tc&&(Tc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)i||oa((y*L+x*z)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b -},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function zr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];zr(n);for(var c=i;c.circle&&oa(e-c.circle.x)l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function Tr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)Aa?{x:f,y:oa(t-f)Aa?{x:oa(e-p)Aa?{x:h,y:oa(t-h)Aa?{x:oa(e-g)=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xr;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=zu(t,e),i=qu(Tu(e,t,-u))||0;t[0]*e[1]180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++ie;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++iu&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ti(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():Ti(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=Ti(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ti(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++0;h--)o.push(i(s)*h);for(s=0;o[s]c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++ae?[0/0,0/0]:[e>0?u[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++ue?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ti(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.1"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ur&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ur&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ue&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ue&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=e);)e=u=void 0;for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=e);)e=void 0;for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)r;){var i=r+u>>>1;er?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++ur){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++rr;++r)p[r]=z(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++oi;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=T.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,za=Math.SQRT2,qa=2,Ta=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(za*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(za*t+v)]}return[r+n*s,u+n*l,i*Math.exp(za*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ta*f)/(2*i*qa*h),p=(c*c-i*i-Ta*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/za;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=z.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=z.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=z.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=z.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",z=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=z.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,z,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv(" ","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;Tt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:zt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nhc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h -}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,ze,Te,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,zc,qc,Tc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=Tc=-(Lc=zc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,zc],[qc,Tc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.xm&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++fg;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++ie.dx)&&(l=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[]) -},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(zo(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=To,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=zs,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":zs,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var zs="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Ts[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),z.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),z=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?z.on("touchmove.brush",v).on("touchend.brush",y):z.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),T=+/^n/.test(k);M=[l[1-q]-L[0],f[1-T]-L[1]],L[0]=l[q],L[1]=f[T]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var Ts={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(+n,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}();/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f -}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
    a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("'); + $('body').append(iframe); + var content = iframe[0].contentDocument; + + var inputs = ''; + + inputs+=''; + inputs+=''; + inputs+=''; + inputs+=''; + + if(outputName){ + inputs+=''; + } + + var form = ''+inputs+''; + content.write(form); + $('form', content).submit(); + /* setTimeout((function(iframe) { + return function() { + iframe.remove(); + }; + })(iframe), 4000);*/ + }; + }; + + ExportImport.prototype.appelerServiceErreur = function(jqXHR){ + var messageErreur = jqXHR.responseText; + if(jqXHR.responseJSON){ + messageErreur = jqXHR.responseJSON.message_erreur; + + if(jqXHR.responseJSON.detail_message){ + $.each(jqXHR.responseJSON.detail_message, function(key, value){ + messageErreur += "
    "+value; + }); + } + } + if(jqXHR.status === 404){ + messageErreur = "Service introuvable."; + } + this.definirResultat(messageErreur); + }; + + ExportImport.prototype.traiterResultatVecteur = function(vecteur){ + vecteur.garderHistorique = true; + var occurence = vecteur.obtenirOccurences()[0]; + if(!occurence){ + return false; + } + vecteur.zoomerOccurence(occurence, this.options.zoom); + occurence.selectionner(); + if(this.options.idResultatTable){ + var nav = Aide.obtenirNavigateur(); + var panneauTable = nav.obtenirPanneauParId(this.options.idResultatTable, -1); + if(!panneauTable || !panneauTable.obtenirTypeClasse){return true}; + if (panneauTable.obtenirTypeClasse() === 'PanneauTable') { + panneauTable.ouvrirTableVecteur(vecteur); + } else if(panneauTable.obtenirTypeClasse() === 'PanneauOnglet'){ + var nouvelleTable = new PanneauTable({reductible: false, fermable: true}); + panneauTable.ajouterPanneau(nouvelleTable); + nouvelleTable.ouvrirTableVecteur(vecteur); + panneauTable.activerPanneau(nouvelleTable); + } + } + } + + ExportImport.prototype.creerVecteurRecherche = function(styles) { + var active = false; + if (!this.pineCheckbox || this.pineCheckbox.checked) { + active = true; + }; + + var visible = false; + if (this.saveCheckbox && this.saveCheckbox.checked) { + visible = true; + }; + + var vecteur = new Vecteur({active: active, visible: visible , selectionnable: false, suppressionPermise: true, titre: "Resultats Recheche " + this.options.titre + " - " + this.obtenirValeursRecherche()['RechercheTitle' + this.options.id], styles: styles}); + this.carte.gestionCouches.ajouterCouche(vecteur); + return vecteur; + }; + + /** + * Lire le résultat de la recherche + * @method + * @name Recherche#lireReponse + * @param {Objet} response Réponse de la recherche + */ + ExportImport.prototype.lireReponse = function(response) { + this.definirResultat("

    Surcharger la fonction lireReponse

    "); + }; + + ExportImport.prototype.ajouterPagination = function(nombreResultats) { + var ajoutFleche = ""; + + if (nombreResultats === (this.indexFin + 1)) { + ajoutFleche += "
    "; + ajoutFleche += ""; + + if ((this.indexDebut - (this.indexFin + 1)) < 0) { + ajoutFleche += ""; + } else { + ajoutFleche += ""; + } + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += "
    PrécédentPrécédent   Suivant
    "; + } else { + if (this.indexDebut > 0) { + ajoutFleche += "
    "; + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += ""; + ajoutFleche += "
    Précédent   Suivant
    "; + } + } + return ajoutFleche; + } + + ExportImport.prototype.initEventResultat = function() { + $(this.resultatPanneau.items.items[0].body.dom).find('#precedentRecherche') + .click($.proxy(this.appelPrecedent, this)); + $(this.resultatPanneau.items.items[0].body.dom).find('#suivantRecherche') + .click($.proxy(this.appelSuivant, this)); + $(this.resultatPanneau.items.items[0].body.dom).find('li.rechercheResultatsListe') + .click($.proxy(this.eventResultatClique, this)); + }; + + ExportImport.prototype.eventResultatClique = function(e) { + var id = $(e.target).parents('.rechercheResultatsListe').data('id'); + this.vecteur.deselectionnerTout(); + var occurence = this.vecteur.obtenirOccurenceParId(id); + if(!occurence){ + return false; + } + this.vecteur.zoomerOccurence(occurence, this.options.zoom); + occurence.selectionner(); + }; + + /** + * Préfixe de la recherche + * @method + * @name Recherche#obtenirRecherchePrefixe + * @returns {String} Préfixe + */ + ExportImport.prototype.obtenirRecherchePrefixe = function() { + return this.options.recherchePrefixe; + }; + + /** + * Type de la recherche + * @method + * @name Recherche#obtenirTypeRecherche + * @returns {String} Type de la recherche + */ + ExportImport.prototype.obtenirTypeRecherche = function() { + return this.options.typeRecherche; + }; + + /** + * Réinitialiser la recherche + * @method + * @name Recherche#reinitialiser + */ + ExportImport.prototype.reinitialiserVecteur = function() { + if(!this.vecteur){return false;} + if (!this.vecteur.options.visible) { + this.carte.gestionCouches.enleverCouche(this.vecteur); + } + }; + + /** + * Lancer la recherche. + * @method + * @name Recherche#lancerRecherche + */ + ExportImport.prototype.lancerRecherche = function(texte) { + if(texte){ + this._panel.items.get('ExportImportTitle' + this.options.id).setValue(texte); + } + if (this.aidePanneau) { + this.aidePanneau.collapse(); + }; + + //nouvelle recherche, remettre le compteur à zéro + this.indexDebut = 0; + this.exporter(); + }; + + /** + * Relancer la recherche avec une nouvelle valeur. + * @method + * @name Recherche#relancerRecherche + * @param {String} requete Nouvelle valeur pour la recherche + */ + ExportImport.prototype.relancerRecherche = function(requete) { + this.obtenirValeursRecherche()['RechercheTitle' + this.options.id] = requete; + this._panel.items.items[0].setValue(requete); + this.appelerService(); + }; + + /** + * Appeler le service pour obtenir les résultats suivants. + * @method + * @name Recherche#appelSuivant + */ + ExportImport.prototype.appelSuivant = function() { + this.indexDebut = this.indexDebut + (this.indexFin + 1); + this.appelerService(); + }; + + /** + * Appeler le service pour obtenir les résultats précédents. + * @method + * @name Recherche#appelPrecedent + */ + ExportImport.prototype.appelPrecedent = function() { + this.indexDebut = this.indexDebut - (this.indexFin + 1); + this.appelerService(); + }; + + /** + * Afficher le résultat. + * @method + * @name Recherche#definirResultat + */ + ExportImport.prototype.definirResultat = function(resultatTexte, callback, target) { + //Masquer le message d'attente + Aide.cacherMessageChargement(); + + this.resultatPanneau.show().expand(); + this.resultatPanneau.items.items[0].body.update(resultatTexte); + if (typeof callback === "function"){ + callback.call(target); + } + }; + + ExportImport.prototype.verifierParamsUrl = function(){ + var recherche = Aide.obtenirParametreURL('recherche'); + if(recherche === this.obtenirTypeRecherche()){ + var texte = Aide.obtenirParametreURL('texte'); + if(texte){ + var that=this; + var zoomP = Number(Aide.obtenirParametreURL('zoom')); + if(zoomP){ + this.options.zoom = zoomP; + } + var nav = Aide.obtenirNavigateur(); + if(nav.isReady){ + that.traiterParamsUrl(texte); + } else { + nav.ajouterDeclencheur('navigateurInit', function(){ + that.traiterParamsUrl(texte); + }); + } + } + } + }; + + ExportImport.prototype.traiterParamsUrl = function(texte){ + var that=this; + this.parent.ajouterDeclencheur('ajouterPanneau', function(e){ + if(that === e.panneau){ + e.target.enleverDeclencheur('ajouterPanneau', 'rechercheTraiterParamsURL'); + e.panneau.ajouterDeclencheur(that.obtenirTypeClasse()+'Active', function(e2){ + e2.target.enleverDeclencheur(that.obtenirTypeClasse()+'Active', 'rechercheTraiterParamsURL2'); + e2.target.lancerRecherche(texte); + }, {id: "rechercheTraiterParamsURL2"}); + e.target.activerPanneau(e.panneau); + } + }, {id: "rechercheTraiterParamsURL"}); + this.parent.ouvrir(); + }; + + /** + * Réinitialiser la recherche + * @method + * @name Recherche#reinitialiserRecherche + */ + ExportImport.prototype.reinitialiserRecherche = function(){ + this.reinitialiserVecteur(); + $.each(this._panel.items.items, function(index, item){ + if(item.xtype == "textfield" || item.xtype == "numberfield" || item.xtype == "combo"){ + item.reset(); + } + }); + + if(this.resultatPanneau.isVisible()){ + this.definirResultat(this.obtenirAideHTML()); + } + }; + + return ExportImport; + +}); + diff --git a/interfaces/navigateur/public/js/app/menu/exportImport/import.js b/interfaces/navigateur/public/js/app/menu/exportImport/import.js new file mode 100644 index 00000000..585bdf92 --- /dev/null +++ b/interfaces/navigateur/public/js/app/menu/exportImport/import.js @@ -0,0 +1,216 @@ +/** + * Module pour l'objet {@link Panneau.RechercheAdresse}. + * @module rechercheAdresse + * @author Marc-André Barbeau, MSP + * @version 1.0 + * @requires recherche + */ +define(['exportImport', 'aide', 'point', 'style', 'limites'], function(ExportImport, Aide, Point, Style, Limites) { + /** + * Création de l'object Panneau.RechercheAdresse. + * Objet à ajouter à un objet localisation. + * @constructor + * @name Panneau.RechercheAdresse + * @class Panneau.RechercheAdresse + * @alias rechercheAdresse:Panneau.RechercheAdresse + * @extends Recherche + * @requires rechercheAdresse + * @param {string} [options.titre='Adr.'] Titre du panneau. + * @returns {Panneau.RechercheAdresse} Instance de {@link Panneau.RechercheAdresse} + */ + function Import(options){ + this.options = options || {}; + this.defautOptions = $.extend({}, this.defautOptions, { + typeRecherche:"import", + titre:"Import" + }); + }; + + Import.prototype = new ExportImport(); + Import.prototype.constructor = Import; + + /** + * Initialisation de l'object recherche. + * @method + * @name Recherche#_init + */ + Import.prototype._init = function() { + var that = this; + + this.items.push(this.obtenirItemsForm()); + + this._panel = new Ext.FormPanel({ + title: this.obtenirTitre() , + id: this.options.id, + hideLabel: true, + frame: true, + border: false, + bodyStyle: 'padding:0px 17px 0 0px; overflow-y: auto;', + scope: this, + items: this.items, + //height:'fit', + hidden: false, + //autoScroll: true, + buttons: this.obtenirBoutonLancer(), + listeners: { + afterrender: function(e) { + that.callbackCreation(); + }, + activate: function(e){ + that.declencher({type: that.obtenirTypeClasse()+'Active'}); + } + } + }); + }; + + + /** + * Obtenir l'aide en format HTML + * @method + * @name RechercheAdresse#obtenirAideHTML + * @returns {String} Aide + */ + Import.prototype.obtenirItemsForm = function() { + + var szDefaultOutputFormat = this.oOutputInputFormatStore.data.items[0].data.value; + var oOutputFormatComboBox = new Ext.form.ComboBox({ + id : 'importOutputFormat', + fieldLabel: 'Format Input', + store: this.oOutputInputFormatStore, + valueField: 'value', + value: szDefaultOutputFormat, + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 150, + submitValue: false + }); + + return [oOutputFormatComboBox]; + }; + + /** + * Obtenir l'aide en format HTML + * @method + * @name RechercheAdresse#obtenirAideHTML + * @returns {String} Aide + */ + Import.prototype.obtenirAideHTML = function() { + return "Ex:
    "+ + "->no. immeuble et nom de rue
    "+ + "->no. immeuble et nom de rue et ville
    "+ + "->nom de rue et ville
    "+ + "->nom de rue + nom de rue, ville (intersection)
    " + + this.obtenirLienPDF() + + this.obtenirCopyright(); + }; + + /** + * Obtenir le droit d'auteur en format HTML + * @method + * @name RechercheAdresse#obtenirCopyright + * @returns {String} Droit d'auteur + */ + Import.prototype.obtenirCopyright = function() { + return ""+ + "\"Adresse"; + }; + + + Import.prototype.lireReponse = function(data, textStatus, jqXHR) { + if(!jqXHR.responseJSON){ + this.definirResultat('Erreur lors de la recherche.'); + return false; + } + + var responseJSON = jqXHR.responseJSON; + + var style = new Style({ + visible: true, + icone: Aide.utiliserBaseUri('images/marqueur/marker-orange.png'), + iconeHauteur: 34, + iconeLargeur: 20, + iconeOffsetX: -10, + iconeOffsetY: -34, + filtres: [ { + filtre: "[geocodeMatchCode]>0", + style: {icone: Aide.utiliserBaseUri('images/marqueur/marker-yellow.png')} + }, { + filtre: "[geocodeMatchCode]==100", + style: {icone: Aide.utiliserBaseUri('images/marqueur/marker-green.png')} + }, { + style: {} + } + ] + }); + + var styles = {defaut: {visible: false}, select: style}; + + var vecteur = this.creerVecteurRecherche(styles); + $.each(responseJSON.geocoderReponseListe, function(key, value) { + var point; + if (!value.localisation) { + return true; + } + if (!value.localisation.point.x || !value.localisation.point.y) { + var x = Number(value.localisation.enveloppe.Xmin) + ((Number(value.localisation.enveloppe.Xmax)-Number(value.localisation.enveloppe.Xmin))/2); + var y = Number(value.localisation.enveloppe.Ymin) + ((Number(value.localisation.enveloppe.Ymax)-Number(value.localisation.enveloppe.Ymin))/2); + point = new Point(x, y); + point.limites = new Limites(value.localisation.enveloppe.Xmin, value.localisation.enveloppe.Ymin, value.localisation.enveloppe.Xmax, value.localisation.enveloppe.Ymax); + } else { + point = new Point(value.localisation.point.x, value.localisation.point.y); + } + vecteur.creerOccurence(point, value); + }); + + vecteur.templates.table = { + colonnes: [{ + utiliserBase: false, + titre: 'id', + triable: true, + propriete: 'id' + }, { + titre: 'Adresse', + triable: true, + propriete: 'adresseLibre' + }] + }; + + this.traiterResultatVecteur(vecteur, responseJSON.nombreResultat); + }; + + Import.prototype.traiterResultatVecteur = function(vecteur, nombreResultats) { + nombreResultats = nombreResultats || vecteur.listeOccurences.length ; + + var resultat = this.ajouterPagination(nombreResultats); + var debut = this.indexDebut+1; + var fin = this.indexDebut+vecteur.listeOccurences.length; + if(fin === 0){ + this.definirResultat('Aucun résultat'); + return false; + } + resultat += "

    Résultats (" + debut + " - " + fin + ")

    "; + $.each(vecteur.listeOccurences, function(row, occurence) { + var title = occurence.proprietes.statut.description || ''; + if(occurence.proprietes.statut.commentaire){ + title += '\nCommentaire: ' + occurence.proprietes.statut.commentaire; + } + var couleur = 'blue'; + if(occurence.proprietes.statut.etat && occurence.proprietes.statut.etat !== 'Officiel'){ + couleur = '#ff7200'; + } + resultat += "
  • » " + + occurence.obtenirPropriete("adresseLibre")+"
  • "; + }); + this.vecteur = vecteur; + this.definirResultat(resultat, this.initEventResultat, this); + ExportImport.prototype.traiterResultatVecteur.call(this, vecteur); + }; + + return Import; + +}); \ No newline at end of file diff --git a/interfaces/navigateur/public/js/app/occurence/occurence.js b/interfaces/navigateur/public/js/app/occurence/occurence.js index 32765ab5..0600351b 100644 --- a/interfaces/navigateur/public/js/app/occurence/occurence.js +++ b/interfaces/navigateur/public/js/app/occurence/occurence.js @@ -26,6 +26,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi * @param {Geometrie|Openlayers.Geometry} geometrie Géométrie de l'occurence * @param {Dictionnaire} [proprietes] Propriétés de l'occurence * @param {Style} [style] Style de l'occurence + * @param {Objet} [opt] Option de l'occurence * @property {String} type Type de géométrie * @property {String} id id de l'occurence * @property {Dictionnaire} proprietes Propriétés de l'occurence @@ -49,9 +50,11 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi geometrie = vectorOL.geometry; } } + + var typeGeometrie = opt.typeGeometrie?opt.typeGeometrie:null; this.styles = {}; - this._definirGeometrie(geometrie); + this._definirGeometrie(geometrie,typeGeometrie); this.definirProprietes(proprietes); this.accepterModifications(); @@ -188,7 +191,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi if (proprietes && !$.isPlainObject(proprietes)) { throw new Error("Occurence.definirProprietes : Paramètre invalide"); } - + if (!this.proprietesOriginales) { this.modifiee = true; this.proprietesOriginales = $.extend(true, {}, this.obtenirProprietes()); @@ -243,7 +246,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi Occurence.prototype.definirPropriete = function(propriete, valeur) { if (typeof propriete !== 'string') { throw new Error("Occurence.definirPropriete : Nom de la propriété invalide"); - } + } var obj = this._feature.attributes; if (propriete[0] === '/') { propriete = propriete.substr(1); @@ -370,7 +373,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi if (typeof regle !== 'string') { throw new Error("Occurence.definirStyle : Règle du style invalide"); } - + if (style && style.obtenirTypeClasse && style.obtenirTypeClasse() === 'Style') { this.styles[regle] = style.cloner(); this.styles[regle].parent = this; @@ -395,7 +398,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi */ Occurence.prototype.appliquerStyle = function(regle, survol) { regle = regle || 'defaut'; - + if (typeof regle !== 'string') { throw new Error("Occurence.appliquerStyle : Règle du style invalide"); } else if (regle === 'courant') { @@ -421,7 +424,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi this._feature.style = this.styles[regle]._getStyleOptionsOL(); this._feature.renderIntent = undefined; } - + this.rafraichir(); }; @@ -520,7 +523,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi throw new Error("Occurence.definirProprieteStyle : Nom de la propriété invalide"); } regle = regle || 'courant'; - regle = regle == 'courant' ? this.regleCourant : regle; + regle = regle == 'courant' ? this.regleCourant : regle; if (this.obtenirStyle(regle)) { this.obtenirStyle(regle).definirPropriete(nom, valeur); } else if (this.obtenirStyle(regle, true, true)) { @@ -561,15 +564,18 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi * @param {boolean} tousLesStyles Cacher l'occurence pour tous les styles ou seulement le style courant */ Occurence.prototype.cacher = function(tousLesStyles) { - this.definirProprieteStyle('visible', 'none'); - if (this.vecteur) { - this.vecteur.carte.gestionCouches.enleverOccurenceSurvol(this); - } - this.rafraichir(); - if (tousLesStyles) { - //todo: faire une boucle sur tous les styles - this.definirProprieteStyle('visible', 'none', 'defaut'); - this.definirProprieteStyle('visible', 'none', 'select'); + + if(this.estAffichee()){ + this.definirProprieteStyle('visible', 'none', undefined); + if (this.vecteur) { + this.vecteur.carte.gestionCouches.enleverOccurenceSurvol(this); + } + + if (tousLesStyles) { + //todo: faire une boucle sur tous les styles + this.definirProprieteStyle('visible', 'none', 'defaut'); + this.definirProprieteStyle('visible', 'none', 'select'); + } } }; @@ -580,12 +586,15 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi * @param {boolean} tousLesStyles Afficher l'occurence pour tous les styles ou seulement le style courant */ Occurence.prototype.afficher = function(tousLesStyles) { - this.definirProprieteStyle('visible', undefined); - this.rafraichir(); - if (tousLesStyles) { - //todo: faire une boucle sur tous les styles - this.definirProprieteStyle('visible', undefined, 'defaut'); - this.definirProprieteStyle('visible', undefined, 'select'); + + if(!this.estAffichee()){ + this.definirProprieteStyle('visible', undefined, undefined); + + if (tousLesStyles) { + //todo: faire une boucle sur tous les styles + this.definirProprieteStyle('visible', undefined, 'defaut'); + this.definirProprieteStyle('visible', undefined, 'select'); + } } }; @@ -669,11 +678,11 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi * @param {Geometrie|Openlayers.Geometry} geometrie Géométrie de l'occurence * @throws Occurence._definirGeometrie : La géométrie est invalide **/ - Occurence.prototype._definirGeometrie = function(geometrie) { + Occurence.prototype._definirGeometrie = function(geometrie, typeGeometrie) { var proprietes = this.obtenirProprietes(); delete this._feature; delete this.x; - delete this.x; + delete this.y; delete this.points; delete this.lignes; delete this.polygones; @@ -684,7 +693,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi if (!geometrie) { this._feature = new OpenLayers.Feature.Vector(); - this.type = undefined; + this.type = typeGeometrie; } else if (geometrie.CLASS_NAME !== undefined) { if (geometrie.CLASS_NAME === "OpenLayers.Feature.Vector") { this._feature = geometrie; @@ -746,19 +755,24 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi * @returns {Geometrie} Géométrie de l'occurence */ Occurence.prototype._obtenirGeometrie = function() { - switch (this.obtenirTypeGeometrie()) { - case "Point": - return new Point(this.x, this.y, this.obtenirProjection()); - case "Ligne": - return new Ligne(this.points, this.obtenirProjection()); - case "Polygone": - return new Polygone(this.lignes, this.obtenirProjection()); - case "MultiPolygone": - return new MultiPolygone(this.polygones, this.obtenirProjection()); - case "Limites": - return new Limites(this.gauche, this.bas, this.droite, this.haut); - default: - return undefined; + if(this.x && this.y){ + switch (this.obtenirTypeGeometrie()) { + case "Point": + return new Point(this.x, this.y, this.obtenirProjection()); + case "Ligne": + return new Ligne(this.points, this.obtenirProjection()); + case "Polygone": + return new Polygone(this.lignes, this.obtenirProjection()); + case "MultiPolygone": + return new MultiPolygone(this.polygones, this.obtenirProjection()); + case "Limites": + return new Limites(this.gauche, this.bas, this.droite, this.haut); + default: + return undefined; + } + } + else{ + return undefined; } }; diff --git a/interfaces/navigateur/public/js/app/occurence/style.js b/interfaces/navigateur/public/js/app/occurence/style.js index ca8203e2..80fa62ad 100644 --- a/interfaces/navigateur/public/js/app/occurence/style.js +++ b/interfaces/navigateur/public/js/app/occurence/style.js @@ -5,7 +5,7 @@ * @version 1.0 */ -define(['evenement', 'fonctions', 'libs/extension/OpenLayers/FilterClone'], function(Evenement, Fonctions) { +define(['evenement', 'fonctions', 'aide', 'libs/extension/OpenLayers/FilterClone'], function(Evenement, Fonctions, Aide) { /** * Création de l'object Geometrie.Style. * @constructor @@ -120,7 +120,7 @@ define(['evenement', 'fonctions', 'libs/extension/OpenLayers/FilterClone'], func return valeur; } if(propriete === "visible"){ - return valeur === false ? "none": ''; + return Aide.toBoolean(valeur) === false ? "none": ''; } return valeur; @@ -183,7 +183,7 @@ define(['evenement', 'fonctions', 'libs/extension/OpenLayers/FilterClone'], func } else { this.propriete[nom] = valeur; } - + if (this.parent){ var nomOL = this._lookupOptionsOL[nom]; var vTemp = this._traiterValeurIGO(nom, valeur); @@ -192,7 +192,7 @@ define(['evenement', 'fonctions', 'libs/extension/OpenLayers/FilterClone'], func this.parent._layer.styleMap.styles['default'].defaultStyle[nomOL] = vTemp; }; this.parent._layer.styleMap.styles[this.regle].defaultStyle[nomOL] = vTemp; - this.parent.rafraichir(); + this.parent.rafraichir(); } else if (this.parent.obtenirTypeClasse() === 'Occurence'){ if(!this.parent._feature.style){ this.parent._feature.style = {}; @@ -205,7 +205,7 @@ define(['evenement', 'fonctions', 'libs/extension/OpenLayers/FilterClone'], func if($.isEmptyObject(this.propriete)){ this.parent._feature.style = undefined; } - this.parent.rafraichir(); + this.parent.rafraichir(); } } }; diff --git a/interfaces/navigateur/public/js/app/outil/outilSaaq.js b/interfaces/navigateur/public/js/app/outil/outilSaaq.js new file mode 100644 index 00000000..1afe8d7e --- /dev/null +++ b/interfaces/navigateur/public/js/app/outil/outilSaaq.js @@ -0,0 +1,573 @@ +//require: extjs, carte.js, message.js, point.js, limite.js + +define(['outil', 'point', 'occurence', 'style', 'aide', 'vecteur', 'browserDetect'], function(Outil, Point, Occurence, Style, Aide, Vecteur, BrowserDetect) { + function OutilSaaq(options){ + this.options = options || {}; + this.defautOptions = $.extend({}, this.defautOptions, { + id:'saaqOutil', + icone: Aide.utiliserBaseUri('images/toolbar/localisateur.png'), + infobulle: 'Positionner un véhicule', + service: Aide.utiliserBaseUri('../services/saaq/getVehicules.php'), + serviceGLO: undefined + }); + }; + + OutilSaaq.prototype = new Outil(); + OutilSaaq.prototype.constructor = OutilSaaq; + + OutilSaaq.prototype._init = function(){ + Outil.prototype._init.call(this); + this.executer(); + }; + + OutilSaaq.prototype.creerFormWindow = function(){ + var comboBox; + var that = this; + +// this.store = new Ext.data.JsonStore({ +// url: Aide.utiliserProxy(this.options.service), +// root:'resultat', +// fields:['nommobile'], +// sortInfo: { field: 'nommobile', direction: 'ASC'}, +// autoLoad:true +// }); + + comboBox = new Ext.form.TextField({ //ComboBox + id:'combo_'+id, + name:'combo', + fieldLabel: 'Modem', + allowBlank:false, + emptyText:'Entrer le modem', + //store: this.store, + displayField:'nommobile', + valueField:'nommobile', + forceSelection:false, + mode:'local', + selectOnFocus:true, + width:250, + scope:this, + listeners: { + specialkey: function(field, e){ + if (e.getKey() == e.ENTER) { + that.submitForm(comboBox); + } + } + } + }); + + //this.store.on('exception', this.gestionErreurStore); + + var button_ok = new Ext.Button({ + id:'button_ok'+id, + type:'button', + width:50, + text:'Afficher', + scope:this, + handler: function(){this.submitForm(comboBox);} + }); + + var button_newPosition = new Ext.Button({ + id:'button_newPosition'+id, + type:'button', + width:50, + text:'Demander une nouvelle position', + scope:this, + handler: function(){this.demanderNouvellePosition(comboBox, 'nouvelle');} + }); + + var panneau = new Ext.form.FormPanel({ + id:'form_recherche_'+id, + padding:'5 5 5 5', + frame:true, + autoWidth:true, + width:'auto', + labelAlign:'top', + items:[comboBox], + buttons:[button_newPosition, button_ok] + }); + + this.window_recherche = new Ext.Window({ + title:'Afficher un véhicule SAAQ', + width:300, + closeAction:'hide', + resizable:true, + minimizable:false, + plain:true, + bodyStyle:'padding5px', + items:[panneau] + }); + }; + + + OutilSaaq.prototype.executer = function () { + if(!this.window_recherche){ + this.creerFormWindow(); + } else { + //this.store.reload(); + } + this.window_recherche.show(); + }; + + + OutilSaaq.prototype.demanderNouvellePosition = function(comboBox, rechercheNouvelle) { + var code = comboBox.getValue().toUpperCase(); + if(code === ""){ + var message = "Le nom du modem est obligatoire"; + comboBox.markInvalid(message); + Aide.afficherMessage({titre: 'Avertissement', message: message}); + return false; + } else if(code.indexOf(' ') !== -1){ + var message = "Le nom du modem ne doit pas avoir d'espace"; + comboBox.markInvalid(message); + Aide.afficherMessage({titre: 'Avertissement', message: message}); + return false; + }; + var that = this; + if(code){ + that._cancelDemande = false; + Aide.afficherMessageChargement({ + message: 'Demande en cours, elle peut durer plusieurs minutes, veuiller patientez...', + boutons: {cancel:'Annuler la demande'}, + callback: function(bouton){ + if(bouton == 'cancel'){ + clearTimeout(that.timer); + that.nouvellePositionRequete(code, 'annuler'); + } + } + }); + /* var date = new Date(); + var year = date.getFullYear(); + var month = parseInt(date.getMonth())+1; + month = month > 9 ? month : '0'+month; + var day = date.getDate() > 9 ? date.getDate() : '0'+date.getDate(); + var dateString = year + '-' + month + '-' + day + ' ' + date.toLocaleTimeString();*/ + + this.nouvellePositionRequete(code, rechercheNouvelle); + this.cacherForm(); + comboBox.setValue(""); + comboBox.clearInvalid(); + } + }; + + + OutilSaaq.prototype.nouvellePositionRequete = function(code, rechercheNouvelle){ + $.ajax({ + url: Aide.utiliserProxy(this.options.service), + data: { + nom: code, + recherche: rechercheNouvelle + }, + cache: false, + async:false, + context:this, + success: function(data){this.nouvellePosition(data, code)}, + dataType:'json', + error:function(){ Aide.afficherMessage({titre: 'Avertissement', message: 'Une erreur est survenue durant la demande d\'une nouvelle position'});} + }); + } + + OutilSaaq.prototype.nouvellePosition = function(data, code) { + var that = this; + if(data.etat.code == 1 || data.etat.code == 2){ + var messageAttente = "Demande en cours"; + if(data.etat.positionListeAttente && data.etat.positionListeAttente !== 1){ + messageAttente = "Position dans la liste d'attente: "+data.etat.positionListeAttente; + } + Ext.MessageBox.updateProgress(undefined, messageAttente); + that.timer = setTimeout(function(){ + that.nouvellePositionRequete(code, 'attendre'); + }, 5000); + return true; + } else if(data.etat.code !== 0 && data.etat.code !== 3){ + var message = data.etat.code; + var messageCode = data.etat.code.trim(" "); + if(messageCode == "ERR01006"){ + message = "Nom du modem ("+data.etat.mobile+") invalide"; + } else if(messageCode == "ERR01012"){ + message = "Le serveur LAV ne répond pas"; + } else if(messageCode == "ERR01014"){ + message = "Modem '"+data.etat.mobile+"' inexistant"; + } else if(messageCode == "ERR01016"){ + message = "Demande de géoposition déjà en cours"; + } else if(messageCode == "NON-DISPONIBLE"){ + message = "Demande de nouvelle position non-disponible pour le modem '"+data.etat.mobile+"'"; + } else if(messageCode == "Expiration RAFMOB"){ + message = "Délai de réponse expiré pour le modem '"+data.etat.mobile+"'"; + } + Aide.afficherMessage({titre: 'Avertissement', message: data.etat.code + ": " + message}); + } else { + Aide.cacherMessageChargement(); + } + if(data.resultat.length !== 0){ + that.afficherVehicule(data); + } + + }; + + OutilSaaq.prototype.submitForm = function(comboBox) { + var code = comboBox.getValue().toUpperCase(); + if(code === ""){ + var message = "Le nom du modem est obligatoire"; + comboBox.markInvalid(message); + Aide.afficherMessage({titre: 'Avertissement', message: message}); + return false; + } else if(code.indexOf(' ') !== -1){ + var message = "Le nom du modem ne doit pas avoir d'espace"; + comboBox.markInvalid(message); + Aide.afficherMessage({titre: 'Avertissement', message: message}); + return false; + }; + if(code){ + $.ajax({ + url: Aide.utiliserProxy(this.options.service), + data: { + nom: code + }, + cache: false, + async:false, + context:this, + success:this.afficherVehicule, + dataType:'json', + error:function(){ Aide.afficherMessage({titre: 'Avertissement', message: 'Impossible d\'obtenir les positions du modem'});} + }); + + this.cacherForm(); + comboBox.setValue(""); + comboBox.clearInvalid(); + } + }; + + + OutilSaaq.prototype.cacherForm = function() { + this.window_recherche.hide(); + }; + + OutilSaaq.prototype.creerCouche = function() { + var style=new Style({ + etiquette: '${ordre}' /*'${heure}:${minute}'*/, + icone: Aide.utiliserBaseUri('images/marqueur/fleche-bleue.svg'), + iconeHauteur:32, + iconeLargeur:32, + rotation:"${direction}", + etiquetteCouleur:'#2291E1', + etiquetteOffsetY: '15' , + filtres: [{ + titre:'Dernière position', + filtre: "[ordre]==1", + style: { + icone: Aide.utiliserBaseUri('images/marqueur/fleche-rouge.svg'), + etiquetteCouleur: 'red' + } + }, + { + titre: 'Autre', + style:{} + } + ] + + }); + + if(BrowserDetect.browser === 'Explorer' && BrowserDetect.version < 9){ + style=new Style({ + etiquette: '${ordre}' /*'${heure}:${minute}'*/, + etiquetteCouleur:'#2291E1', + etiquetteOffsetY: '15' , + couleur: '#2291E1', + filtres: [{ + titre:'Dernière position', + filtre: "[ordre]==1", + style: { + couleur: 'red', + etiquetteCouleur: 'red' + } + }, + { + titre: 'Autre', + style:{} + } + ] + + }); + } + + + this.vecteurSaaq = new Vecteur({titre: 'Saaq-Vehicule', active: true, styles: style}); + this.carte.gestionCouches.ajouterCouche(this.vecteurSaaq); + this.initEvenementCouche(); + + this.creerWindowInfo(); + }; + + OutilSaaq.prototype.creerWindowInfo = function(){ + var that=this; + var id = Aide.obtenirNavigateur().obtenirPanneauxParType('PanneauCarte')[0].obtenirId(); + var $carte = $("#"+id); + this.windowInfoLeft = $carte.position().left + $carte.width() - 230 - 5; + this.windowInfoTop = $carte.position().top + $carte.height() - 5; + + this.windowInfo = new Ext.Window({ + id: 'saaqWindowInfo', + title: 'Saaq', + width: 230, + //height: 114, + x: that.windowInfoLeft, + y: that.windowInfoTop, + closeAction: 'hide', + minimizable: false, + resizable: false, + autoHeight: true, + plain:true, + bodyStyle:'padding:5px;', + html: 'Aucune Info' + }); + + } + + OutilSaaq.prototype.initEvenementCouche = function() { + //this.vecteurSaaq.ajouterDeclencheur('occurenceSurvol', this.occurenceSaaqSurvol, {scope: this}); + //this.vecteurSaaq.ajouterDeclencheur('occurenceSurvolFin', this.occurenceSaaqSurvolFin, {scope: this}); + this.vecteurSaaq.ajouterDeclencheur('occurenceClique', this.occurenceSaaqClique, {scope: this}); + }; + + OutilSaaq.prototype.occurenceSaaqSurvol = function(e) { + var p = e.occurence.obtenirProprietes(); + var jour = p.jour.length == 1 ? '0' + p.jour : p.jour; + var mois = p.mois.length == 1 ? '0' + p.mois : p.mois; + var minute = p.minute.length == 1 ? '0' + p.minute : p.minute; + var seconde = p.seconde.length == 1 ? '0' + p.seconde : p.seconde; + var html = ''; + html += "

    "+p.nommobile+"

    "; + html += "

    Date: "+jour+"/"+mois+"/"+p.annee+"

    "; + html += "

    Heure: "+p.heure+":"+minute+":"+seconde+"

    "; + + e.occurence.ouvrirInfobulle({html: html, aFermerBouton: false}); + }; + + OutilSaaq.prototype.occurenceSaaqSurvolFin = function(e) { + e.occurence.fermerInfobulle(); + }; + + OutilSaaq.prototype.occurenceSaaqClique = function(e) { + var that = e.options.scope; + + var p = e.occurence.obtenirProprietes(); + + if(!p.geocodage){ + that.obtenirAdresse(p.lon+" "+p.lat, e.occurence); + } else { + that.ouvrirInfoWindow(p); + } + }; + + OutilSaaq.prototype.ouvrirInfoWindow = function(p) { + var html = ''; + var titre; + var jour = p.jour.length == 1 ? '0' + p.jour : p.jour; + var mois = p.mois.length == 1 ? '0' + p.mois : p.mois; + var minute = p.minute.length == 1 ? '0' + p.minute : p.minute; + var seconde = p.seconde.length == 1 ? '0' + p.seconde : p.seconde; + var direction; + if(p.direction >= 22.5 && p.direction < 67.5) { + direction = "Nord-Est"; + } else if(p.direction >= 67.5 && p.direction < 112.5) { + direction = "Est"; + } else if(p.direction >= 112.5 && p.direction < 157.5) { + direction = "Sud-Est"; + } else if(p.direction >= 157.5 && p.direction < 202.5) { + direction = "Sud"; + } else if(p.direction >= 202.5 && p.direction < 247.5) { + direction = "Sud-Ouest"; + } else if(p.direction >= 247.5 && p.direction < 292.5) { + direction = "Ouest"; + } else if(p.direction >= 292.5 && p.direction < 337.5) { + direction = "Nord-Ouest"; + } else { + direction = "Nord"; + } + + html = ''; + html += "

    Date: "+jour+"/"+mois+"/"+p.annee+"

    "; + html += "

    Heure: "+p.heure+":"+minute+":"+seconde+"

    "; + html += "

    Position: "+p.lon.substr(0,8)+", "+p.lat.substr(0,7)+"

    "; + html += "

    Vitesse: "+p.vitesse.split('.')[0]+" km/h

    "; + html += "

    Direction: "+direction+"

    "; + html += "

    No. secteur: "+p.secteur_geo+"

    "; + //html += "

    Géocodage: "+"Obtenir"+"

    "; + html += "
    "; + + var noCiviq, nomRue, ville, codePostal; + noCiviq = nomRue = ville = codePostal = 'Chargement...'; + var titreAdresse = '

    Adresse

    '; + if(p.geocodage){ + if (p.geocodage === 'Indisponible'){ + noCiviq = nomRue = ville = codePostal = 'GLO est indisponible'; + } else if(p.geocodage.distance > 200) { + noCiviq = nomRue = ville = codePostal = 'Inconnu'; + } else { + noCiviq = p.geocodage.noCiviq; + nomRue = p.geocodage.nomRue; + ville = p.geocodage.placeListe[0].nom; + codePostal = p.geocodage.CP.codePostal; + if(p.geocodage.distance > 100){ + titreAdresse = "

    Adresse approximative

    "; + noCiviq = '' + noCiviq + ''; + nomRue = '' + nomRue + ''; + ville = '' + ville + ''; + codePostal = '' + codePostal + ''; + }; + } + } + html += "

    "+titreAdresse+"

    "; + html += "

    No.: "+noCiviq+"

    "; + html += "

    Rue: "+nomRue+"

    "; + html += "

    Ville: "+ville+"

    "; + html += "

    Code Postal: "+codePostal+"

    "; + + var value1, value2, value3, value4, titreInfo, label1, label2, label3, label4; + if (p.repere_distance) { + titreInfo = '

    Repère

    '; + label1 = 'No. Route: '; + label2 = 'Route: '; + label3 = 'Km: '; + label4 = 'Municipalité: '; + value1 = p.repere_noroute.substr(p.repere_noroute.search(/[1-9]/)); + value2 = p.repere_nomroute; + value3 = p.repere_affiche_km; + value4 = p.repere_municipalite; + html += "
    "; + html += "

    "+titreInfo+"

    "; + html += "

    "+label1+value1+"

    "; + html += "

    "+label2+value2+"

    "; + html += "

    "+label3+value3+"

    "; + html += "

    "+label4+value4+"

    "; + } + if (p.sortie_distance) { + titreInfo = '

    Sortie

    '; + label1 = 'No. Route: '; + label2 = 'No. Sortie: '; + label3 = 'Panneau: '; + label4 = 'Muncipalite: '; + value1 = p.sortie_noroute.substr(p.sortie_noroute.search(/[1-9]/)); + value2 = p.sortie_no; + value3 = p.sortie_message_pan; + value4 = p.sortie_municipalite; + html += "
    "; + html += "

    "+titreInfo+"

    "; + html += "

    "+label1+value1+"

    "; + html += "

    "+label2+value2+"

    "; + //html += "

    "+label3+value3+"

    "; + html += "

    "+label4+value4+"

    "; + } + + titre = p.nommobile; + + var windowConstruit = false; + if(this.windowInfo.body){ + this.windowInfo.body.update(html); + this.windowInfo.setTitle(titre); + windowConstruit = true; + } else { + this.windowInfo.html = html; + this.windowInfo.title = titre; + //this.windowInfo.show(); + //$('#saaqWindowInfo').on('click', '.saaqGeocodageLink', function(e){console.log(e); return false}); + } + var left, top; + if(this.windowInfo.isVisible() && windowConstruit){ + left = this.windowInfo.getPosition()[0]; + top = this.windowInfo.getPosition()[1] + this.windowInfoLastHeight - this.windowInfo.getHeight(); + } else { + this.windowInfo.show(); + left = this.windowInfoLeft; + top = this.windowInfoTop - this.windowInfo.getHeight(); + } + this.windowInfoLastHeight = this.windowInfo.getHeight(); + this.windowInfo.setPosition([left,top]); + }; + + OutilSaaq.prototype.creerVehicule = function(key, geom, propriete) { + propriete.ordre = key+1; + if(propriete.minute.length == 1){propriete.minute='0'+propriete.minute}; + var vehicule = new Occurence(geom, propriete); + this.vecteurSaaq.ajouterOccurence(vehicule); + if(key === 0){ + this.obtenirAdresse(propriete.lon+" "+propriete.lat, vehicule); + } + }; + + OutilSaaq.prototype.obtenirAdresse = function(coord, occurence){ + //todo: changer le host + this.ouvrirInfoWindow(occurence.obtenirProprietes()); + var that=this; + $.ajax({ + url: Aide.utiliserProxy(this.options.serviceGLO), + data: { + type: "REVERSE", + epsg_sortie: 32198, + indDebut: 0, + indFin: 0, + groupe: 1, + urlappelant: "/geomsp/", + texte: coord, + format: "json", + _cle: 'glo' + }, + //crossDomain: true, //utilisation du proxy + async:false, + context:this, + success: function(e){ + if(e.nombreResultat !== 0){ + occurence.definirPropriete('geocodage', e.geocoderReponseListe[0]); + } + that.ouvrirInfoWindow(occurence.obtenirProprietes()); + Aide.cacherMessageChargement(); + }, + dataType:'json', + error:function(){ + occurence.definirPropriete('geocodage', 'Indisponible'); + that.ouvrirInfoWindow(occurence.obtenirProprietes()); + Aide.cacherMessageChargement(); + // Aide.afficherMessage({titre: 'Erreur', message: 'GLO est indisponible', icone: 'erreur'}); + } + }); + }; + + OutilSaaq.prototype.afficherVehicule = function(data) { + var that=this; + if(!this.vecteurSaaq){ + this.creerCouche(); + } else { + this.vecteurSaaq.enleverTout(); + } + + if(data.resultat.length === 0){ + Aide.afficherMessage({titre: 'Avertissement', message: "Aucun résultat trouvé"}); + return true; + } + + data.resultat.sort(this.trierVehicule); + + $.each(data.resultat.reverse(), function(key, value){ + var geom = new Point(value.lon, value.lat, 'EPSG:4326').projeter(that.carte.obtenirProjection()); + that.creerVehicule(key, geom, value); + }); + + this.vecteurSaaq.zoomerOccurences(null, 15); + + if(data.etat.fonctionnel === 0){ + var message = "Attention: Aucune nouvelle donnée a été reçue depuis un certain temps"; + Aide.afficherMessage({titre: 'Avertissement', message: message}); + } + }; + + + OutilSaaq.prototype.trierVehicule = function SortByName(a, b){ + var aName = a.id; + var bName = b.id; + return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); + } + + return OutilSaaq; + +}); + diff --git a/interfaces/navigateur/public/js/app/outil/outilTableSelection.js b/interfaces/navigateur/public/js/app/outil/outilTableSelection.js index dd40585a..a7e0332d 100644 --- a/interfaces/navigateur/public/js/app/outil/outilTableSelection.js +++ b/interfaces/navigateur/public/js/app/outil/outilTableSelection.js @@ -43,12 +43,19 @@ define(['outil', 'aide'], function(Outil, Aide) { id: 'zoom_auto', xtype:'menucheckitem', titre: 'Zoom auto sur la sélection', - infobulle: 'Zoom auto sur la sélection', + infobulle: 'Zoom auto sur la sélection' }); // } else { // throw new Error("OutilTableSelection a besoin d'un type"); - } + } else if (this.options.type === 'selectionSeulement'){ + this.defautOptions = $.extend({},this.defautOptions, { + id: 'affiche_selection_seulement', + xtype:'menucheckitem', + titre: 'Afficher la sélection seulement', + infobulle: 'Affiche seulement la sélection' + }); + } }; OutilTableSelection.prototype = new Outil(); @@ -72,6 +79,9 @@ define(['outil', 'aide'], function(Outil, Aide) { this.options.couche.zoomerOccurences(this.options.couche.obtenirOccurencesSelectionnees()); } else if (this.options.type === 'auto'){ this.options.couche.zoomAuto = !this._bouton.checked; + } else if (this.options.type === 'selectionSeulement'){ + this.options.couche.options.selectionSeulement = !this._bouton.checked; + this.options.couche.declencher({ type: "occurenceClique", occurence:this.options.couche.obtenirOccurencesSelectionnees()}); } }; diff --git a/interfaces/navigateur/public/js/app/panneau/panneau.js b/interfaces/navigateur/public/js/app/panneau/panneau.js index cc8e0444..5ec653de 100644 --- a/interfaces/navigateur/public/js/app/panneau/panneau.js +++ b/interfaces/navigateur/public/js/app/panneau/panneau.js @@ -158,7 +158,12 @@ define(['aide', 'evenement'], function(Aide, Evenement) { if(this._panel && this._panel.title){ return this._panel.title; } - return this.options.titre; + if(this.options.titre){ + return this.options.titre; + } + + return this.defautOptions.titre; + }; Panneau.prototype.definirTitre = function(titre){ diff --git a/interfaces/navigateur/public/js/app/panneau/panneauTable.js b/interfaces/navigateur/public/js/app/panneau/panneauTable.js index 1839f3c4..51f7bd3c 100644 --- a/interfaces/navigateur/public/js/app/panneau/panneauTable.js +++ b/interfaces/navigateur/public/js/app/panneau/panneauTable.js @@ -453,6 +453,9 @@ define(['panneau', 'aide', 'contexteMenuTable', 'barreOutils', 'outilTableSelect outilsSelection.push(new OutilTableSelection({ type:'auto', couche: this.donnees})); + outilsSelection.push(new OutilTableSelection({ + type:'selectionSeulement', + couche: this.donnees})); menuSelection.ajouterOutils(outilsSelection); @@ -550,7 +553,9 @@ define(['panneau', 'aide', 'contexteMenuTable', 'barreOutils', 'outilTableSelect var that=this; $.each(occurences, function(key, value){ if(!that._panel.store){return false;} - var index = that._panel.store.indexOfId(value.id); + if(value){ + var index = that._panel.store.indexOfId(value.id); + } if(index === -1){return true;} that.selectionnerParIndex(index, true); }); @@ -770,6 +775,13 @@ define(['panneau', 'aide', 'contexteMenuTable', 'barreOutils', 'outilTableSelect if(this._.donnees.zoomAuto){ this._.donnees.zoomerOccurences(this._.donnees.obtenirOccurencesSelectionnees()); } + + if(this._.donnees.options.selectionSeulement){ + this._.donnees.afficherSelectionSeulement(); + }else{ + this._.donnees.afficherTous(); + } + this._.declencher({ type: "tableEnregistrementSelection", selection: selectionIGO, vecteur: vecteur }); }; diff --git a/interfaces/navigateur/public/libs/test.js b/interfaces/navigateur/public/libs/test.js new file mode 100644 index 00000000..ed43b720 --- /dev/null +++ b/interfaces/navigateur/public/libs/test.js @@ -0,0 +1,280 @@ +define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { + var geocodagePostScript = function(id){ + + var panneauTemplate = { table : { + colonnes: [ + { + titre: 'id', + triable: true, + propriete: 'idStat' + }, + + { + titre: 'Entrée', + triable: true, + propriete: 'entree' + }, + { + titre: 'Sortie', + triable: true, + propriete: 'adresseLibre' + }, + { + titre: 'Numéro civique', + triable: true, + propriete: 'noCiviq' + }, + { + titre: 'Numéro civique suffixe', + triable: true, + propriete: 'noCivqSuffx' + }, + { + titre: 'Numéro d\'appartement', + triable: true, + propriete: 'noApprt' + }, + { + titre: 'Numéro d\'appartement suffixe', + triable: true, + propriete: 'noApprtSuffx' + }, + { + titre: 'Rue', + triable: true, + propriete: 'nomRue' + }, + { + titre: 'Municipalité', + triable: true, + propriete: 'mun' + }, + { + titre: 'Code Postal', + triable: true, + propriete: 'codePostal' + }, + { + titre: 'Coordonnée X', + triable: true, + propriete: 'x' + }, + { + titre: 'Coordonnée Y', + triable: true, + propriete: 'y' + }, + { + titre: 'Code de projection', + triable: true, + propriete: 'codeEPSG' + }, + { + titre: 'Date de mise à jour', + triable: true, + propriete: 'dateMiseAJour' + }, + { + titre: 'Index de similarité (Rue)', + triable: true, + propriete: 'similarityRue' + }, + { + titre: 'Index de similarité (Municipalité)', + triable: true, + propriete: 'similarityMun' + } + ] + } + }; + + var modifierGeom = function(e){ + var projPoint = e.occurence.obtenirProjection(); + var projPropriete = projPoint; + if(e.occurence.proprietes.codeEPSG){ + var projPropriete = 'EPSG:'+e.occurence.proprietes.codeEPSG; + } + else{ + e.occurence.proprietes.codeEPSG = projPropriete.substring(5); + } + + if(projPoint === projPropriete){ + e.occurence.proprietes.x = e.occurence.x; + e.occurence.proprietes.y = e.occurence.y; + } + else{ + var pointProjeter = e.occurence.projeter(projPropriete); + e.occurence.proprietes.x = pointProjeter.x; + e.occurence.proprietes.y = pointProjeter.y; + } + + Igo.nav.obtenirPanneauxParType('PanneauTable')[0].rafraichir(); + + }; + + var selectionnerOccurencePanneauTable = function(e){ + this.deselectionnerTout(); + Igo.nav.obtenirPanneauxParType('PanneauTable')[0].selectionnerParOccurences(e.occurence); + } + + var couche1a1 = new Igo.Couches.Vecteur({ + titre : '1 à 1', + id: 'couche1a1', + editable: true, + typeGeometriePermise: 'Point', + groupe: "Résultat" + }); + + couche1a1.templates = panneauTemplate; + + couche1a1.ajouterDeclencheur("occurenceClique", selectionnerOccurencePanneauTable); + + couche1a1.ajouterDeclencheur("vecteurOccurenceModifiee", modifierGeom); + + var couche1a0 = new Igo.Couches.Vecteur({ + titre : '1 à 0', + id: 'couche1a0', + editable: true, + typeGeometriePermise: 'Point', + groupe: "Résultat", + geometrieNullePermise: true + + }); + + couche1a0.templates = panneauTemplate; + + couche1a0.ajouterDeclencheur("occurenceClique", selectionnerOccurencePanneauTable); + + couche1a0.ajouterDeclencheur("vecteurOccurenceModifiee", modifierGeom); + + var couche1aN = new Igo.Couches.Vecteur({ + titre : '1 à N', + id: 'couche1aN', + editable: true, + supprimable: true, + typeGeometriePermise: 'Point', + groupe: "Résultat" + + }); + couche1aN.templates = panneauTemplate; + + couche1aN.ajouterDeclencheur("occurenceClique", selectionnerOccurencePanneauTable); + + couche1aN.ajouterDeclencheur("vecteurOccurenceModifiee", modifierGeom); + + var couche1aNCluster = new Igo.Couches.VecteurCluster({ + titre : '1 à N Cluster', + id: 'couche1aNCluster', + editable: true, + supprimable: true, + typeGeometriePermise: 'Point', + groupe: "Résultat", + clusterZoomMax: 15 + + }); + couche1aNCluster.templates = panneauTemplate; + + this.gestionCouches.ajouterCouches([couche1a1, couche1a0,couche1aN]); + + OpenLayers.Request.GET({ + url: this.gestionCouches.obtenirCoucheParId('resultatGeo').options.source, + success: geocodagePostScript.lireReponse, + error: geocodagePostScript.appelerServiceErreur + }); + + + }; + + geocodagePostScript.lireReponse = function(data, status, b){ + var ttest =1; + + var json = new OpenLayers.Format.JSON().read( data.responseText ); + + if(json.etat !== undefined && json.commentaire !== undefined){ + Igo.Aide.afficherMessageChargement({message: "Revenez plus tard : "+json.commentaire}); + } + else{ + + $.each(json, function(key, value){ + if(value){ + if(value.geocoderReponseListe !== undefined && value.nombreResultat !== undefined ){ + if(value.nombreResultat === 1){ + + $.each(value.geocoderReponseListe, function(key2, value2) { + + var x=value2.x; + var y=value2.y; + var proj="EPSG:"+ value2.codeEPSG; + var geom = new Igo.Geometrie.Point(x,y,proj); + geom = geom.projeter('EPSG:3857'); + + var style = new Style({ + visible: true, + icone: Aide.utiliserBaseUri('images/marqueur/marker-green.png'), + iconeHauteur: 34, + iconeLargeur: 20, + iconeOffsetX: -10, + iconeOffsetY: -34 + }); + + var valeur = {"entree":value.entree}; + $.extend(valeur, value2); + + var occurence = new Occurence(geom,valeur,style,{}); + Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1a1').ajouterOccurence(occurence); + }); + } + if(value.nombreResultat > 1){ + + var couleurAleatoire = '#'+Math.floor(Math.random()*16777215).toString(16); + + $.each(value.geocoderReponseListe, function(key2, value2) { + + var x=value2.x; + var y=value2.y; + var proj="EPSG:"+ value2.codeEPSG; + var geom = new Igo.Geometrie.Point(x,y,proj); + geom = geom.projeter('EPSG:3857'); + + + + var style = new Style({ + visible: true, + couleur : couleurAleatoire, + iconeHauteur: 34, + iconeLargeur: 20, + iconeOffsetX: -10, + iconeOffsetY: -34 + }); + + var valeur = {"entree":value.entree}; + $.extend(valeur, value2); + + var occurence = new Occurence(geom,valeur,style,{}); + Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1aN').ajouterOccurence(occurence); + + //Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1aNCluster').ajouterOccurence(occurence); + + + }); + } + if(value.nombreResultat === 0){ + var x = null; + var y = null; + var proj =null; + // var geom = new Igo.Geometrie.Point(x,y,proj); + var occurence = new Occurence(null,value,{},{typeGeometrie:'Point'}); + Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1a0').ajouterOccurence(occurence); + } + } + } + }); + } + }; + + geocodagePostScript.appelerServiceErreur = function(data, status) { + alert('pinpon pinpon pinpon'); + }; + + return geocodagePostScript; +}); \ No newline at end of file From bb0dc19efd67c5e17ea5849e6eaf7f157556d78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Tue, 11 Aug 2015 14:49:29 -0400 Subject: [PATCH 006/232] authentificationLDAP --- .../app/controllers/AuthentificationLdap.php | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 services/igo_commun/app/controllers/AuthentificationLdap.php diff --git a/services/igo_commun/app/controllers/AuthentificationLdap.php b/services/igo_commun/app/controllers/AuthentificationLdap.php new file mode 100644 index 00000000..181e25a9 --- /dev/null +++ b/services/igo_commun/app/controllers/AuthentificationLdap.php @@ -0,0 +1,214 @@ +messageErreur; + } + + /* + * Libre au developpeur d'implémenter cette fonction + * selon ses critères pour l'utilisateur. + * Retourne : bool + */ + public function estAdmin() { + return $this->estAdmin; + } + + /* + * Libre au developpeur d'implémenter cette fonction + * selon ses critères pour l'utilisateur. + * Retourne : bool + */ + public function estPilote() { + return $this->estPilote; + } + + /* + * Fonction publique permettant l'authentification à un serveur LDAP. + * Paramètres : identifiant, mot de passe + * Définit un message d'erreur dans la variable $this->messageErreur + * $this->messageErreur est utilisé pour afficher un message expliquant + * pourquoi l'authentification à échouée. + */ + public function authentification($identifiant, $motDePasse){ + // On force miniscule pour éviter de créer des comptes pour chaque orthographe. + $identifiant = strtolower($identifiant); + + /* On s'authentifie dans le LDAP */ + $this->authentifierLDAP($identifiant, $motDePasse); + + if($this->motDePasseExpire){ + $this->messageErreur = "Votre mot de passe est expiré. Veuillez le changer pour avoir accès au système!"; + return false; + } + if(!$this->motDePasseValide){ + $this->messageErreur = "L'authentification a échouée."; + } + + if($this->motDePasseValide) { + /* On ajoute l'utilisateur dans la BD */ + $this->igo_utilisateur = IgoUtilisateur::findFirstByNom($identifiant); + + //L'utilisateur n'existe pas encore dans IGO + if(!$this->igo_utilisateur) { + //Créer l'utilisateur + $this->igo_utilisateur = $this->creerUtilisateur($identifiant); + } + + $this->estAdmin = $this->igo_utilisateur->est_admin; + $this->estPilote = $this->igo_utilisateur->est_pilote; + } + + return $this->motDePasseValide; + } + + private function creerUtilisateur($identifiant) { + $igo_utilisateur = new IgoUtilisateur(); + $igo_utilisateur->nom = $identifiant; + $igo_utilisateur->est_admin = false; + $igo_utilisateur->est_pilote = false; + if(!$igo_utilisateur->save()){ + foreach ($igo_utilisateur->getMessages() as $message) { + $this->flash->error($message); + } + } + return $igo_utilisateur; + } + + public function estAuthentifie(){ + return $this->motDePasseValide; + } + + /* + * On prends les profils LDAP, on récupère les profils correspondant + * dans la table profil et on les ajoute dans la session profil. + * Ensuite on prends les profils ajoutés dans la BD, associés à un utilisateur + * On les ajoute ensuite dans le tableau de profil. + * + * On retourne ensuite le tableau profil qui sera stocké dans la session. + * @return ??? + */ + public function obtenirProfils(){ + + $igo_utilisateur_profils = IgoUtilisateurProfil::find("utilisateur_id = {$this->igo_utilisateur->id}"); + $profilsIgo = IgoProfil::find(); + $profils_bd = array(); + $profils_ldap = array(); + + foreach($profilsIgo as $profil) { + foreach($igo_utilisateur_profils as $igo_utilisateur_profil) { + if($profil->id === $igo_utilisateur_profil->profil_id) { + array_push($profils_bd, $profil->toArray()); + } + } + } + + $profilsIgo->rewind(); + + foreach($profilsIgo as $profil) { + foreach($this->profils as $profilLDAP) { + if($profil->nom === $profilLDAP) { + array_push($profils_ldap, $profil->toArray()); + } + } + } + + return array_merge($profils_bd, $profils_ldap); + } + + public function obtenirIdentifiantUtilisateur(){ + return $this->identifiant; + } + + public function deconnexion(){ + + } + + /* + * Fonction identifiant un utilisateur à un LDAP + * Cette fonction met à jour la variable $this->profil + * Retourne true en cas de succes, sinon retourne false. + */ + private function authentifierLDAP($identifiant, $motDePasse){ + $configuration = $this->getDI()->get("config"); + + $ldapInterne = $configuration->application->authentification->ldap->interne; + $ldapExterne = $configuration->application->authentification->ldap->externe; + $ldapPort = $configuration->application->authentification->ldap->port; + + // Determiner si utilisateur interne ou externe + if(!isset($configuration->application->authentification->ldap->host)){ + if(strlen($identifiant) === 8){ + $ldapHost = $ldapExterne; + }else{ + $ldapHost = $ldapInterne; + } + } else { + $ldapHost = $configuration->application->authentification->ldap->host; + } + + // Se connecter a LDAP + $ldapconn = ldap_connect( $ldapHost, $ldapPort ); + if(!$ldapconn) { + //throw new Exception("Could not connect to LDAP"); + return false; + } + + // Bind anonyme a LDAP + $bind = ldap_bind($ldapconn); + if (!$bind) { + //throw new Exception("Could not bind to LDAP"); + return false; + } + + // Rechercher nom unique de l'utilisateur + $organisation = $configuration->application->authentification->ldap->organisation; + $filter = "(&(cn={$identifiant})(objectclass=person))"; + $searchUser = ldap_search($ldapconn, $organisation, $filter); + if (!$searchUser) { + //throw new Exception("Erreur lors de la recherche ldap: LDAP-Error: %s
    \n" . ldap_error($ldapconn)); + return false; + } + $userEntries = ldap_get_entries($ldapconn, $searchUser); + if(count($userEntries) != 2 || $userEntries["count"] != 1){ + //throw new Exception("Could not find user in ldap."); + return false; + } + + $this->identifiant = $identifiant; + $this->profils = isset($userEntries[0]["groupmembership"]) ? $userEntries[0]["groupmembership"] : ""; + + // Verifier que le mot de passe de l'utilisateur n'est pas expiré + $now = new DateTime(); + if(isset($userEntries[0]["passwordexpirationtime"])){ + $expirationDateTime = new DateTime($userEntries[0]["passwordexpirationtime"][0]); + }else{ + $expirationDateTime = $now; + } + $this->motDePasseExpire = ($now > $expirationDateTime); + if($this->motDePasseExpire){ + $this->motDePasseValide = false; + return false; + } + + // Valider le mot de passe + $ldapcon2 = ldap_connect($ldapHost, $ldapPort); + if(strlen($motDePasse) == 0){ + $ldapbind2 = false; + }else{ + $ldapbind2 = ldap_bind($ldapcon2, $userEntries[0]["dn"], $motDePasse); + } + $this->motDePasseValide = $ldapbind2; + } +} From 10f0b22ecc2b23185ba4dd6755a50485a1374863 Mon Sep 17 00:00:00 2001 From: trom05 Date: Tue, 11 Aug 2015 17:55:03 -0400 Subject: [PATCH 007/232] =?UTF-8?q?ajout=20de=20m=C3=A9thode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/js/app/couche/protocole/couche.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/interfaces/navigateur/public/js/app/couche/protocole/couche.js b/interfaces/navigateur/public/js/app/couche/protocole/couche.js index 84860578..32ceed88 100644 --- a/interfaces/navigateur/public/js/app/couche/protocole/couche.js +++ b/interfaces/navigateur/public/js/app/couche/protocole/couche.js @@ -222,6 +222,17 @@ define(['evenement', 'aide'], function(Evenement, Aide) { return this._getLayer().getVisibility(); }; + /** + * Vérifie si la couche peu être affichée selon le minimum + * et maximum de résolution + * @method + * @name Couche#estDansPortee + * @returns {Boolean} + */ + Couche.prototype.estDansPortee = function() { + return this._getLayer().inRange; + }; + /** * Activer la couche * @method @@ -256,10 +267,27 @@ define(['evenement', 'aide'], function(Evenement, Aide) { }; + /** + * Définir la transparence de la couche + * @method + * @name Couche#definirOpacite + * @param {Nombre} opacite nombre entre 0 et 1 + */ Couche.prototype.definirOpacite = function(opacite) { this._getLayer().setOpacity(opacite); }; + + /** + * Obtenir la transparence de la couche + * @method + * @name Couche#obtenirOpacite + * @returns {Nombre} transparence entre 0 et 1 + */ + Couche.prototype.obtenirOpacite = function() { + this._getLayer().opacity; + }; + /* Couche.prototype.estSelectionnee = function() { From 6d15f5921553a9001adc67453fd25bb98fe9c9ba Mon Sep 17 00:00:00 2001 From: trom05 Date: Tue, 11 Aug 2015 17:55:53 -0400 Subject: [PATCH 008/232] ajout de doc et fix le probleme de l'ordre d'affichage (zIndex) --- .../public/js/app/menu/impression.js | 204 ++++++++++-------- 1 file changed, 119 insertions(+), 85 deletions(-) diff --git a/interfaces/navigateur/public/js/app/menu/impression.js b/interfaces/navigateur/public/js/app/menu/impression.js index b8f031c7..5edfe82b 100644 --- a/interfaces/navigateur/public/js/app/menu/impression.js +++ b/interfaces/navigateur/public/js/app/menu/impression.js @@ -37,6 +37,7 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) * @alias impression:Panneau.Impression * @extends Panneau * @requires impression + * @param {Objet} options options * @returns {Panneau.Impression} Instance de {@link Panneau.Impression} */ function Impression(options){ @@ -47,10 +48,8 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) this.separator = "&"; this.aszPrintableLayerTypes = [ - "OpenLayers.Layer.WMS", - "OpenLayers.Layer.WMS.Untiled", - "OpenLayers.Layer.MapServer", - // "OpenLayers.Layer.OpenLayers" + "WMS", + "WMTS" ]; }; @@ -173,31 +172,31 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) var width = widthNumberField.getValue(); var height = heightNumberField.getValue(); - if(paper == "Personalisé"){ + if(paper === "Personalisé"){ widthNumberField.setDisabled(false); heightNumberField.setDisabled(false); } else{ - if(paper == "LETTER"){ + if(paper === "LETTER"){ width = 8.5; height = 11; - }else if(paper == "LEGAL"){ + }else if(paper === "LEGAL"){ width = 8.5; height = 14; - }else if(paper == "LEDGER"){ + }else if(paper === "LEDGER"){ width = 11; height = 17; - }else if(paper == "A1"){ + }else if(paper === "A1"){ width = 23; height = 33; - }else if(paper == "ANSI E"){ + }else if(paper === "ANSI E"){ width = 34; height = 44; } widthNumberField.setDisabled(true); heightNumberField.setDisabled(true); - if(orientation == "landscape"){ + if(orientation === "landscape"){ // Invert width & height var buffer = width; width = height; @@ -404,12 +403,12 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) }); this.printForm.on('beforeaction', function(form, action) { - if (action.type == 'submit') { + if (action.type === 'submit') { //Vérifie qu'on doit réellement envoyé le fichier. - if(form.items.get("printLogo").checked == false || - form.items.get("printLogoPath").value == "" || - typeof(form.items.get("printLogoPath").value) == "undefined"){ + if(form.items.get("printLogo").checked === false || + form.items.get("printLogoPath").value === "" || + typeof(form.items.get("printLogoPath").value) === "undefined"){ form.items.get("printLogoPath").setDisabled(true); } @@ -418,7 +417,7 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) }); this.printForm.on('actionfailed', function(form, action) { - if (action.type == 'submit') { + if (action.type === 'submit') { form.items.get("printLogoPath").setDisabled(false); return true; } @@ -431,40 +430,37 @@ define(['panneau', 'aide', 'kmlMsp', 'fileUploadField'], function(Panneau, Aide) } }); -} +}; -/** - * Function: printMap - * - * Get all visible and printable layers currently on map. Get all required - * parameters and build a request url string to be putted in a Ext.Window that - * contains an iframe. The actual "printing" (image/pdf generation) is done - * server-side by the url (wms2pdf.php). - * - * In the end, an image or pdf appears in the Ext.Window. See wms2pdf.php for - * more details on how the actual "printing" works. - */ +/** + * Début du script lancant l'impression + * + * Get all visible and printable layers currently on map. Get all required + * parameters and build a request url string to be putted in a Ext.Window that + * contains an iframe. The actual "printing" (image/pdf generation) is done + * server-side by the url (wms2pdf.php). + * + * In the end, an image or pdf appears in the Ext.Window. See wms2pdf.php for + * more details on how the actual "printing" works. + * @method + * @name Impression#printMap + */ Impression.prototype.printMap = function(){ var vecteursKml = this.exportVecteur(); - if(vecteursKml != null){ + if(vecteursKml !== null){ var aoLayers = this.getPrintableLayers(false); }else{ var aoLayers = this.getPrintableLayers(true); } - if(!aoLayers){ return false; } //Lancer l'impression - var szURL = this.options.service || this.defautOptions.service; - /*if (szURL[0]==='/') { - szURL = szURL.slice(1); - }*/ - + var szURL = this.options.service || this.defautOptions.service; var oParams = this.getPrintParams(aoLayers); var szTitle = "Création du fichier"; var szWait = "Création du fichier en cours, veuillez patienter quelques"+ @@ -476,7 +472,6 @@ Impression.prototype.printMap = function(){ szURL += '?' + szParams; } - //var proxy = Aide.obtenirProxy() + '?url='; szURL=Aide.utiliserProxy(szURL); if(this.printForm.getForm().isValid()){ @@ -498,22 +493,27 @@ Impression.prototype.printMap = function(){ this.afficherImpression(action); } }); - } - -} +}; +/** + * Obtenir les options d'impression pour une série de couche + * @method + * @name Impression#getPrintableLayers + * @param {boolean} flagVecteur signifie si des couches vecteurs sont présentes + * @returns {couche[]} aoLayers série de couche à imprimer + */ Impression.prototype.getPrintableLayers = function(flagVecteur) { var flagVecteur = (typeof flagVecteur === "undefined") ? true : flagVecteur; var aolBase = [], aolOverlays = [], aoLayers; var oMap = Igo.nav.carte._carteOL; - for (var i = 0, len = oMap.layers.length; i < len; i++) { - var oLayer = oMap.layers[i]; - var coucheIGO = Igo.nav.carte.gestionCouches.obtenirCoucheParId(oLayer.id); - if (!oLayer.printOptions) { - if (oLayer.getVisibility() && coucheIGO && (coucheIGO.obtenirTypeClasse()==="Google" || coucheIGO.obtenirTypeClasse()==="OSM")){ + var layers = Igo.nav.carte.gestionCouches.obtenirCouches(true); + for (var i = 0, len = layers.length; i < len; i++) { + var coucheIGO = layers[i]; + if (!coucheIGO._layer.printOptions) { + if (coucheIGO.options.visible && (coucheIGO.obtenirTypeClasse()==="Google" || coucheIGO.obtenirTypeClasse()==="OSM")){ Aide.afficherMessage("Impression", "Les couches Google et OpenStreetMap, ne sont pas disponible à l'impression pour des raisons de droits d'utilisation.", "OK", @@ -521,28 +521,27 @@ Impression.prototype.getPrintableLayers = function(flagVecteur) { return; } - if(OpenLayers.Util.indexOf(this.aszPrintableLayerTypes, oLayer.CLASS_NAME) == -1){ + if(OpenLayers.Util.indexOf(this.aszPrintableLayerTypes, coucheIGO.obtenirTypeClasse()) === -1){ continue; } } - if( (OpenLayers.Util.indexOf(this.aszPrintableLayerTypes, oLayer.CLASS_NAME) == -1) && - ((!oLayer.printOptions['url'] || - !oLayer.printOptions['layers'] || - !oLayer.printOptions['mapformat'] || - !oLayer.printOptions['format']) || - oLayer.printOptions['fromLayer'] == true)){ + if( (OpenLayers.Util.indexOf(this.aszPrintableLayerTypes, coucheIGO.obtenirTypeClasse()) === -1) && + ((!coucheIGO._layer.printOptions['url'] || + !coucheIGO._layer.printOptions['layers'] || + !coucheIGO._layer.printOptions['mapformat'] || + !coucheIGO._layer.printOptions['format']) || + coucheIGO._layer.printOptions['fromLayer'] === true)){ continue; } - if (oLayer.isBaseLayer) { + if (coucheIGO.estFond()) { - if (oLayer.getVisibility()) { - - aolBase.push(oLayer); + if (coucheIGO.estActive()) { + aolBase.push(coucheIGO); } - } else if (oLayer.inRange && oLayer.getVisibility()) { - aolOverlays.push(oLayer); + } else if (coucheIGO.estDansPortee() && coucheIGO.estActive()) { + aolOverlays.push(coucheIGO); } } @@ -558,6 +557,13 @@ Impression.prototype.getPrintableLayers = function(flagVecteur) { return aoLayers; }; +/** + * Obtenir les options d'impression pour une série de couche + * @method + * @name Impression#getPrintParams + * @param {couche[]} aoLayers série de couche + * @returns {Object} oParams object contenant les paramètres d'impression + */ Impression.prototype.getPrintParams = function(aoLayers){ // Patch pour pallier à  l'erreur de la projection Google avec // le paramètre geodesic à  true dans le GOLOC, voir mantis # 0000874 @@ -566,7 +572,7 @@ Impression.prototype.getPrintParams = function(aoLayers){ var hasBaseLayer = false; for(var i = 0; i < aoLayers.length; i++){ - if(aoLayers[i].isBaseLayer){ + if(aoLayers[i].estFond()){ hasBaseLayer = true; break; } @@ -593,7 +599,7 @@ Impression.prototype.getPrintParams = function(aoLayers){ oElement = aoElements[i]; oParams[oElement.getId()] = oElement.getValue(); - if(oElement.getId() == "printOutputFormat"){ + if(oElement.getId() === "printOutputFormat"){ szOutputFormat = oElement.getValue(); switch(szOutputFormat){ case "pdf": @@ -603,15 +609,22 @@ Impression.prototype.getPrintParams = function(aoLayers){ this.szWindowTitle = "Présente carte en image. Clique droit "+ "sur l'image pour la sauvegarder."; } - }else if(oElement.getId() == "printPaper" || oElement.getId() == "printOrientation"){ + }else if(oElement.getId() === "printPaper" || oElement.getId() === "printOrientation"){ // Do not send the print paper/orientation, this is application specific, // the services requires a width and a height parameter and does not know about the paper formats. continue; } } return oParams; -} +}; +/** + * Obtenir les options d'impression pour une série de couche + * @method + * @name Impression#getLayersPrintOption + * @param {couche[]} aoLayers série de couche + * @returns {String} szOptionValues chaine de caractère + */ Impression.prototype.getLayersPrintOption = function(aoLayers, szOption){ var szOptionValues = ""; @@ -625,13 +638,13 @@ Impression.prototype.getLayersPrintOption = function(aoLayers, szOption){ szOptionValues += this.getLayerPrintOption(oLayer, szOption); //Changer les urls de layers pour que ça soit en http - if ( szOption == 'url'){ + if ( szOption === 'url'){ szOptionValues.replace(/https:\/\//gi, /*Aide.obtenirHote() + Aide.utiliserProxy() +*/ 'https://'); } } return szOptionValues; -} +}; /** * Function: getLayersPrintOption @@ -640,7 +653,7 @@ Impression.prototype.getLayersPrintOption = function(aoLayers, szOption){ * type is treated separately. * * Parameters: - * oLayer - {} A printable OpenLayer.Layer object + * oLayer - {} couche * szOption - {string} A possible option of the layer printOptions * properties. See readme at beginning for * for more details. @@ -649,12 +662,21 @@ Impression.prototype.getLayersPrintOption = function(aoLayers, szOption){ * {string} Layer print option needed for the server-side printing script * */ + +/** + * Obtenir les options d'impression pour une couche + * @method + * @name Impression#getLayerPrintOption + * @param {couche} oLayer signifie si des couches vecteurs sont présentes + * @param {string} szOption l'option a rechercher + * @returns {String} szOptionValue l'option rechercher + */ Impression.prototype.getLayerPrintOption = function(oLayer, szOption){ - var szOptionValue = oLayer.printOptions[szOption]; + var szOptionValue = oLayer._layer.printOptions[szOption]; if(szOptionValue){ switch(szOption){ case "url": - if(szOptionValue.substring(0,1) == "/"){ + if(szOptionValue.substring(0,1) === "/"){ //Call fait pas le server donc pas de https szOptionValue = Aide.obtenirHote() + szOptionValue; } @@ -668,22 +690,22 @@ Impression.prototype.getLayerPrintOption = function(oLayer, szOption){ case "url": var szURL; - if (oLayer.url instanceof Array && oLayer.url.length > 1){ - szURL = oLayer.url[0]; + if (oLayer._layer.url instanceof Array && oLayer._layer.url.length > 1){ + szURL = oLayer._layer.url[0]; } else { - szURL = oLayer.url; + szURL = oLayer._layer.url; } - var oParam = OpenLayers.Util.upperCaseObject(oLayer.params); + var oParam = OpenLayers.Util.upperCaseObject(oLayer._layer.params); var szMap = oParam.MAP; // if the layer has a 'map' param and it is not in the url, add it. if (szMap && - (szURL.indexOf('map=') == -1 || szURL.indexOf('MAP=') == -1)){ + (szURL.indexOf('map=') === -1 || szURL.indexOf('MAP=') === -1)){ var szMapParam = "map="+szMap; szURL += szMapParam + this.separator; } - if(szURL.substring(0,1) == "/"){ + if(szURL.substring(0,1) === "/"){ szURL = Aide.obtenirHote() + szURL; } @@ -691,18 +713,17 @@ Impression.prototype.getLayerPrintOption = function(oLayer, szOption){ break; case "layers": - var oParam = OpenLayers.Util.upperCaseObject(oLayer.params); - szOptionValue = oParam.LAYERS; + szOptionValue = oLayer.options.nom; break; case "format": - switch(oLayer.CLASS_NAME){ + switch(oLayer._layer.CLASS_NAME){ case "OpenLayers.Layer.WMS": case "OpenLayers.Layer.WMS.Untiled": - szOptionValue = oLayer.params.FORMAT; + szOptionValue = oLayer._layer.params.FORMAT; break; case "OpenLayers.Layer.MapServer": - szOptionValue = oLayer.params.map_imagetype; + szOptionValue = oLayer._layer.params.map_imagetype; break; } break; @@ -712,26 +733,32 @@ Impression.prototype.getLayerPrintOption = function(oLayer, szOption){ break; case "opacity": - szOptionValue = oLayer.opacity; + szOptionValue = oLayer.obtenirOpacite(); break; case "time": - if (oLayer.params['TIME']){ - szOptionValue = oLayer.params['TIME']; + if (oLayer._layer.params['TIME']){ + szOptionValue = oLayer._layer.params['TIME']; }else{ - szOptionValue = "null"; + szOptionValue = "null"; } break; case "title": - szOptionValue = oLayer.name; + szOptionValue = oLayer.obtenirTitre(); break; } return szOptionValue; -} +}; +/** + * Converti les données vecteurs en KML lisible par OGR + * @method + * @name Impression#exportVecteur + * @return {OpenLayers.Format.KML_MSP} dataConvertie KML lisible par OGR + */ Impression.prototype.exportVecteur = function(){ var dataConvertie; @@ -746,7 +773,7 @@ Impression.prototype.exportVecteur = function(){ } }); - if(vecteurCouches.length == 0){ + if(vecteurCouches.length === 0){ return null; }else{ var kmlWriter = new OpenLayers.Format.KML_MSP({ @@ -766,6 +793,13 @@ Impression.prototype.exportVecteur = function(){ }; +/** + * Affiche le résultat de l'impression + * @method + * @name Impression#afficherImpression + * @param {object} action réponse ajax + */ + Impression.prototype.afficherImpression = function(action){ oMapComponent = Igo.nav.obtenirPanneauxParType('PanneauCarte')[0]._getMapComponent(); @@ -798,7 +832,7 @@ Impression.prototype.afficherImpression = function(action){ myWindow.document.write(htmlContent); myWindow.document.write(''); return true; - } else if(action.response.responseText.indexOf("html") == -1){ + } else if(action.response.responseText.indexOf("html") === -1){ htmlContent = "'); - $('body').append(iframe); - var content = iframe[0].contentDocument; - - var inputs = ''; - - inputs+=''; - inputs+=''; - inputs+=''; - inputs+=''; - - if(outputName){ - inputs+=''; - } - - var form = '
    '+inputs+'
    '; - content.write(form); - $('form', content).submit(); - /* setTimeout((function(iframe) { - return function() { - iframe.remove(); - }; - })(iframe), 4000);*/ - }; - }; - - ExportImport.prototype.appelerServiceErreur = function(jqXHR){ - var messageErreur = jqXHR.responseText; - if(jqXHR.responseJSON){ - messageErreur = jqXHR.responseJSON.message_erreur; - - if(jqXHR.responseJSON.detail_message){ - $.each(jqXHR.responseJSON.detail_message, function(key, value){ - messageErreur += "
    "+value; - }); - } - } - if(jqXHR.status === 404){ - messageErreur = "Service introuvable."; - } - this.definirResultat(messageErreur); - }; - - ExportImport.prototype.traiterResultatVecteur = function(vecteur){ - vecteur.garderHistorique = true; - var occurence = vecteur.obtenirOccurences()[0]; - if(!occurence){ - return false; - } - vecteur.zoomerOccurence(occurence, this.options.zoom); - occurence.selectionner(); - if(this.options.idResultatTable){ - var nav = Aide.obtenirNavigateur(); - var panneauTable = nav.obtenirPanneauParId(this.options.idResultatTable, -1); - if(!panneauTable || !panneauTable.obtenirTypeClasse){return true}; - if (panneauTable.obtenirTypeClasse() === 'PanneauTable') { - panneauTable.ouvrirTableVecteur(vecteur); - } else if(panneauTable.obtenirTypeClasse() === 'PanneauOnglet'){ - var nouvelleTable = new PanneauTable({reductible: false, fermable: true}); - panneauTable.ajouterPanneau(nouvelleTable); - nouvelleTable.ouvrirTableVecteur(vecteur); - panneauTable.activerPanneau(nouvelleTable); - } - } - } - - ExportImport.prototype.creerVecteurRecherche = function(styles) { - var active = false; - if (!this.pineCheckbox || this.pineCheckbox.checked) { - active = true; - }; - - var visible = false; - if (this.saveCheckbox && this.saveCheckbox.checked) { - visible = true; - }; - - var vecteur = new Vecteur({active: active, visible: visible , selectionnable: false, suppressionPermise: true, titre: "Resultats Recheche " + this.options.titre + " - " + this.obtenirValeursRecherche()['RechercheTitle' + this.options.id], styles: styles}); - this.carte.gestionCouches.ajouterCouche(vecteur); - return vecteur; - }; - - /** - * Lire le résultat de la recherche - * @method - * @name Recherche#lireReponse - * @param {Objet} response Réponse de la recherche - */ - ExportImport.prototype.lireReponse = function(response) { - this.definirResultat("

    Surcharger la fonction lireReponse

    "); - }; - - ExportImport.prototype.ajouterPagination = function(nombreResultats) { - var ajoutFleche = ""; - - if (nombreResultats === (this.indexFin + 1)) { - ajoutFleche += "
    "; - ajoutFleche += ""; - - if ((this.indexDebut - (this.indexFin + 1)) < 0) { - ajoutFleche += ""; - } else { - ajoutFleche += ""; - } - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += "
    PrécédentPrécédent   Suivant
    "; - } else { - if (this.indexDebut > 0) { - ajoutFleche += "
    "; - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += ""; - ajoutFleche += "
    Précédent   Suivant
    "; - } - } - return ajoutFleche; - } - - ExportImport.prototype.initEventResultat = function() { - $(this.resultatPanneau.items.items[0].body.dom).find('#precedentRecherche') - .click($.proxy(this.appelPrecedent, this)); - $(this.resultatPanneau.items.items[0].body.dom).find('#suivantRecherche') - .click($.proxy(this.appelSuivant, this)); - $(this.resultatPanneau.items.items[0].body.dom).find('li.rechercheResultatsListe') - .click($.proxy(this.eventResultatClique, this)); - }; - - ExportImport.prototype.eventResultatClique = function(e) { - var id = $(e.target).parents('.rechercheResultatsListe').data('id'); - this.vecteur.deselectionnerTout(); - var occurence = this.vecteur.obtenirOccurenceParId(id); - if(!occurence){ - return false; - } - this.vecteur.zoomerOccurence(occurence, this.options.zoom); - occurence.selectionner(); - }; - - /** - * Préfixe de la recherche - * @method - * @name Recherche#obtenirRecherchePrefixe - * @returns {String} Préfixe - */ - ExportImport.prototype.obtenirRecherchePrefixe = function() { - return this.options.recherchePrefixe; - }; - - /** - * Type de la recherche - * @method - * @name Recherche#obtenirTypeRecherche - * @returns {String} Type de la recherche - */ - ExportImport.prototype.obtenirTypeRecherche = function() { - return this.options.typeRecherche; - }; - - /** - * Réinitialiser la recherche - * @method - * @name Recherche#reinitialiser - */ - ExportImport.prototype.reinitialiserVecteur = function() { - if(!this.vecteur){return false;} - if (!this.vecteur.options.visible) { - this.carte.gestionCouches.enleverCouche(this.vecteur); - } - }; - - /** - * Lancer la recherche. - * @method - * @name Recherche#lancerRecherche - */ - ExportImport.prototype.lancerRecherche = function(texte) { - if(texte){ - this._panel.items.get('ExportImportTitle' + this.options.id).setValue(texte); - } - if (this.aidePanneau) { - this.aidePanneau.collapse(); - }; - - //nouvelle recherche, remettre le compteur à zéro - this.indexDebut = 0; - this.exporter(); - }; - - /** - * Relancer la recherche avec une nouvelle valeur. - * @method - * @name Recherche#relancerRecherche - * @param {String} requete Nouvelle valeur pour la recherche - */ - ExportImport.prototype.relancerRecherche = function(requete) { - this.obtenirValeursRecherche()['RechercheTitle' + this.options.id] = requete; - this._panel.items.items[0].setValue(requete); - this.appelerService(); - }; - - /** - * Appeler le service pour obtenir les résultats suivants. - * @method - * @name Recherche#appelSuivant - */ - ExportImport.prototype.appelSuivant = function() { - this.indexDebut = this.indexDebut + (this.indexFin + 1); - this.appelerService(); - }; - - /** - * Appeler le service pour obtenir les résultats précédents. - * @method - * @name Recherche#appelPrecedent - */ - ExportImport.prototype.appelPrecedent = function() { - this.indexDebut = this.indexDebut - (this.indexFin + 1); - this.appelerService(); - }; - - /** - * Afficher le résultat. - * @method - * @name Recherche#definirResultat - */ - ExportImport.prototype.definirResultat = function(resultatTexte, callback, target) { - //Masquer le message d'attente - Aide.cacherMessageChargement(); - - this.resultatPanneau.show().expand(); - this.resultatPanneau.items.items[0].body.update(resultatTexte); - if (typeof callback === "function"){ - callback.call(target); - } - }; - - ExportImport.prototype.verifierParamsUrl = function(){ - var recherche = Aide.obtenirParametreURL('recherche'); - if(recherche === this.obtenirTypeRecherche()){ - var texte = Aide.obtenirParametreURL('texte'); - if(texte){ - var that=this; - var zoomP = Number(Aide.obtenirParametreURL('zoom')); - if(zoomP){ - this.options.zoom = zoomP; - } - var nav = Aide.obtenirNavigateur(); - if(nav.isReady){ - that.traiterParamsUrl(texte); - } else { - nav.ajouterDeclencheur('navigateurInit', function(){ - that.traiterParamsUrl(texte); - }); - } - } - } - }; - - ExportImport.prototype.traiterParamsUrl = function(texte){ - var that=this; - this.parent.ajouterDeclencheur('ajouterPanneau', function(e){ - if(that === e.panneau){ - e.target.enleverDeclencheur('ajouterPanneau', 'rechercheTraiterParamsURL'); - e.panneau.ajouterDeclencheur(that.obtenirTypeClasse()+'Active', function(e2){ - e2.target.enleverDeclencheur(that.obtenirTypeClasse()+'Active', 'rechercheTraiterParamsURL2'); - e2.target.lancerRecherche(texte); - }, {id: "rechercheTraiterParamsURL2"}); - e.target.activerPanneau(e.panneau); - } - }, {id: "rechercheTraiterParamsURL"}); - this.parent.ouvrir(); - }; - - /** - * Réinitialiser la recherche - * @method - * @name Recherche#reinitialiserRecherche - */ - ExportImport.prototype.reinitialiserRecherche = function(){ - this.reinitialiserVecteur(); - $.each(this._panel.items.items, function(index, item){ - if(item.xtype == "textfield" || item.xtype == "numberfield" || item.xtype == "combo"){ - item.reset(); - } - }); - - if(this.resultatPanneau.isVisible()){ - this.definirResultat(this.obtenirAideHTML()); - } - }; - - return ExportImport; - -}); - diff --git a/interfaces/navigateur/public/js/app/menu/exportImport/import.js b/interfaces/navigateur/public/js/app/menu/exportImport/import.js deleted file mode 100644 index 585bdf92..00000000 --- a/interfaces/navigateur/public/js/app/menu/exportImport/import.js +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Module pour l'objet {@link Panneau.RechercheAdresse}. - * @module rechercheAdresse - * @author Marc-André Barbeau, MSP - * @version 1.0 - * @requires recherche - */ -define(['exportImport', 'aide', 'point', 'style', 'limites'], function(ExportImport, Aide, Point, Style, Limites) { - /** - * Création de l'object Panneau.RechercheAdresse. - * Objet à ajouter à un objet localisation. - * @constructor - * @name Panneau.RechercheAdresse - * @class Panneau.RechercheAdresse - * @alias rechercheAdresse:Panneau.RechercheAdresse - * @extends Recherche - * @requires rechercheAdresse - * @param {string} [options.titre='Adr.'] Titre du panneau. - * @returns {Panneau.RechercheAdresse} Instance de {@link Panneau.RechercheAdresse} - */ - function Import(options){ - this.options = options || {}; - this.defautOptions = $.extend({}, this.defautOptions, { - typeRecherche:"import", - titre:"Import" - }); - }; - - Import.prototype = new ExportImport(); - Import.prototype.constructor = Import; - - /** - * Initialisation de l'object recherche. - * @method - * @name Recherche#_init - */ - Import.prototype._init = function() { - var that = this; - - this.items.push(this.obtenirItemsForm()); - - this._panel = new Ext.FormPanel({ - title: this.obtenirTitre() , - id: this.options.id, - hideLabel: true, - frame: true, - border: false, - bodyStyle: 'padding:0px 17px 0 0px; overflow-y: auto;', - scope: this, - items: this.items, - //height:'fit', - hidden: false, - //autoScroll: true, - buttons: this.obtenirBoutonLancer(), - listeners: { - afterrender: function(e) { - that.callbackCreation(); - }, - activate: function(e){ - that.declencher({type: that.obtenirTypeClasse()+'Active'}); - } - } - }); - }; - - - /** - * Obtenir l'aide en format HTML - * @method - * @name RechercheAdresse#obtenirAideHTML - * @returns {String} Aide - */ - Import.prototype.obtenirItemsForm = function() { - - var szDefaultOutputFormat = this.oOutputInputFormatStore.data.items[0].data.value; - var oOutputFormatComboBox = new Ext.form.ComboBox({ - id : 'importOutputFormat', - fieldLabel: 'Format Input', - store: this.oOutputInputFormatStore, - valueField: 'value', - value: szDefaultOutputFormat, - displayField:'text', - editable: false, - mode: 'local', - triggerAction: 'all', - lazyRender: true, - lazyInit: false, - listWidth: 150, - submitValue: false - }); - - return [oOutputFormatComboBox]; - }; - - /** - * Obtenir l'aide en format HTML - * @method - * @name RechercheAdresse#obtenirAideHTML - * @returns {String} Aide - */ - Import.prototype.obtenirAideHTML = function() { - return "Ex:
    "+ - "->no. immeuble et nom de rue
    "+ - "->no. immeuble et nom de rue et ville
    "+ - "->nom de rue et ville
    "+ - "->nom de rue + nom de rue, ville (intersection)
    " + - this.obtenirLienPDF() + - this.obtenirCopyright(); - }; - - /** - * Obtenir le droit d'auteur en format HTML - * @method - * @name RechercheAdresse#obtenirCopyright - * @returns {String} Droit d'auteur - */ - Import.prototype.obtenirCopyright = function() { - return ""+ - "\"Adresse"; - }; - - - Import.prototype.lireReponse = function(data, textStatus, jqXHR) { - if(!jqXHR.responseJSON){ - this.definirResultat('Erreur lors de la recherche.'); - return false; - } - - var responseJSON = jqXHR.responseJSON; - - var style = new Style({ - visible: true, - icone: Aide.utiliserBaseUri('images/marqueur/marker-orange.png'), - iconeHauteur: 34, - iconeLargeur: 20, - iconeOffsetX: -10, - iconeOffsetY: -34, - filtres: [ { - filtre: "[geocodeMatchCode]>0", - style: {icone: Aide.utiliserBaseUri('images/marqueur/marker-yellow.png')} - }, { - filtre: "[geocodeMatchCode]==100", - style: {icone: Aide.utiliserBaseUri('images/marqueur/marker-green.png')} - }, { - style: {} - } - ] - }); - - var styles = {defaut: {visible: false}, select: style}; - - var vecteur = this.creerVecteurRecherche(styles); - $.each(responseJSON.geocoderReponseListe, function(key, value) { - var point; - if (!value.localisation) { - return true; - } - if (!value.localisation.point.x || !value.localisation.point.y) { - var x = Number(value.localisation.enveloppe.Xmin) + ((Number(value.localisation.enveloppe.Xmax)-Number(value.localisation.enveloppe.Xmin))/2); - var y = Number(value.localisation.enveloppe.Ymin) + ((Number(value.localisation.enveloppe.Ymax)-Number(value.localisation.enveloppe.Ymin))/2); - point = new Point(x, y); - point.limites = new Limites(value.localisation.enveloppe.Xmin, value.localisation.enveloppe.Ymin, value.localisation.enveloppe.Xmax, value.localisation.enveloppe.Ymax); - } else { - point = new Point(value.localisation.point.x, value.localisation.point.y); - } - vecteur.creerOccurence(point, value); - }); - - vecteur.templates.table = { - colonnes: [{ - utiliserBase: false, - titre: 'id', - triable: true, - propriete: 'id' - }, { - titre: 'Adresse', - triable: true, - propriete: 'adresseLibre' - }] - }; - - this.traiterResultatVecteur(vecteur, responseJSON.nombreResultat); - }; - - Import.prototype.traiterResultatVecteur = function(vecteur, nombreResultats) { - nombreResultats = nombreResultats || vecteur.listeOccurences.length ; - - var resultat = this.ajouterPagination(nombreResultats); - var debut = this.indexDebut+1; - var fin = this.indexDebut+vecteur.listeOccurences.length; - if(fin === 0){ - this.definirResultat('Aucun résultat'); - return false; - } - resultat += "

    Résultats (" + debut + " - " + fin + ")

    "; - $.each(vecteur.listeOccurences, function(row, occurence) { - var title = occurence.proprietes.statut.description || ''; - if(occurence.proprietes.statut.commentaire){ - title += '\nCommentaire: ' + occurence.proprietes.statut.commentaire; - } - var couleur = 'blue'; - if(occurence.proprietes.statut.etat && occurence.proprietes.statut.etat !== 'Officiel'){ - couleur = '#ff7200'; - } - resultat += "
  • » " + - occurence.obtenirPropriete("adresseLibre")+"
  • "; - }); - this.vecteur = vecteur; - this.definirResultat(resultat, this.initEventResultat, this); - ExportImport.prototype.traiterResultatVecteur.call(this, vecteur); - }; - - return Import; - -}); \ No newline at end of file diff --git a/interfaces/navigateur/public/js/app/outil/outilExportFichier.js b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js new file mode 100644 index 00000000..d92d859c --- /dev/null +++ b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js @@ -0,0 +1,407 @@ +/** + * Outil permettant l'importation de fichier géométrique dans la carte + * Liste des extensions acceptées (selon le service Ogre) + * Source: http://ogre.adc4gis.com/ + * BNA .bna - + * CSV .csv - Common spatial columns (e.g. lon, lat, the_geom) will be translated, for less common, use a VRT file + * DGN .dgn - + * DXF .dxf - + * ESRI Shapefile - .shp, .dbf, and .shx (.prj optional) - package in zip file + * GeoConcept .gxt or .txt - + * GeoJSON .json or .geojson - + * GeoRSS .rss, .georss, or .xml - + * GML .gml .gml and .xsd + * GMT .gmt - + * GPX .gpx - + * Interlis 1 .itf .itf and .ili (.fmt optional) + * KML / KMZ .kml or .kmz - + * MapInfo - .tab, .map, .id, and .dat + * S-57 .000 .000 (.001-.00N optional) + * TIGER - at least an .rt1 + * VRT + */ + +define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, AnalyseurGeoJSON, Vecteur) { + function OutilExportFichier(options){ + this.options = options || {}; + this.defautOptions = $.extend({}, this.defautOptions, { + icone: Aide.obtenirCheminRacine()+'images/toolbar/gps_up.png', + infobulle: "Exporter la sélection en fichier géométrique" + }); + + this.oOutputInputFormatStore = new Ext.data.SimpleStore({ + fields: ['value', 'text'], + data : [['BNA', 'bna'], + ['CSV', 'csv'], + //['DGN', 'dgn'], + //['DXF', 'dxf'], + ['ESRI Shapefile', 'ESRI Shapefile'], + //['GEOCONCEPT', 'Geoconcept'], + ['GEOJSON', 'GeoJSON'], + ['GEORSS', 'GeoRSS'], + ['GML', 'GML'], + // ['GMT', 'GMT'], + ['GPX', 'GPX'], + ['KML', 'KML'], + //['MapInfo File', 'MapInfo File'], + // ['TIGER', 'TIGER'], + ['PGDUMP', 'PGDump'], + //['VRT', 'VRT'] + ] + }); + + this.oEPSGStore = new Ext.data.SimpleStore({ + fields: ['value', 'text'], + data : [['32198', 'EPSG:32198'], + ['3857', 'EPSG:3857'], + ['4326', 'EPSG:4326'] + ] + }); + + + }; + + OutilExportFichier.prototype = new Outil(); + OutilExportFichier.prototype.constructor = OutilExportFichier; + + /** Action de l'outil + * @method + * @name OutilExportFichier#executer + */ + OutilExportFichier.prototype.executer = function() { + var that = this; + + //Valider que le service est défini dans le fichier de configuration + if(this.options.urlService === undefined) { + Aide.afficherMessage("Erreur", "Vous devez ajouter un service de conversion pour cet outil dans votre fichier de configuration."); + return false; + } + + //Valider que le service défini est fonctionnel + this.verifierServiceDisponible(this.options.urlService, function(status){ + if(status === 200){ + that.exporter(); + } + else{ + Aide.afficherMessage("Erreur", "Le service de conversion n'est pas disponible."); + } + }); + + }; + + /** + * Afficher le menu d'import + * @method + * @name OutilExportFichier#importer + */ + OutilExportFichier.prototype.exporter = function(){ + + var that = this; + this.nomCouche = "coucheFichier"; + this.listeFichierLatLon = ["gpx"]; + this.projection = this.carte.obtenirProjection(); + + var myuploadform= new Ext.FormPanel({ + id: "idFormExport", + fileUpload: true, + width: 400, + autoHeight: true, + frame: true, + bodyStyle: 'padding: 10px 10px 10px 10px;', + standardSubmit:false, + defaults: { + msgTarget: 'side' + }, + items:this.obtenirItemsForm(), + buttons: [{ + text: 'Exporter', + handler: function(){ + that.lancerExport(); + } + }, + { + text:'Fermer', + handler: function(){ + myWin.close(); + } + }] + }); + + var myWin = new Ext.Window({ + id : 'myWin', + title : "Exportation de occurences sélectionnées", + autoHeight : true, + width : 400, + items : [myuploadform], + modal : true + }); + + myWin.show(); + + this.myWin = myWin; + + }; + + + /** + * Obtenir et exporter la sélection + * @method + * @name OutilExportSHP#exporter + * @returns {Boolean} + */ + OutilExportFichier.prototype.lancerExport = function(){ + var that = this; + var geojson; + this.tabOccu = new Array(); + var analyseur = new AnalyseurGeoJSON({ + projectionCarte: this.carte.obtenirProjection() + }); + var nbFichier=0; + var couchesOccurencesSelect = this.carte.gestionCouches.obtenirOccurencesSelectionnees(); + this.tabMethod = new Array(); + + //Pour chaque couches dans la carte + $.each(couchesOccurencesSelect, function(index, couche) { + that.tabOccu = new Array(); + + //Pour chaque occurence de la couche + $.each(couche, function(ind, occu) { + //convertir les occurence en 4326 pour le shapeFile + that.tabOccu.push(occu.projeter("EPSG:4326")); + }); + + /*Si des occurences sont sélectionnées pour la couche, on les convertit en json et on appelle la fonction + * de conversion en shapeFile + */ + if(that.tabOccu.length !== 0){ + geojson = JSON.parse(analyseur.ecrire(that.tabOccu)); + //that.download("http://ogre.adc4gis.com/convertJson", "post", JSON.stringify(geojson), index); + that.appelerService(that.options.urlService, JSON.stringify(geojson), index, nbFichier); + nbFichier++; + } + }); + + //Si aucun fichier n'a été créé + if(nbFichier === 0){ + Aide.afficherMessage("Aucune sélection", "Vous devez sélectionner au moins un élément avant de pouvoir l’exporter."); + return false; + } + }; + + + /** + * Appeler le service qui retournera le fichier zip de shapeFile selon les géométries sélectionnés de la couche + * @method + * @name OutilExportSHP#appelerService + * @param {string} url URL du service à de conversion shapeFile + * @param {json} json contenant les géométries à convertir en shapeFile + * @param {string} outputName le nom du fichier de sortie + * @returns {file} Retour le fichier selon outputName + shape.zip + */ + OutilExportFichier.prototype.appelerService = function(url, json, outputName, nbFichier){ + if( url && json ){ + + //Retirer l'instance du iframe précédent + /**Ne pas faire avec le setTimeOut à la fin car cause des problème si l'usager prend du temps à enregistrer + * setTimeout((function(iframe) { + return function() { + iframe.remove(); + }; + })(iframe), 4000); + */ + if($("#iframeExportShp"+nbFichier-1)){ + $("#iframeExportShp"+nbFichier-1).remove(); + } + + /*Créer un iframe qui contiendra le form qui servira à soumettre les paramètres aux services de conversion + * On doit faire ainsi afin de nous permettre de retourner plusieurs fichiers. + */ + var iframe = $(''); + $('body').append(iframe); + var content = iframe[0].contentDocument; + + var inputs = ''; + + inputs+=''; + if(this.obtenirValeursRecherche()['exportOutputFormat']) + inputs+=''; + + if(this.obtenirValeursRecherche()['exportEPSGOutput']) + inputs+=''; + + if(this.obtenirValeursRecherche()['exportEPSGInput']) + inputs+=''; + + if(outputName){ + inputs+=''; + } + + var form = '
    '+inputs+'
    '; + content.write(form); + $('form', content).submit(); + /* setTimeout((function(iframe) { + return function() { + iframe.remove(); + }; + })(iframe), 4000);*/ + }; + }; + + /** + * Importer le GeoJson converti du fichier dans la carte + * @method + * @name OutilExportFichier#importerJson + * @param {json} geoJson données des géométries du fichier converti + */ + OutilExportFichier.prototype.importerJson = function(geoJson, filename){ + //Boucle de nettoyage des anomalies des géométries + //TODO si d'autres ajouts, mettre dans une fonction + $.each(geoJson.features, function(index, feat) { + //Si un point, éliminer la dimension z d'une géométrie point si définie (Igo ne supporte pas cette dimension) + if(feat.geometry.type == "Point" && feat.geometry.coordinates.length == 3) { + feat.geometry.coordinates.pop(); + } + + //Illiminé les doublons de coordonnées pour chaque géométrie de type ligne + if(feat.geometry.type === "Line" || feat.geometry.type === "LineString"){ + var coordPrec = ""; + var coordIndexToPop = new Array(); + $.each(feat.geometry.coordinates, function(ind, coord){ + if(coordPrec !== "" && coordPrec[0] === coord[0] && coordPrec[1] === coord[1]){ + coordIndexToPop.push(ind); + } + coordPrec = coord; + }); + if (coordIndexToPop.length > 0) { + $.each(coordIndexToPop, function(ind, indToPop){ + //Car la position diminue de 1 à chaque fois qu'on retire un élément + var posToPop = indToPop-(ind*1); + feat.geometry.coordinates.splice(posToPop, 1); + }); + } + } + }); + + //Si le service retourne le crs, l'écraser car le format CRS84 n'est pas celui de nos projections du fichier proj4.js + //Par défaut on paramètre le service avec "targetSrs": "EPSG:4326" pour la projection de sortie. compatible avec l'analyseurGeoJson + if(geoJson.crs){ + geoJson.crs = undefined; + } + + var gestionCouche = this.carte.gestionCouches; + + var analyseur = new AnalyseurGeoJSON({ + projectionCarte: this.carte.obtenirProjection()}); + + var coucheImportFichier = gestionCouche.obtenirCoucheParId(this.nomCouche + filename); + + if(coucheImportFichier === undefined){ + coucheImportFichier = new Vecteur({titre: this.nomCouche + filename, id:this.nomCouche + filename, active:true, visible:true, suppressionPermise:true}); + gestionCouche.ajouterCouche(coucheImportFichier); + } + + var occurences = analyseur.lire(geoJson); + coucheImportFichier.ajouterOccurences(occurences); + coucheImportFichier.zoomerOccurences(); + }; + + /** + * Vérifier que l'url du service est disponible + * @method + * @name OutilExportFichier#verifierServiceDisponible + * @param {type} url url du service à valider + * @param {type} fct Fonction à exécuter suite aux résultats + */ + OutilExportFichier.prototype.verifierServiceDisponible = function(url, fct){ + jQuery.ajax({ + url: url, + dataType: 'text', + type: 'POST', + complete: function(xhr){ + if(typeof fct === 'function') + fct.apply(this, [xhr.status]); + } + }); + }; + + /** + * Obtenir l'aide en format HTML + * @method + * @name RechercheAdresse#obtenirAideHTML + * @returns {String} Aide + */ + OutilExportFichier.prototype.obtenirItemsForm = function() { + + var szDefaultOutputFormat = this.oOutputInputFormatStore.data.items[0].data.value; + var oOutputFormatComboBox = new Ext.form.ComboBox({ + id : 'exportOutputFormat', + fieldLabel: 'Format Output', + store: this.oOutputInputFormatStore, + valueField: 'value', + value: szDefaultOutputFormat, + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 75 + }); + + oOutputFormatComboBox.on( 'select', function(combo, record, index ) { + if(record.data.value === "GEORSS" || record.data.value === "KML"){ + this.ownerCt.getComponent("exportEPSGOutput").setDisabled(false); + this.ownerCt.getComponent("exportEPSGOutput").setValue("EPSG:4326"); + } + }); + + var oNomFichier = { + xtype: 'textarea', + fieldLabel: 'Préfixe du nom du fichier', + id: 'exportTitle', + maxLength: 50, + width : 75 + }; + + var szDefaultEPSG = this.oEPSGStore.data.items[0].data.value; + var oEPSGComboBox = new Ext.form.ComboBox({ + id : 'exportEPSGOutput', + fieldLabel: 'EPSG Output', + store: this.oEPSGStore, + valueField: 'value', + value: szDefaultEPSG, + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 75 + }); + + var oSkipFailure = + { + xtype: 'checkbox', + id : 'skipfailureCheckBox', + fieldLabel : ' Ne pas prendre en compte les erreurs.' + } ; + + + + return [oOutputFormatComboBox, oEPSGComboBox]; + }; + + /** + * Obtenir les valeurs des champs de recherche. + * @method + * @name Recherche#obtenirValeursRecherche + * @returns {array} Tableau des valeurs de recherche + */ + OutilExportFichier.prototype.obtenirValeursRecherche = function() { + //Retourner la valeur des éléments contenus dans le formulaire + return this.myWin.getComponent("idFormExport").getForm().getValues(); + }; + + return OutilExportFichier; + +}); \ No newline at end of file diff --git a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js index f1a6e415..b0645a37 100644 --- a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js +++ b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js @@ -165,6 +165,9 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload //Projection de la carte //data.append("targetSrs", that.projection); data.append("targetSrs", "EPSG:4326"); + + //type de ficheir voulu + data.append("formatOutput", "GEOJSON"); //Projection source si défini var sourceSrs = jQuery('input[id^="sourceSrs"]').val(); From da495afe5d104babdad7adf6acc9f0f4a4a12a90 Mon Sep 17 00:00:00 2001 From: Thyn Bos Date: Thu, 13 Aug 2015 15:27:16 -0400 Subject: [PATCH 011/232] Correction installation windows checkout dev pour librairie --- .../InstallationDeveloppementIGOWindows.md | 68 ++++++++++-------- doc/installation/MarkdownImage/image51.png | Bin 33635 -> 34998 bytes 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/doc/installation/InstallationDeveloppementIGOWindows.md b/doc/installation/InstallationDeveloppementIGOWindows.md index eee3f987..2a19a708 100644 --- a/doc/installation/InstallationDeveloppementIGOWindows.md +++ b/doc/installation/InstallationDeveloppementIGOWindows.md @@ -86,8 +86,8 @@ apache. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alias /api "C:/wamp/www/igo/interfaces/navigateur/api" - Alias /librairie "C:/wamp/www/igo/librairie" - Alias /pilotage "C:/wamp/www/igo/pilotage" + Alias /librairie "C:/wamp/www/igo/librairie" + Alias /pilotage "C:/wamp/www/igo/pilotage" Alias /navigateur "C:/wamp/www/igo/interfaces/navigateur" @@ -97,25 +97,25 @@ apache. RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] - + RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] - - - - - AddDefaultCharset UTF-8 - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] - - + + + + + AddDefaultCharset UTF-8 + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + + @@ -124,17 +124,17 @@ apache. RewriteRule (.*) public/$1 [L] php_value max_input_vars 2000 - - - - AddDefaultCharset UTF-8 - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] - - + + + + AddDefaultCharset UTF-8 + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -353,12 +353,9 @@ git clone https://github.com/infra-geo-ouverte/igo.git ![]() -Faire la ligne commande suivante et vérifier que c’est le code de la branche de -« dev » et non « master » entre parenthèses : +  -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -cd igo -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  ![]() @@ -385,6 +382,15 @@ git clone https://github.com/infra-geo-ouverte/igo-lib.git librairie ![]() +Faire la ligne commande suivante et vérifier que c’est le code de la branche de +« dev » et non « master » entre parenthèses : + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cd librairie +git checkout dev + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Configuration du projet navigateur ---------------------------------- diff --git a/doc/installation/MarkdownImage/image51.png b/doc/installation/MarkdownImage/image51.png index fe7f524f65d65ee1089912b741aa5fd6e7b741b8..16a5b795374aed0d38584a31a26940d41382a8b7 100644 GIT binary patch literal 34998 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
  • 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 Jk+XR5{{R`Ue?0&I literal 33635 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 From 4e71e3f34b966843b1f9ab9536631f7b262d811b Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 07:51:41 -0400 Subject: [PATCH 012/232] =?UTF-8?q?permet=20d'avoir=20une=20occurence=20sa?= =?UTF-8?q?ns=20g=C3=A9om=C3=A9trie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigateur/public/js/app/analyseur/analyseurGeoJSON.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/navigateur/public/js/app/analyseur/analyseurGeoJSON.js b/interfaces/navigateur/public/js/app/analyseur/analyseurGeoJSON.js index a4d203a1..239b7c78 100644 --- a/interfaces/navigateur/public/js/app/analyseur/analyseurGeoJSON.js +++ b/interfaces/navigateur/public/js/app/analyseur/analyseurGeoJSON.js @@ -14,7 +14,7 @@ define(['occurence'], function(Occurence) { throw err; } - if (this.internalProjection && this.externalProjection) { + if (this.internalProjection && this.externalProjection && geometry !== null) { geometry.transform(this.externalProjection, this.internalProjection); } From 2e33a423016f7af71bc1a105df49ae328558564f Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 07:52:32 -0400 Subject: [PATCH 013/232] =?UTF-8?q?ajout=20du=20s=C3=A9parateur=20pour=20l?= =?UTF-8?q?e=20CSV=20et=20d'exemple=20de=20coordonn=C3=A9es=20pour=20le=20?= =?UTF-8?q?EPSG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/js/app/outil/outilExportFichier.js | 104 ++++++++++++++---- 1 file changed, 85 insertions(+), 19 deletions(-) diff --git a/interfaces/navigateur/public/js/app/outil/outilExportFichier.js b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js index d92d859c..3bfa39ac 100644 --- a/interfaces/navigateur/public/js/app/outil/outilExportFichier.js +++ b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js @@ -51,11 +51,40 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A }); this.oEPSGStore = new Ext.data.SimpleStore({ + fields: ['value', 'text', 'exemple'], + data : [ + ['EPSG:32198', 'EPSG:32198', '"-119820.522383, 594656.307879"
    en mètres'], + ['EPSG:3799', 'EPSG:3799 (NAD83 CSRS MTQ/Lambert)', '"788540.5947, 593873.0983"
    en mètres'], + ['EPSG:3799', 'EPSG:3797 (NAD27 MTQ/Lambert)', '"788509.4700, 593871.1210"
    en mètres'], + ['EPSG:4269', 'EPSG:4269 (NAD83)', '"-70.157745, 49.342105"
    en degrés décimaux'], + ['EPSG:3857', 'EPSG:3857 (Google)(900913)', '"-7809924.526660, 6333110.209241"
    en mètres'], + ['EPSG:4326', 'EPSG:4326 (WGS84)', '"-70.157745, 49.342105"
    en degrés décimaux'], + ['EPSG:26917', 'EPSG:26917 UTM zone 17', '"1286853.2279, 5522280.1159"
    en mètres'], + ['EPSG:26918', 'EPSG:26918 UTM zone 18', '"851679.4746, 5476773.2620"
    en mètres'], + ['EPSG:26919', 'EPSG:26919 UTM zone 19', '"415901.8955, 5466131.7953"
    en mètres'], + ['EPSG:26920', 'EPSG:26920 UTM zone 20', '"-19734.6510, 5490174.6287"
    en mètres'], + ['EPSG:26921', 'EPSG:26921 UTM zone 21', '"-454452.5742, 5549309.8653"
    en mètres'], + ['EPSG:32181', 'EPSG:32181 MTM Zone 1', '"-938855.7578, 5610376.9310"
    en mètres'], + ['EPSG:32182', 'EPSG:32182 MTM Zone 2', '"-722260.0446, 5564308.0180"
    en mètres'], + ['EPSG:32183', 'EPSG:32183 MTM Zone 3', '"-541361.6573, 5532851.8772"
    en mètres'], + ['EPSG:32184', 'EPSG:32184 MTM Zone 4', '"-323922.4119, 5503290.8654"
    en mètres'], + ['EPSG:32185', 'EPSG:32185 MTM Zone 5', '"-106202.4196. 5482544.9072"
    en mètres'], + ['EPSG:32186', 'EPSG:32186 MTM Zone 6', '"111693.0862, 5470526.2767"
    en mètres'], + ['EPSG:32187', 'EPSG:32187 MTM Zone 7', '"329668.8844, 5467183.8387"
    en mètres'], + ['EPSG:32188', 'EPSG:32188 MTM Zone 8', '"547634.4199, 5472503.3319"
    en mètres'], + ['EPSG:32189', 'EPSG:32189 MTM Zone 9', '"765498.5383, 5486507.4448"
    en mètres'], + ['EPSG:32190', 'EPSG:32190 MTM Zone 10', '"983164.2090, 5509255.6947"
    en mètres'] + ] + }); + + this.separateurStore = new Ext.data.SimpleStore({ fields: ['value', 'text'], - data : [['32198', 'EPSG:32198'], - ['3857', 'EPSG:3857'], - ['4326', 'EPSG:4326'] - ] + data : [ + ['COMMA', ','], + ['SEMICOLON', ';'], + ['TAB', '*tabulation*'], + ['SPACE', '*espace*'] + ] }); @@ -104,11 +133,12 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A var myuploadform= new Ext.FormPanel({ id: "idFormExport", fileUpload: true, - width: 400, + width: 430, autoHeight: true, frame: true, bodyStyle: 'padding: 10px 10px 10px 10px;', standardSubmit:false, + labelWidth: 200, defaults: { msgTarget: 'side' }, @@ -131,7 +161,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A id : 'myWin', title : "Exportation de occurences sélectionnées", autoHeight : true, - width : 400, + autoWidth: true, items : [myuploadform], modal : true }); @@ -236,6 +266,11 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A inputs+=''; } + if(this.obtenirValeursRecherche()['exportSeparateurId']) + inputs+=''; + + + var form = '
    '+inputs+'
    '; content.write(form); $('form', content).submit(); @@ -345,14 +380,25 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A triggerAction: 'all', lazyRender: true, lazyInit: false, - listWidth: 75 + listWidth: 125 }); oOutputFormatComboBox.on( 'select', function(combo, record, index ) { - if(record.data.value === "GEORSS" || record.data.value === "KML"){ - this.ownerCt.getComponent("exportEPSGOutput").setDisabled(false); + + if(record.data.value === "GEORSS" || record.data.value === "KML" ||  + record.data.value === "GPX" ){ + this.ownerCt.getComponent("exportEPSGOutput").setDisabled(true); this.ownerCt.getComponent("exportEPSGOutput").setValue("EPSG:4326"); + }else{ + this.ownerCt.getComponent("exportEPSGOutput").setDisabled(false); } + + if(record.data.value === "CSV"){ + this.ownerCt.getComponent("exportSeparateurId").setVisible(true); + }else{ + this.ownerCt.getComponent("exportSeparateurId").setVisible(false); + } + }); var oNomFichier = { @@ -366,7 +412,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A var szDefaultEPSG = this.oEPSGStore.data.items[0].data.value; var oEPSGComboBox = new Ext.form.ComboBox({ id : 'exportEPSGOutput', - fieldLabel: 'EPSG Output', + fieldLabel: 'Système de coordonnée
    '+this.oEPSGStore.data.items[0].data.exemple, store: this.oEPSGStore, valueField: 'value', value: szDefaultEPSG, @@ -376,19 +422,39 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A triggerAction: 'all', lazyRender: true, lazyInit: false, - listWidth: 75 + listWidth: 175 }); - var oSkipFailure = - { - xtype: 'checkbox', - id : 'skipfailureCheckBox', - fieldLabel : ' Ne pas prendre en compte les erreurs.' - } ; + oEPSGComboBox.on( 'select', function(combo, record, index ) { + combo.label.update("Système de coordonnée
    "+record.data.exemple); + }); + var separateurDefaut = this.separateurStore.data.items[0].data.value; + var separateurComboBox = new Ext.form.ComboBox({ + id : 'exportSeparateurId', + fieldLabel: 'Séparateur', + store: this.separateurStore, + valueField: 'value', + value: separateurDefaut, + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 75, + hidden : true + }); + var oSkipFailure = + { + xtype: 'checkbox', + id : 'skipfailureCheckBox', + fieldLabel : ' Ne pas prendre en compte les erreurs.' + } ; + - return [oOutputFormatComboBox, oEPSGComboBox]; + return [oOutputFormatComboBox, oEPSGComboBox, separateurComboBox]; }; /** @@ -399,7 +465,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A */ OutilExportFichier.prototype.obtenirValeursRecherche = function() { //Retourner la valeur des éléments contenus dans le formulaire - return this.myWin.getComponent("idFormExport").getForm().getValues(); + return this.myWin.getComponent("idFormExport").getForm().getFieldValues(); }; return OutilExportFichier; From 835cb405831c52e7cb5f4b63a16adaa765b7987b Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 07:54:22 -0400 Subject: [PATCH 014/232] =?UTF-8?q?ajout=20des=20champs=20pour=20le=20nom?= =?UTF-8?q?=20des=20colonnes=20contenant=20les=20coordonn=C3=A9es=20pour?= =?UTF-8?q?=20un=20CSV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/js/app/outil/outilImportFichier.js | 121 ++++++++++++++---- 1 file changed, 94 insertions(+), 27 deletions(-) diff --git a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js index b0645a37..70deef69 100644 --- a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js +++ b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js @@ -70,6 +70,14 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload } }); + this.ouiNonStore = new Ext.data.SimpleStore({ + fields: ['value', 'text'], + data : [ + ['Oui', 'Oui'], + ['Non', 'Non'] + ] + }); + }; /** @@ -116,19 +124,74 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload else{ this.ownerCt.form.findField("sourceSrs").hide(); } + + if(extension.toUpperCase() === 'CSV'){ + this.ownerCt.form.findField('geocodageLotId').show(); + } + else{ + this.ownerCt.form.findField('geocodageLotId').hide(); + } } } }, { xtype:'textfield', - fieldLabel: 'Projection source du fichier : EPSG', + fieldLabel: 'Projection du fichier : EPSG', id: 'sourceSrs', allowBlank: true, value: '', labelStyle: 'width:195px', style: {width:'75px'}, hidden: true - }], + }, + { + xtype: 'combo', + id : 'geocodageLotId', + fieldLabel: 'Votre CSV contient 2 colonnes nommées X et Y
    ou latitude et longitude ?', + store: this.ouiNonStore, + valueField: 'value', + value: 'Oui', + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 75, + hidden : true, + listeners:{ + select : function(combo, record, index){ + if(record.data.value === 'Non'){ + this.ownerCt.form.findField("X_POSSIBLE_NAMES").show(); + this.ownerCt.form.findField("Y_POSSIBLE_NAMES").show(); + }else{ + this.ownerCt.form.findField("X_POSSIBLE_NAMES").hide(); + this.ownerCt.form.findField("Y_POSSIBLE_NAMES").hide(); + } + } + } + }, + { + xtype:'textfield', + fieldLabel: 'nom de la colonne des X(longitude)', + id: 'X_POSSIBLE_NAMES', + allowBlank: true, + value: '', + labelStyle: 'width:195px', + style: {width:'75px'}, + hidden: true + }, + { + xtype:'textfield', + fieldLabel: 'nom de la colonne des Y(latitude)', + id: 'Y_POSSIBLE_NAMES', + allowBlank: true, + value: '', + labelStyle: 'width:195px', + style: {width:'75px'}, + hidden: true + } + ], buttons: [{ text: 'Importer', handler: function(){ @@ -168,7 +231,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload //type de ficheir voulu data.append("formatOutput", "GEOJSON"); - + //Projection source si défini var sourceSrs = jQuery('input[id^="sourceSrs"]').val(); if(sourceSrs !== ""){ @@ -190,7 +253,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload Aide.afficherMessage("Erreur", "Fichier invalide, les formats permis sont: BNA, CSV, DGN, DXF, ESRI Shapefile, GeoConcept, GeoJSON, GeoRSS, GML, GMT, GPX, Interlis 1, KML, KMZ, MapInfo, S-57, TIGER, VRT"); } else{ - that.importerJson(data); + that.importerJson(data, filename); } } }); @@ -208,8 +271,9 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload var myWin = new Ext.Window({ id : 'myWin', - height : 200, - width : 400, + title : 'Importation de fichier', + autoHeight : true, + autoWidth : true, items : [myuploadform], modal : true }); @@ -228,27 +292,30 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload //Boucle de nettoyage des anomalies des géométries //TODO si d'autres ajouts, mettre dans une fonction $.each(geoJson.features, function(index, feat) { - //Si un point, éliminer la dimension z d'une géométrie point si définie (Igo ne supporte pas cette dimension) - if(feat.geometry.type == "Point" && feat.geometry.coordinates.length == 3) { - feat.geometry.coordinates.pop(); - } - //Illiminé les doublons de coordonnées pour chaque géométrie de type ligne - if(feat.geometry.type === "Line" || feat.geometry.type === "LineString"){ - var coordPrec = ""; - var coordIndexToPop = new Array(); - $.each(feat.geometry.coordinates, function(ind, coord){ - if(coordPrec !== "" && coordPrec[0] === coord[0] && coordPrec[1] === coord[1]){ - coordIndexToPop.push(ind); - } - coordPrec = coord; - }); - if (coordIndexToPop.length > 0) { - $.each(coordIndexToPop, function(ind, indToPop){ - //Car la position diminue de 1 à chaque fois qu'on retire un élément - var posToPop = indToPop-(ind*1); - feat.geometry.coordinates.splice(posToPop, 1); - }); + if(feat.geometry){ + //Si un point, éliminer la dimension z d'une géométrie point si définie (Igo ne supporte pas cette dimension) + if(feat.geometry.type == "Point" && feat.geometry.coordinates.length == 3) { + feat.geometry.coordinates.pop(); + } + + //Illiminé les doublons de coordonnées pour chaque géométrie de type ligne + if(feat.geometry.type === "Line" || feat.geometry.type === "LineString"){ + var coordPrec = ""; + var coordIndexToPop = new Array(); + $.each(feat.geometry.coordinates, function(ind, coord){ + if(coordPrec !== "" && coordPrec[0] === coord[0] && coordPrec[1] === coord[1]){ + coordIndexToPop.push(ind); + } + coordPrec = coord; + }); + if (coordIndexToPop.length > 0) { + $.each(coordIndexToPop, function(ind, indToPop){ + //Car la position diminue de 1 à chaque fois qu'on retire un élément + var posToPop = indToPop-(ind*1); + feat.geometry.coordinates.splice(posToPop, 1); + }); + } } } }); @@ -267,7 +334,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload var coucheImportFichier = gestionCouche.obtenirCoucheParId(this.nomCouche + filename); if(coucheImportFichier === undefined){ - coucheImportFichier = new Vecteur({titre: this.nomCouche + filename, id:this.nomCouche + filename, active:true, visible:true, suppressionPermise:true}); + coucheImportFichier = new Vecteur({titre: filename, id:this.nomCouche + filename, active:true, visible:true, suppressionPermise:true}); gestionCouche.ajouterCouche(coucheImportFichier); } From 324831c0945c62867fba9e220fd92afafd0b36b7 Mon Sep 17 00:00:00 2001 From: matrottier Date: Fri, 14 Aug 2015 09:51:35 -0400 Subject: [PATCH 015/232] ajout de licence externe --- LICENCE.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/LICENCE.txt b/LICENCE.txt index 13e88135..cbbda773 100644 --- a/LICENCE.txt +++ b/LICENCE.txt @@ -119,3 +119,14 @@ Pour UMN MapServer (https://github.com/mapserver/mapserver), licence de type MIT https://github.com/mapserver/mapserver/blob/branch-7-0/README +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +Pour Phalcon (https://github.com/phalcon/cphalcon/tree/1.3.2), licence de type BSD : + +https://raw.githubusercontent.com/phalcon/cphalcon/1.3.2/docs/LICENSE.txt + +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +Pour Php (https://secure.php.net/), licence de type BSD : + +http://php.net/license/ From 8de3202295f827f21a046d79ec08ab280d7e0357 Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 09:54:16 -0400 Subject: [PATCH 016/232] ajout d'info dans le label --- .../navigateur/public/js/app/outil/outilExportFichier.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/navigateur/public/js/app/outil/outilExportFichier.js b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js index 3bfa39ac..fa4faeb9 100644 --- a/interfaces/navigateur/public/js/app/outil/outilExportFichier.js +++ b/interfaces/navigateur/public/js/app/outil/outilExportFichier.js @@ -412,7 +412,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A var szDefaultEPSG = this.oEPSGStore.data.items[0].data.value; var oEPSGComboBox = new Ext.form.ComboBox({ id : 'exportEPSGOutput', - fieldLabel: 'Système de coordonnée
    '+this.oEPSGStore.data.items[0].data.exemple, + fieldLabel: 'Système de coordonnée
    Ex. :'+this.oEPSGStore.data.items[0].data.exemple, store: this.oEPSGStore, valueField: 'value', value: szDefaultEPSG, @@ -426,7 +426,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur'], function(Outil, Aide, A }); oEPSGComboBox.on( 'select', function(combo, record, index ) { - combo.label.update("Système de coordonnée
    "+record.data.exemple); + combo.label.update("Système de coordonnée
    Ex. :"+record.data.exemple); }); var separateurDefaut = this.separateurStore.data.items[0].data.value; From 137221eb4994da838b6d7cc2d0b5a0e354765e9b Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 09:55:31 -0400 Subject: [PATCH 017/232] =?UTF-8?q?s=C3=A9paration=20des=20possibles=20nom?= =?UTF-8?q?=20de=20colonnes.=20ajout=20d'option=20pour=20la=20couche=20vec?= =?UTF-8?q?teur.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/js/app/outil/outilImportFichier.js | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js index 70deef69..d5adf327 100644 --- a/interfaces/navigateur/public/js/app/outil/outilImportFichier.js +++ b/interfaces/navigateur/public/js/app/outil/outilImportFichier.js @@ -102,6 +102,7 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload defaults: { msgTarget: 'side' }, + labelWidth: 175, items:[ { anchor: '95%', @@ -126,10 +127,12 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload } if(extension.toUpperCase() === 'CSV'){ - this.ownerCt.form.findField('geocodageLotId').show(); + this.ownerCt.form.findField('csvContientY').show(); + this.ownerCt.form.findField('csvContientX').show(); } else{ - this.ownerCt.form.findField('geocodageLotId').hide(); + this.ownerCt.form.findField('csvContientY').hide(); + this.ownerCt.form.findField('csvContientX').hide(); } } } @@ -146,8 +149,9 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload }, { xtype: 'combo', - id : 'geocodageLotId', - fieldLabel: 'Votre CSV contient 2 colonnes nommées X et Y
    ou latitude et longitude ?', + id : 'csvContientX', + fieldLabel: 'Votre CSV contient 1 colonne nommée "X" ou \n\ + "lon" ou "lng" ou "longitude" ?', store: this.ouiNonStore, valueField: 'value', value: 'Oui', @@ -163,15 +167,13 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload select : function(combo, record, index){ if(record.data.value === 'Non'){ this.ownerCt.form.findField("X_POSSIBLE_NAMES").show(); - this.ownerCt.form.findField("Y_POSSIBLE_NAMES").show(); }else{ this.ownerCt.form.findField("X_POSSIBLE_NAMES").hide(); - this.ownerCt.form.findField("Y_POSSIBLE_NAMES").hide(); } } } }, - { + { xtype:'textfield', fieldLabel: 'nom de la colonne des X(longitude)', id: 'X_POSSIBLE_NAMES', @@ -181,6 +183,32 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload style: {width:'75px'}, hidden: true }, + { + xtype: 'combo', + id : 'csvContientY', + fieldLabel: 'Votre CSV contient 1 colonne nommée "Y" ou "lat"
    \n\ + ou "latitude" ?', + store: this.ouiNonStore, + valueField: 'value', + value: 'Oui', + displayField:'text', + editable: false, + mode: 'local', + triggerAction: 'all', + lazyRender: true, + lazyInit: false, + listWidth: 75, + hidden : true, + listeners:{ + select : function(combo, record, index){ + if(record.data.value === 'Non'){ + this.ownerCt.form.findField("Y_POSSIBLE_NAMES").show(); + }else{ + this.ownerCt.form.findField("Y_POSSIBLE_NAMES").hide(); + } + } + } + }, { xtype:'textfield', fieldLabel: 'nom de la colonne des Y(latitude)', @@ -237,6 +265,16 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload if(sourceSrs !== ""){ data.append("sourceSrs", "EPSG:"+sourceSrs); } + + var xPossibleNames = jQuery('input[id^="X_POSSIBLE_NAMES"]').val(); + if(xPossibleNames !== ""){ + data.append("X_POSSIBLE_NAMES", xPossibleNames); + } + + var yPossibleNames = jQuery('input[id^="Y_POSSIBLE_NAMES"]').val(); + if(yPossibleNames !== ""){ + data.append("Y_POSSIBLE_NAMES", yPossibleNames); + } jQuery.ajax({ //Url du service de conversion @@ -334,7 +372,13 @@ define(['outil', 'aide', 'analyseurGeoJSON', 'vecteur', 'togeojson', 'fileUpload var coucheImportFichier = gestionCouche.obtenirCoucheParId(this.nomCouche + filename); if(coucheImportFichier === undefined){ - coucheImportFichier = new Vecteur({titre: filename, id:this.nomCouche + filename, active:true, visible:true, suppressionPermise:true}); + coucheImportFichier = new Vecteur({titre: filename, + id:this.nomCouche + filename, + active:true, + visible:true, + suppressionPermise:true, + editable: true, + geometrieNullePermise: true}); gestionCouche.ajouterCouche(coucheImportFichier); } From 911659bb23001f3e568bbc0997e6aed586132681 Mon Sep 17 00:00:00 2001 From: trom05 Date: Fri, 14 Aug 2015 10:29:04 -0400 Subject: [PATCH 018/232] enlever ancien menu --- interfaces/navigateur/public/js/IGO.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/interfaces/navigateur/public/js/IGO.js b/interfaces/navigateur/public/js/IGO.js index 8fb47fac..f44b15c0 100644 --- a/interfaces/navigateur/public/js/IGO.js +++ b/interfaces/navigateur/public/js/IGO.js @@ -85,9 +85,6 @@ Igo.prototype.init = function(){ rechercheAdresse: 'js/app/menu/recherche/rechercheAdresse', rechercheLieu: 'js/app/menu/recherche/rechercheLieu', rechercheBorne: 'js/app/menu/recherche/rechercheBorne', - exportImport: 'js/app/menu/exportImport/exportImport', - export: 'js/app/menu/exportImport/export', - import: 'js/app/menu/exportImport/import', contexteMenuCarte: 'js/app/contexteMenu/contexteMenuCarte', contexteMenu: 'js/app/contexteMenu/contexteMenu', contexteMenuArborescence: 'js/app/contexteMenu/contexteMenuArborescence', From 4e15ed527b0bacc5f2fbd2d138536103eac41a10 Mon Sep 17 00:00:00 2001 From: trom05 Date: Mon, 17 Aug 2015 09:16:49 -0400 Subject: [PATCH 019/232] renommer --- .../libs/{test.js => PostGeocodageLot.js} | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) rename interfaces/navigateur/public/libs/{test.js => PostGeocodageLot.js} (92%) diff --git a/interfaces/navigateur/public/libs/test.js b/interfaces/navigateur/public/libs/PostGeocodageLot.js similarity index 92% rename from interfaces/navigateur/public/libs/test.js rename to interfaces/navigateur/public/libs/PostGeocodageLot.js index ed43b720..60b9fa0f 100644 --- a/interfaces/navigateur/public/libs/test.js +++ b/interfaces/navigateur/public/libs/PostGeocodageLot.js @@ -115,7 +115,7 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { var selectionnerOccurencePanneauTable = function(e){ this.deselectionnerTout(); Igo.nav.obtenirPanneauxParType('PanneauTable')[0].selectionnerParOccurences(e.occurence); - } + }; var couche1a1 = new Igo.Couches.Vecteur({ titre : '1 à 1', @@ -141,7 +141,7 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { }); - couche1a0.templates = panneauTemplate; + couche1a0.templates = panneauTemplate; couche1a0.ajouterDeclencheur("occurenceClique", selectionnerOccurencePanneauTable); @@ -156,13 +156,14 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { groupe: "Résultat" }); + couche1aN.templates = panneauTemplate; couche1aN.ajouterDeclencheur("occurenceClique", selectionnerOccurencePanneauTable); couche1aN.ajouterDeclencheur("vecteurOccurenceModifiee", modifierGeom); - var couche1aNCluster = new Igo.Couches.VecteurCluster({ + /*var couche1aNCluster = new Igo.Couches.VecteurCluster({ titre : '1 à N Cluster', id: 'couche1aNCluster', editable: true, @@ -173,20 +174,18 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { }); couche1aNCluster.templates = panneauTemplate; - + */ + this.gestionCouches.ajouterCouches([couche1a1, couche1a0,couche1aN]); OpenLayers.Request.GET({ url: this.gestionCouches.obtenirCoucheParId('resultatGeo').options.source, success: geocodagePostScript.lireReponse, error: geocodagePostScript.appelerServiceErreur - }); - - + }); }; geocodagePostScript.lireReponse = function(data, status, b){ - var ttest =1; var json = new OpenLayers.Format.JSON().read( data.responseText ); @@ -235,16 +234,10 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { var proj="EPSG:"+ value2.codeEPSG; var geom = new Igo.Geometrie.Point(x,y,proj); geom = geom.projeter('EPSG:3857'); - - - + var style = new Style({ visible: true, - couleur : couleurAleatoire, - iconeHauteur: 34, - iconeLargeur: 20, - iconeOffsetX: -10, - iconeOffsetY: -34 + couleur : couleurAleatoire }); var valeur = {"entree":value.entree}; @@ -252,9 +245,6 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { var occurence = new Occurence(geom,valeur,style,{}); Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1aN').ajouterOccurence(occurence); - - //Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1aNCluster').ajouterOccurence(occurence); - }); } @@ -262,7 +252,7 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { var x = null; var y = null; var proj =null; - // var geom = new Igo.Geometrie.Point(x,y,proj); + var occurence = new Occurence(null,value,{},{typeGeometrie:'Point'}); Igo.nav.carte.gestionCouches.obtenirCoucheParId('couche1a0').ajouterOccurence(occurence); } @@ -273,8 +263,8 @@ define(['aide','occurence', 'style'], function(Aide, Occurence, Style) { }; geocodagePostScript.appelerServiceErreur = function(data, status) { - alert('pinpon pinpon pinpon'); - }; + alert('Erreur lors de l\'appel au serveur. Veuillez rafraichir la page.'); + }; return geocodagePostScript; }); \ No newline at end of file From f20e695b71db9fc6eceec20c0c8376f75adb50e5 Mon Sep 17 00:00:00 2001 From: trom05 Date: Mon, 17 Aug 2015 09:17:33 -0400 Subject: [PATCH 020/232] correction d'un if pour avoir le bon comportement --- .../navigateur/public/js/app/couche/protocole/vecteur.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/navigateur/public/js/app/couche/protocole/vecteur.js b/interfaces/navigateur/public/js/app/couche/protocole/vecteur.js index fb7b430c..7ed5e951 100644 --- a/interfaces/navigateur/public/js/app/couche/protocole/vecteur.js +++ b/interfaces/navigateur/public/js/app/couche/protocole/vecteur.js @@ -880,10 +880,10 @@ define(['couche', 'occurence', 'limites', 'style', 'aide'], function(Couche, Occ } break; case 'fin': - if(this.options.rafraichissementPermis){ + if(!this.options.rafraichissementPermis){ this.options.rafraichissementPermis = true; - this.rafraichir(); } + this.rafraichir(); break; } } From 14b8dc7a1828aa8d53373fe0071abc99c880f7bf Mon Sep 17 00:00:00 2001 From: matrottier Date: Mon, 17 Aug 2015 09:37:19 -0400 Subject: [PATCH 021/232] Delete outilSaaq.js --- .../public/js/app/outil/outilSaaq.js | 573 ------------------ 1 file changed, 573 deletions(-) delete mode 100644 interfaces/navigateur/public/js/app/outil/outilSaaq.js diff --git a/interfaces/navigateur/public/js/app/outil/outilSaaq.js b/interfaces/navigateur/public/js/app/outil/outilSaaq.js deleted file mode 100644 index 1afe8d7e..00000000 --- a/interfaces/navigateur/public/js/app/outil/outilSaaq.js +++ /dev/null @@ -1,573 +0,0 @@ -//require: extjs, carte.js, message.js, point.js, limite.js - -define(['outil', 'point', 'occurence', 'style', 'aide', 'vecteur', 'browserDetect'], function(Outil, Point, Occurence, Style, Aide, Vecteur, BrowserDetect) { - function OutilSaaq(options){ - this.options = options || {}; - this.defautOptions = $.extend({}, this.defautOptions, { - id:'saaqOutil', - icone: Aide.utiliserBaseUri('images/toolbar/localisateur.png'), - infobulle: 'Positionner un véhicule', - service: Aide.utiliserBaseUri('../services/saaq/getVehicules.php'), - serviceGLO: undefined - }); - }; - - OutilSaaq.prototype = new Outil(); - OutilSaaq.prototype.constructor = OutilSaaq; - - OutilSaaq.prototype._init = function(){ - Outil.prototype._init.call(this); - this.executer(); - }; - - OutilSaaq.prototype.creerFormWindow = function(){ - var comboBox; - var that = this; - -// this.store = new Ext.data.JsonStore({ -// url: Aide.utiliserProxy(this.options.service), -// root:'resultat', -// fields:['nommobile'], -// sortInfo: { field: 'nommobile', direction: 'ASC'}, -// autoLoad:true -// }); - - comboBox = new Ext.form.TextField({ //ComboBox - id:'combo_'+id, - name:'combo', - fieldLabel: 'Modem', - allowBlank:false, - emptyText:'Entrer le modem', - //store: this.store, - displayField:'nommobile', - valueField:'nommobile', - forceSelection:false, - mode:'local', - selectOnFocus:true, - width:250, - scope:this, - listeners: { - specialkey: function(field, e){ - if (e.getKey() == e.ENTER) { - that.submitForm(comboBox); - } - } - } - }); - - //this.store.on('exception', this.gestionErreurStore); - - var button_ok = new Ext.Button({ - id:'button_ok'+id, - type:'button', - width:50, - text:'Afficher', - scope:this, - handler: function(){this.submitForm(comboBox);} - }); - - var button_newPosition = new Ext.Button({ - id:'button_newPosition'+id, - type:'button', - width:50, - text:'Demander une nouvelle position', - scope:this, - handler: function(){this.demanderNouvellePosition(comboBox, 'nouvelle');} - }); - - var panneau = new Ext.form.FormPanel({ - id:'form_recherche_'+id, - padding:'5 5 5 5', - frame:true, - autoWidth:true, - width:'auto', - labelAlign:'top', - items:[comboBox], - buttons:[button_newPosition, button_ok] - }); - - this.window_recherche = new Ext.Window({ - title:'Afficher un véhicule SAAQ', - width:300, - closeAction:'hide', - resizable:true, - minimizable:false, - plain:true, - bodyStyle:'padding5px', - items:[panneau] - }); - }; - - - OutilSaaq.prototype.executer = function () { - if(!this.window_recherche){ - this.creerFormWindow(); - } else { - //this.store.reload(); - } - this.window_recherche.show(); - }; - - - OutilSaaq.prototype.demanderNouvellePosition = function(comboBox, rechercheNouvelle) { - var code = comboBox.getValue().toUpperCase(); - if(code === ""){ - var message = "Le nom du modem est obligatoire"; - comboBox.markInvalid(message); - Aide.afficherMessage({titre: 'Avertissement', message: message}); - return false; - } else if(code.indexOf(' ') !== -1){ - var message = "Le nom du modem ne doit pas avoir d'espace"; - comboBox.markInvalid(message); - Aide.afficherMessage({titre: 'Avertissement', message: message}); - return false; - }; - var that = this; - if(code){ - that._cancelDemande = false; - Aide.afficherMessageChargement({ - message: 'Demande en cours, elle peut durer plusieurs minutes, veuiller patientez...', - boutons: {cancel:'Annuler la demande'}, - callback: function(bouton){ - if(bouton == 'cancel'){ - clearTimeout(that.timer); - that.nouvellePositionRequete(code, 'annuler'); - } - } - }); - /* var date = new Date(); - var year = date.getFullYear(); - var month = parseInt(date.getMonth())+1; - month = month > 9 ? month : '0'+month; - var day = date.getDate() > 9 ? date.getDate() : '0'+date.getDate(); - var dateString = year + '-' + month + '-' + day + ' ' + date.toLocaleTimeString();*/ - - this.nouvellePositionRequete(code, rechercheNouvelle); - this.cacherForm(); - comboBox.setValue(""); - comboBox.clearInvalid(); - } - }; - - - OutilSaaq.prototype.nouvellePositionRequete = function(code, rechercheNouvelle){ - $.ajax({ - url: Aide.utiliserProxy(this.options.service), - data: { - nom: code, - recherche: rechercheNouvelle - }, - cache: false, - async:false, - context:this, - success: function(data){this.nouvellePosition(data, code)}, - dataType:'json', - error:function(){ Aide.afficherMessage({titre: 'Avertissement', message: 'Une erreur est survenue durant la demande d\'une nouvelle position'});} - }); - } - - OutilSaaq.prototype.nouvellePosition = function(data, code) { - var that = this; - if(data.etat.code == 1 || data.etat.code == 2){ - var messageAttente = "Demande en cours"; - if(data.etat.positionListeAttente && data.etat.positionListeAttente !== 1){ - messageAttente = "Position dans la liste d'attente: "+data.etat.positionListeAttente; - } - Ext.MessageBox.updateProgress(undefined, messageAttente); - that.timer = setTimeout(function(){ - that.nouvellePositionRequete(code, 'attendre'); - }, 5000); - return true; - } else if(data.etat.code !== 0 && data.etat.code !== 3){ - var message = data.etat.code; - var messageCode = data.etat.code.trim(" "); - if(messageCode == "ERR01006"){ - message = "Nom du modem ("+data.etat.mobile+") invalide"; - } else if(messageCode == "ERR01012"){ - message = "Le serveur LAV ne répond pas"; - } else if(messageCode == "ERR01014"){ - message = "Modem '"+data.etat.mobile+"' inexistant"; - } else if(messageCode == "ERR01016"){ - message = "Demande de géoposition déjà en cours"; - } else if(messageCode == "NON-DISPONIBLE"){ - message = "Demande de nouvelle position non-disponible pour le modem '"+data.etat.mobile+"'"; - } else if(messageCode == "Expiration RAFMOB"){ - message = "Délai de réponse expiré pour le modem '"+data.etat.mobile+"'"; - } - Aide.afficherMessage({titre: 'Avertissement', message: data.etat.code + ": " + message}); - } else { - Aide.cacherMessageChargement(); - } - if(data.resultat.length !== 0){ - that.afficherVehicule(data); - } - - }; - - OutilSaaq.prototype.submitForm = function(comboBox) { - var code = comboBox.getValue().toUpperCase(); - if(code === ""){ - var message = "Le nom du modem est obligatoire"; - comboBox.markInvalid(message); - Aide.afficherMessage({titre: 'Avertissement', message: message}); - return false; - } else if(code.indexOf(' ') !== -1){ - var message = "Le nom du modem ne doit pas avoir d'espace"; - comboBox.markInvalid(message); - Aide.afficherMessage({titre: 'Avertissement', message: message}); - return false; - }; - if(code){ - $.ajax({ - url: Aide.utiliserProxy(this.options.service), - data: { - nom: code - }, - cache: false, - async:false, - context:this, - success:this.afficherVehicule, - dataType:'json', - error:function(){ Aide.afficherMessage({titre: 'Avertissement', message: 'Impossible d\'obtenir les positions du modem'});} - }); - - this.cacherForm(); - comboBox.setValue(""); - comboBox.clearInvalid(); - } - }; - - - OutilSaaq.prototype.cacherForm = function() { - this.window_recherche.hide(); - }; - - OutilSaaq.prototype.creerCouche = function() { - var style=new Style({ - etiquette: '${ordre}' /*'${heure}:${minute}'*/, - icone: Aide.utiliserBaseUri('images/marqueur/fleche-bleue.svg'), - iconeHauteur:32, - iconeLargeur:32, - rotation:"${direction}", - etiquetteCouleur:'#2291E1', - etiquetteOffsetY: '15' , - filtres: [{ - titre:'Dernière position', - filtre: "[ordre]==1", - style: { - icone: Aide.utiliserBaseUri('images/marqueur/fleche-rouge.svg'), - etiquetteCouleur: 'red' - } - }, - { - titre: 'Autre', - style:{} - } - ] - - }); - - if(BrowserDetect.browser === 'Explorer' && BrowserDetect.version < 9){ - style=new Style({ - etiquette: '${ordre}' /*'${heure}:${minute}'*/, - etiquetteCouleur:'#2291E1', - etiquetteOffsetY: '15' , - couleur: '#2291E1', - filtres: [{ - titre:'Dernière position', - filtre: "[ordre]==1", - style: { - couleur: 'red', - etiquetteCouleur: 'red' - } - }, - { - titre: 'Autre', - style:{} - } - ] - - }); - } - - - this.vecteurSaaq = new Vecteur({titre: 'Saaq-Vehicule', active: true, styles: style}); - this.carte.gestionCouches.ajouterCouche(this.vecteurSaaq); - this.initEvenementCouche(); - - this.creerWindowInfo(); - }; - - OutilSaaq.prototype.creerWindowInfo = function(){ - var that=this; - var id = Aide.obtenirNavigateur().obtenirPanneauxParType('PanneauCarte')[0].obtenirId(); - var $carte = $("#"+id); - this.windowInfoLeft = $carte.position().left + $carte.width() - 230 - 5; - this.windowInfoTop = $carte.position().top + $carte.height() - 5; - - this.windowInfo = new Ext.Window({ - id: 'saaqWindowInfo', - title: 'Saaq', - width: 230, - //height: 114, - x: that.windowInfoLeft, - y: that.windowInfoTop, - closeAction: 'hide', - minimizable: false, - resizable: false, - autoHeight: true, - plain:true, - bodyStyle:'padding:5px;', - html: 'Aucune Info' - }); - - } - - OutilSaaq.prototype.initEvenementCouche = function() { - //this.vecteurSaaq.ajouterDeclencheur('occurenceSurvol', this.occurenceSaaqSurvol, {scope: this}); - //this.vecteurSaaq.ajouterDeclencheur('occurenceSurvolFin', this.occurenceSaaqSurvolFin, {scope: this}); - this.vecteurSaaq.ajouterDeclencheur('occurenceClique', this.occurenceSaaqClique, {scope: this}); - }; - - OutilSaaq.prototype.occurenceSaaqSurvol = function(e) { - var p = e.occurence.obtenirProprietes(); - var jour = p.jour.length == 1 ? '0' + p.jour : p.jour; - var mois = p.mois.length == 1 ? '0' + p.mois : p.mois; - var minute = p.minute.length == 1 ? '0' + p.minute : p.minute; - var seconde = p.seconde.length == 1 ? '0' + p.seconde : p.seconde; - var html = ''; - html += "

    "+p.nommobile+"

    "; - html += "

    Date: "+jour+"/"+mois+"/"+p.annee+"

    "; - html += "

    Heure: "+p.heure+":"+minute+":"+seconde+"

    "; - - e.occurence.ouvrirInfobulle({html: html, aFermerBouton: false}); - }; - - OutilSaaq.prototype.occurenceSaaqSurvolFin = function(e) { - e.occurence.fermerInfobulle(); - }; - - OutilSaaq.prototype.occurenceSaaqClique = function(e) { - var that = e.options.scope; - - var p = e.occurence.obtenirProprietes(); - - if(!p.geocodage){ - that.obtenirAdresse(p.lon+" "+p.lat, e.occurence); - } else { - that.ouvrirInfoWindow(p); - } - }; - - OutilSaaq.prototype.ouvrirInfoWindow = function(p) { - var html = ''; - var titre; - var jour = p.jour.length == 1 ? '0' + p.jour : p.jour; - var mois = p.mois.length == 1 ? '0' + p.mois : p.mois; - var minute = p.minute.length == 1 ? '0' + p.minute : p.minute; - var seconde = p.seconde.length == 1 ? '0' + p.seconde : p.seconde; - var direction; - if(p.direction >= 22.5 && p.direction < 67.5) { - direction = "Nord-Est"; - } else if(p.direction >= 67.5 && p.direction < 112.5) { - direction = "Est"; - } else if(p.direction >= 112.5 && p.direction < 157.5) { - direction = "Sud-Est"; - } else if(p.direction >= 157.5 && p.direction < 202.5) { - direction = "Sud"; - } else if(p.direction >= 202.5 && p.direction < 247.5) { - direction = "Sud-Ouest"; - } else if(p.direction >= 247.5 && p.direction < 292.5) { - direction = "Ouest"; - } else if(p.direction >= 292.5 && p.direction < 337.5) { - direction = "Nord-Ouest"; - } else { - direction = "Nord"; - } - - html = ''; - html += "

    Date: "+jour+"/"+mois+"/"+p.annee+"

    "; - html += "

    Heure: "+p.heure+":"+minute+":"+seconde+"

    "; - html += "

    Position: "+p.lon.substr(0,8)+", "+p.lat.substr(0,7)+"

    "; - html += "

    Vitesse: "+p.vitesse.split('.')[0]+" km/h

    "; - html += "

    Direction: "+direction+"

    "; - html += "

    No. secteur: "+p.secteur_geo+"

    "; - //html += "

    Géocodage: "+"Obtenir"+"

    "; - html += "
    "; - - var noCiviq, nomRue, ville, codePostal; - noCiviq = nomRue = ville = codePostal = 'Chargement...'; - var titreAdresse = '

    Adresse

    '; - if(p.geocodage){ - if (p.geocodage === 'Indisponible'){ - noCiviq = nomRue = ville = codePostal = 'GLO est indisponible'; - } else if(p.geocodage.distance > 200) { - noCiviq = nomRue = ville = codePostal = 'Inconnu'; - } else { - noCiviq = p.geocodage.noCiviq; - nomRue = p.geocodage.nomRue; - ville = p.geocodage.placeListe[0].nom; - codePostal = p.geocodage.CP.codePostal; - if(p.geocodage.distance > 100){ - titreAdresse = "

    Adresse approximative

    "; - noCiviq = '' + noCiviq + ''; - nomRue = '' + nomRue + ''; - ville = '' + ville + ''; - codePostal = '' + codePostal + ''; - }; - } - } - html += "

    "+titreAdresse+"

    "; - html += "

    No.: "+noCiviq+"

    "; - html += "

    Rue: "+nomRue+"

    "; - html += "

    Ville: "+ville+"

    "; - html += "

    Code Postal: "+codePostal+"

    "; - - var value1, value2, value3, value4, titreInfo, label1, label2, label3, label4; - if (p.repere_distance) { - titreInfo = '

    Repère

    '; - label1 = 'No. Route: '; - label2 = 'Route: '; - label3 = 'Km: '; - label4 = 'Municipalité: '; - value1 = p.repere_noroute.substr(p.repere_noroute.search(/[1-9]/)); - value2 = p.repere_nomroute; - value3 = p.repere_affiche_km; - value4 = p.repere_municipalite; - html += "
    "; - html += "

    "+titreInfo+"

    "; - html += "

    "+label1+value1+"

    "; - html += "

    "+label2+value2+"

    "; - html += "

    "+label3+value3+"

    "; - html += "

    "+label4+value4+"

    "; - } - if (p.sortie_distance) { - titreInfo = '

    Sortie

    '; - label1 = 'No. Route: '; - label2 = 'No. Sortie: '; - label3 = 'Panneau: '; - label4 = 'Muncipalite: '; - value1 = p.sortie_noroute.substr(p.sortie_noroute.search(/[1-9]/)); - value2 = p.sortie_no; - value3 = p.sortie_message_pan; - value4 = p.sortie_municipalite; - html += "
    "; - html += "

    "+titreInfo+"

    "; - html += "

    "+label1+value1+"

    "; - html += "

    "+label2+value2+"

    "; - //html += "

    "+label3+value3+"

    "; - html += "

    "+label4+value4+"

    "; - } - - titre = p.nommobile; - - var windowConstruit = false; - if(this.windowInfo.body){ - this.windowInfo.body.update(html); - this.windowInfo.setTitle(titre); - windowConstruit = true; - } else { - this.windowInfo.html = html; - this.windowInfo.title = titre; - //this.windowInfo.show(); - //$('#saaqWindowInfo').on('click', '.saaqGeocodageLink', function(e){console.log(e); return false}); - } - var left, top; - if(this.windowInfo.isVisible() && windowConstruit){ - left = this.windowInfo.getPosition()[0]; - top = this.windowInfo.getPosition()[1] + this.windowInfoLastHeight - this.windowInfo.getHeight(); - } else { - this.windowInfo.show(); - left = this.windowInfoLeft; - top = this.windowInfoTop - this.windowInfo.getHeight(); - } - this.windowInfoLastHeight = this.windowInfo.getHeight(); - this.windowInfo.setPosition([left,top]); - }; - - OutilSaaq.prototype.creerVehicule = function(key, geom, propriete) { - propriete.ordre = key+1; - if(propriete.minute.length == 1){propriete.minute='0'+propriete.minute}; - var vehicule = new Occurence(geom, propriete); - this.vecteurSaaq.ajouterOccurence(vehicule); - if(key === 0){ - this.obtenirAdresse(propriete.lon+" "+propriete.lat, vehicule); - } - }; - - OutilSaaq.prototype.obtenirAdresse = function(coord, occurence){ - //todo: changer le host - this.ouvrirInfoWindow(occurence.obtenirProprietes()); - var that=this; - $.ajax({ - url: Aide.utiliserProxy(this.options.serviceGLO), - data: { - type: "REVERSE", - epsg_sortie: 32198, - indDebut: 0, - indFin: 0, - groupe: 1, - urlappelant: "/geomsp/", - texte: coord, - format: "json", - _cle: 'glo' - }, - //crossDomain: true, //utilisation du proxy - async:false, - context:this, - success: function(e){ - if(e.nombreResultat !== 0){ - occurence.definirPropriete('geocodage', e.geocoderReponseListe[0]); - } - that.ouvrirInfoWindow(occurence.obtenirProprietes()); - Aide.cacherMessageChargement(); - }, - dataType:'json', - error:function(){ - occurence.definirPropriete('geocodage', 'Indisponible'); - that.ouvrirInfoWindow(occurence.obtenirProprietes()); - Aide.cacherMessageChargement(); - // Aide.afficherMessage({titre: 'Erreur', message: 'GLO est indisponible', icone: 'erreur'}); - } - }); - }; - - OutilSaaq.prototype.afficherVehicule = function(data) { - var that=this; - if(!this.vecteurSaaq){ - this.creerCouche(); - } else { - this.vecteurSaaq.enleverTout(); - } - - if(data.resultat.length === 0){ - Aide.afficherMessage({titre: 'Avertissement', message: "Aucun résultat trouvé"}); - return true; - } - - data.resultat.sort(this.trierVehicule); - - $.each(data.resultat.reverse(), function(key, value){ - var geom = new Point(value.lon, value.lat, 'EPSG:4326').projeter(that.carte.obtenirProjection()); - that.creerVehicule(key, geom, value); - }); - - this.vecteurSaaq.zoomerOccurences(null, 15); - - if(data.etat.fonctionnel === 0){ - var message = "Attention: Aucune nouvelle donnée a été reçue depuis un certain temps"; - Aide.afficherMessage({titre: 'Avertissement', message: message}); - } - }; - - - OutilSaaq.prototype.trierVehicule = function SortByName(a, b){ - var aName = a.id; - var bName = b.id; - return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); - } - - return OutilSaaq; - -}); - From 3afe63123377b4c804e5f935d55e9b05bb8c0517 Mon Sep 17 00:00:00 2001 From: trom05 Date: Mon, 17 Aug 2015 15:25:24 -0400 Subject: [PATCH 022/232] ajout de validation, suppression de code mort et ajout de commentaire d'erreur dans le retour --- .../public/js/app/menu/impression.js | 17 +- services/impression/printIGO.php | 473 +++++++----------- 2 files changed, 197 insertions(+), 293 deletions(-) diff --git a/interfaces/navigateur/public/js/app/menu/impression.js b/interfaces/navigateur/public/js/app/menu/impression.js index 01deb3f5..65121fa9 100644 --- a/interfaces/navigateur/public/js/app/menu/impression.js +++ b/interfaces/navigateur/public/js/app/menu/impression.js @@ -798,14 +798,14 @@ Impression.prototype.afficherImpression = function(action){ resizable : true }; - var htmlContent = null; + var htmlContent = null; var afficherItineraire = true; if(afficherItineraire && $('#itineraire').css('display') === 'block'){ var itineraire = $('#itineraire').clone(); itineraire.find('.button').remove(); htmlContent = "
    Imprimer "+ - itineraire.html()+"

    "; + itineraire.html()+"
    "; var myWindow = window.open('','','scrollbars=1,width=800,height=800'); myWindow.document.write(''); @@ -815,10 +815,10 @@ Impression.prototype.afficherImpression = function(action){ myWindow.document.write(htmlContent); myWindow.document.write(''); return true; - } else if(action.response.responseText.indexOf("html") === -1){ - htmlContent = "'); - print(''); - } - - - public function includeCTL($ctlName, $action, $r_controller=null, $render = true) { - - if (is_null($r_controller)){ - $r_controller=$this->getControllerName(); - } - $ctlClass = Text::camelize($ctlName) . "Controller"; - $ctl = new $ctlClass; - $retour = call_user_func(array($ctl, "initialize")); - - $this->setVar("r_controller", $r_controller); - - if (strpos($action,"?")>0){ - $t_action=explode("?",$action); - $action=$t_action[0]; - - $retour = call_user_func(array($ctl, $action . "Action"), $t_action[1]); - } else { - $retour = call_user_func(array($ctl, $action . "Action")); - } - - - if ($render) { - $this->setRenderLevel(View::LEVEL_ACTION_VIEW); - $this->render($ctlName, $action); - $this->setRenderLevel(View::LEVEL_MAIN_LAYOUT); - } else { - $this->pick($ctlName . "/" . $action); - } - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoAttributController.php b/pilotage/app/controllers/CRUD/IgoAttributController.php deleted file mode 100644 index 1ba0b6e7..00000000 --- a/pilotage/app/controllers/CRUD/IgoAttributController.php +++ /dev/null @@ -1,6 +0,0 @@ -session->has("couche_id")){ - $this->tag->setDefault("couche_id",$this->session->get("couche_id")); - } - parent::newAction($r_controller, $r_action, $r_id ); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoClasseEntiteController.php b/pilotage/app/controllers/CRUD/IgoClasseEntiteController.php deleted file mode 100644 index 1c4920cc..00000000 --- a/pilotage/app/controllers/CRUD/IgoClasseEntiteController.php +++ /dev/null @@ -1,13 +0,0 @@ -persistent->parameters = null; - $phql = "SELECT id, CONCAT(acronyme,\" - \",nom) as nom FROM IgoOrganismeResponsable order by acronyme"; - $organisme_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("organisme_desc", $organisme_desc); - parent::initialize(); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoClassificationController.php b/pilotage/app/controllers/CRUD/IgoClassificationController.php deleted file mode 100644 index bcffd23b..00000000 --- a/pilotage/app/controllers/CRUD/IgoClassificationController.php +++ /dev/null @@ -1,6 +0,0 @@ -tag->setDefault("geometrie_type", "V"); - - parent::newAction($r_controller, $r_action, $r_id); - } -} diff --git a/pilotage/app/controllers/CRUD/IgoContactController.php b/pilotage/app/controllers/CRUD/IgoContactController.php deleted file mode 100644 index 3fb92b70..00000000 --- a/pilotage/app/controllers/CRUD/IgoContactController.php +++ /dev/null @@ -1,4 +0,0 @@ -getDI()->getConfig()->mapserver; - $onlineResource = $mapserverConfiguration->mapserver_path . $mapserverConfiguration->executable . $mapserverConfiguration->mapfileCacheDir . $mapserverConfiguration->contextesCacheDir . "{Code}.map"; - - //Fournir la liste des contexte que l'utilisateur peut dupliquer - $igoContextesQuilPossede = $this->igoContextesQuilPossede(); - $igoContextes = array(); - foreach($igoContextesQuilPossede as $igoContexte){ - - $igoContextes[$igoContexte->id] = $igoContexte->nom . '(' . $igoContexte->code . ')'; - - } - $this->view->setVar('igoContextesQuilPossede', $igoContextes); - - $this->view->setVar("retour", "igo_contexte/search"); - - $this->tag->setDefault("mf_map_projection", "32198"); - $this->tag->setDefault("mf_map_meta_onlineresource", $onlineResource); - $this->tag->setDefault("generer_onlineresource", true); - } - - - public function createAction($r_controller = null, $r_action = null, $r_id = null) { - - $mapServerConfig = $this->getDI()->getConfig()->mapserver; - $fileName = $mapServerConfig->mapfileCacheDir . $mapServerConfig->contextesCacheDir . $this->request->getPost("code") . ".map"; - - //Ne pas créer le contexte si il y en a déjà un avec le même code - if(file_exists($fileName)) { - $this->flash->error("Le fichier {$fileName} existe déjà!"); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - $idContexteADupliquer = $this->request->getPost('id_contexte_a_dupliquer'); - - //On désire dupliquer un contexte - if($idContexteADupliquer){ - - if(!$this->peutDupliquerContexte($idContexteADupliquer)){ - $this->flash->error("Vous n'avez pas la permission de dupliquer le contexte {$idContexteADupliquer}."); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - - } - } - - $this->traiterCodeOnlineRessource(); - - $igoContexte = new IgoContexte(); - $igoContexte->mode = $this->request->getPost("mode"); - $igoContexte->position = $this->request->getPost("position"); - $igoContexte->zoom = $this->request->getPost("zoom"); - $igoContexte->code = $this->request->getPost("code"); - $igoContexte->nom = $this->request->getPost("nom"); - $igoContexte->description = $this->request->getPost("description"); - $igoContexte->mf_map_def = $this->request->getPost("mf_map_def"); - $igoContexte->date_modif = $this->request->getPost("date_modif"); - $igoContexte->json = $this->request->getPost("json"); - $igoContexte->mf_map_projection = $this->request->getPost("mf_map_projection"); - $igoContexte->profil_proprietaire_id = $this->request->getPost("profil_proprietaire_id"); - - if($igoContexte->profil_proprietaire_id == "") { - $igoContexte->profil_proprietaire_id = null; - } - - //Valider la sélection ou pas du profil propriétaire - if(!$this->validationProfilProprietaire($igoContexte->profil_proprietaire_id, $messageErreurProfilProprietaire)){ - foreach($messageErreurProfilProprietaire as $message){ - $this->flash->error($message); - } - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - $igoContexte->mf_map_meta_onlineresource = $this->request->getPost("mf_map_meta_onlineresource"); - - $igoContexte->generer_onlineresource = $this->request->getPost("generer_onlineResource"); - - try { - if (!$igoContexte->save()) { - - foreach ($igoContexte->getMessages() as $message) { - $this->flash->error($message); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - if($idContexteADupliquer){ - $this->dupliquerContexte($idContexteADupliquer, $igoContexte->id); - } - - $this->flash->success(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " " . $igoContexte->id . " créé avec succès"); - - - } catch (\Exception $e) { - $this->flash->error($e->getMessage()); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - } - - /* - * S'assurer que le profil propriétaire soit bien assigné - * @param int $idProfil Id du profil fourni dans le formulaire - * @param array $messages Messages d'erreur à retourner - * return bool Est valide - */ - private function validationProfilProprietaire($idProfil, &$messages){ - $messages = array(); - //L'utilisateur doit préciser le profil propriétaire - if(!$this->getDI()->get('session')->get('info_utilisateur')->estAdmin){ - - if(!$idProfil){ - $messages[] = "Vous devez spécifier quel est le profil propriétaire."; - return false; - } - - if(!$this->getDI()->get('session')->get('info_utilisateur')->aProfil($idProfil)){ - $messages[] = "Vous n'avez pas le droit d'assigner ce profil. Vous devez en être propriétaire ou être administrateur."; - return false; - } - } - return true; - } - - /** - * Fait une copie des associations igo_couche_contexte dans le contexte cible - * @param int $idContexteSource - * @param int $idContexteCible - */ - private function dupliquerContexte($idContexteSource, $idContexteCible){ - - //Récupérer les couchecontexte de la source - $igoContexteSource = IgoContexte::findFirst($idContexteSource); - - $igoContexteSource->dupliquer($idContexteCible); - - } - - public function mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) { - - $igo_contexte = IgoContexte::findFirstByid($contexte_id); - if (!$igo_contexte) { - $this->flash->error("Contexte non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => "igo_contexte", - "action" => "search" - )); - } - - $contexte = $igo_contexte->toArray(); - $couches = array(); - // $igo_couches = $igo_contexte->getCouches(); - - $contexte["wms_onlineresource"] = $this->view->host . $igo_contexte->mf_map_meta_onlineresource; - - if (is_numeric($igo_contexte->mf_map_projection)) { - $contexte["mf_map_projection"] = "\"init=epsg:" . $igo_contexte->mf_map_projection . "\""; - } else if (trim($igo_contexte->mf_map_projection) != '') { - $contexte["mf_map_projection"] = $igo_contexte->mf_map_projection; - if ($contexte["mf_map_projection"] <> "") { - $contexte["mf_map_projection"] = str_replace('"', "\t\t\t", str_replace('" ', '\n ', $contexte["mf_map_projection"])); - } - } - - $contexteCouches = IgoVueContexteCoucheNavigateur::find( - array( - "conditions"=>"contexte_id=$contexte_id", - //"order"=>array("mf_layer_meta_z_order") - "order"=>array("mf_layer_meta_group_title", "mf_layer_meta_title") - )); - - // Il faut trier les classes par mf_class_z_order, c'est impossible de - // le faire avec l'orm ou encore avec le volt... Il faudrait étendre volt - // pour y ajouter une fonction usort, préférable d'utiliser la BD pour le sort... - // http://docs.phalconphp.com/en/latest/reference/volt.html#extending-volt - $couchesClasses = array(); - foreach($contexteCouches as $contexteCouche){ - $classes = IgoClasse::find( - array("conditions"=>"couche_id=$contexteCouche->couche_id", - "order"=>array("mf_class_z_order") - )); - $couchesClasses[$contexteCouche->couche_id] = $classes; - } - - $mapfileInclude = ''; - if(isset($this->config->mapserver->mapfileInclude)){ - foreach($this->config->mapserver->mapfileInclude as $chemin){ - $mapfileInclude .= parent::fopen_file_get_contents($chemin); - } - } - $this->view->mapfileInclude = $mapfileInclude; - - $this->view->couchesClasses = $couchesClasses; - $this->view->contexteCouches = $contexteCouches; - - $this->view->contexte = $contexte; - $this->view->preview = true; - - return array($contexte, $couches); - } - - public function saveMapFile($contexte_id) { - $contexte = IgoContexte::findFirstById($contexte_id); - if (!$contexte) { - throw new Exception("Contexte inexistant"); - } - $contexte->save(); - } - - public function saveAction($r_controller = null, $r_action = null, $r_id = null) { - $this->traiterCodeOnlineRessource(); - - //Valider la sélection ou pas du profil propriétaire - if(!$this->validationProfilProprietaire($this->request->getPost("profil_proprietaire_id"), $messageErreurProfilProprietaire)){ - foreach($messageErreurProfilProprietaire as $message){ - $this->flash->error($message); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "edit" - )); - - } - - parent::saveAction($r_controller, $r_action); - - } - - - public function deleteAction($id, $r_controller = null, $r_action = null, $r_id = null) { - - $igoContexte = IgoContexte::findFirst($id); - $mapServerConfig = $this->getDI()->getConfig()->mapserver; - $fileName = $mapServerConfig->mapfileCacheDir . $mapServerConfig->contextesCacheDir . $igoContexte->code . ".map"; - - if (file_exists($fileName)) { - unlink($fileName); - } - - parent::deleteAction($id, $r_controller, $r_action, $r_id); - } - - /** - * Récupère le mf_map_meta_onlineresource dans le formulaire - * et ajuste le code au besoin - */ - private function traiterCodeOnlineRessource(){ - - $onlineResource = $this->request->getPost("mf_map_meta_onlineresource"); - $code = $this->request->getPost("code"); - - if (strpos($onlineResource, '{Code}') !== FALSE){ - - $onlineResource = str_replace("{Code}", $code, $onlineResource); - - } - - $_POST['mf_map_meta_onlineresource'] = $onlineResource; - - } - - /** - * Récupère la liste de igo_contexte dont l'utilisateur courant est - * propriétaire (un admin possède tous les contextes) - * @return igoContexte[] - */ - private function igoContextesQuilPossede(){ - $sql = ''; - if(!$this->getDI()->get('session')->get('info_utilisateur')->estAdmin){ - - //Récupérer les profils de l'utilisateurs - $profils = $this->getDI()->get('session')->get('info_utilisateur')->profils; - if(!count($profils)){ - return false; - } - - $idsProfils = array(); - - foreach($profils as $profil){ - $idsProfils[] = $profil['id']; - } - $idsProfils = implode(',', $idsProfils); - - //Récupérer les contextes auquels ces profils donne droit - $sql = "profil_proprietaire_id IN ($idsProfils)"; - } - - return IgoContexte::find($sql); - } - - /** - * Indique si l'utilisateur courant peut dupliquer le contexte - * @param int $idContexte - * return bool - */ - private function peutDupliquerContexte($idContexte){ - - if($this->getDI()->get('session')->get('info_utilisateur')->estAdmin){ - return true; - } - - $contextes = $this->igoContextesQuilPossede(); - foreach($contextes as $contexte){ - if($contexte->id == $idContexte){ - die("$contexte->id == $idContexte"); - return true; - } - } - return false; - } - - -} diff --git a/pilotage/app/controllers/CRUD/IgoCoucheContexteController.php b/pilotage/app/controllers/CRUD/IgoCoucheContexteController.php deleted file mode 100644 index 90c092bc..00000000 --- a/pilotage/app/controllers/CRUD/IgoCoucheContexteController.php +++ /dev/null @@ -1,334 +0,0 @@ -view->setRenderLevel(View::LEVEL_ACTION_VIEW); - $this->editAction($id, "igo_couche_contexte", "editw", $id); - //$this->view->setRenderLevel(View::LEVEL_MAIN_LAYOUT); - } - - public function editAction($id, $r_controller = null, $r_action = null, $r_id = null) { - - $coucheContexte = IgoCoucheContexte::findFirst($id); - $estGroupeDeCouche = $coucheContexte && $coucheContexte->couche_id; - $this->view->setVar("estGroupeDeCouche", $estGroupeDeCouche); - - $phql = "SELECT a.id, CONCAT(c.nom,\":\",a.colonne) as nom FROM IgoGeometrie as g, IgoAttribut as a, IgoClasseEntite as c where a.geometrie_id=g.id and g.classe_entite_id=c.id order by c.nom, a.colonne"; - $attribut_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("attribut_desc", $attribut_desc); - parent::editAction($id, $r_controller, $r_action, $r_id); - } - - public function arbreCouchesAction($contexte_id) { - - - $this->view->setVar("id", $contexte_id); - // $this->view->setVar("page", $page); - $this->view->setVar("contexte_id", $contexte_id); - } - - public function arbreCouchesEditAction($param = null) { - //var_dump($this->udate()); - $deleted=false; - $params = array(); - parse_str($param, $params); - $contexte_id = isset($params['contexte_id']) ? $params['contexte_id'] : $this->request->get('contexte_id'); - - if (!$contexte_id) { - $this->flash->error("igo_contexte non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => "igo_contexte", - "action" => "index" - )); - } - - //On récupére les données du formulaire Associer des groupes et des couches - if (isset($_POST['valeursArbo'])) { - $valeurs = json_decode($_POST['valeursArbo']); - - //On récupéres les données de la rétro d'un mapfile - } else { - $valeurs = $_POST; - } - - - - - //Sauvegarde des items du formulaire - $igoCoucheContexte = false; - - foreach ($valeurs as $name => $valeur) { - if (!$deleted){ - $phql = "DELETE FROM IgoCoucheContexte WHERE contexte_id={$contexte_id}"; - $this->modelsManager->executeQuery($phql); - $deleted=true; - //var_dump($deleted); - } - $arbre_id = null; - $couche_id = null; - $changed = false; - $type = null; - $titre = null; - $ordre = 0; - if ('T' == substr($name, 1, 1)) { - $titre = $valeur; - } - if ('O' == substr($name, 1, 1)) { - $ordre = $valeur; - } - - //Déterminer à quoi on a affaire - if ('G' == substr($name, 0, 1)) { - $type = 'groupe'; - $a = explode("_", substr($name, 2)); - array_shift($a); - $arbre_id=implode('_',$a); - $groupe_id = array_pop($a); - } elseif ('CX' == substr($name, 0, 2)) { - $type = 'colonne'; - $a = explode("_", substr($name, 2)); - $attribut_id = array_pop($a); - array_shift($a); - $arbre_id=implode('_',$a); - $couche_id = substr($name, 2, strpos($name, "_") - 2); - } elseif ('C' == substr($name, 0, 1)) { - $type = 'couche'; - $a = explode("_", substr($name, 2)); - array_shift($a); - $arbre_id=implode('_',$a); - $couche_id = explode("_", substr($name, 2))[0]; - } - if (isset($valeur)&& $valeur!=0){ - // printf("name: %s, arbre_id: %s, groupe_id: %s, couche_id: %s, type: %s, valeur: %s
    ", $name, $arbre_id, $groupe_id, $couche_id, $type, $valeur); - } - //Tenter de récupérer le igo_couche_contexte associé - switch ($type) { - case 'groupe': - // echo "1"; - if (!$igoCoucheContexte || $igoCoucheContexte->arbre_id <> $arbre_id || $igoCoucheContexte->couche_id <> null || $igoCoucheContexte->attribut_id <> null) { - // echo "-1R"; - $igoCoucheContexte=null; - //$igoCoucheContexte = IgoCoucheContexte::findFirst("contexte_id={$contexte_id} AND groupe_id={$groupe_id} AND couche_id IS NULL AND attribut_id is null"); - // var_dump($igoCoucheContexte); - } - break; - - case 'colonne': - // echo "3"; - if (!$igoCoucheContexte || $igoCoucheContexte->arbre_id <> $arbre_id || $igoCoucheContexte->couche_id <> $couche_id || $igoCoucheContexte->attribut_id <> $attribut_id) { - // echo "-3R"; - $igoCoucheContexte=null; - //$igoCoucheContexte = IgoCoucheContexte::findFirst("contexte_id={$contexte_id} AND groupe_id={$groupe_id} AND attribut_id={$attribut_id} AND couche_id={$couche_id}"); - } - break; - - case 'couche': - // echo "2"; - if (!$igoCoucheContexte || $igoCoucheContexte->arbre_id <> $arbre_id || $igoCoucheContexte->couche_id <> $couche_id || $igoCoucheContexte->attribut_id <> null) { - // echo "-2R"; - $igoCoucheContexte=null; - //$igoCoucheContexte = IgoCoucheContexte::findFirst("contexte_id={$contexte_id} AND groupe_id={$groupe_id} AND couche_id={$couche_id} AND attribut_id is null"); - //var_dump("contexte_id={$contexte_id} AND groupe_id={$groupe_id} AND couche_id={$couche_id} AND attribut_id is null"); - } - break; - } - - //On n'a pas trouvé le igo_couche_contexte associé - if (!$igoCoucheContexte && $valeur) { - //echo "***Création***"; - $changed = true; - $igoCoucheContexte = new IgoCoucheContexte(); - $igoCoucheContexte->contexte_id = $contexte_id; - - //Initialiser les champs du contexte - switch ($type) { - case 'groupe': - - $igoGroupe = IgoGroupe::findFirst("id=" . $groupe_id); - if (!$igoGroupe) { - - $this->flash->error("Le groupe « $groupe_id » n'existe pas."); - } - $igoCoucheContexte->groupe_id = $groupe_id; - $igoCoucheContexte->arbre_id = $arbre_id; - $igoCoucheContexte->ind_fond_de_carte = 'D'; - $igoCoucheContexte->mf_layer_meta_name = $igoGroupe->nom; - $igoCoucheContexte->mf_layer_meta_title = $igoGroupe->nom; - if (!is_null($titre) && "" != $titre) { - $igoCoucheContexte->mf_layer_meta_group_title = $titre; - } - if (!is_null($ordre)) { - $igoCoucheContexte->layer_a_order = $ordre; - } - - $igoCoucheContexte->mf_layer_meta_z_order = $igoGroupe->mf_layer_meta_z_order; - break; - - case 'colonne': - - $igoCoucheContexte->couche_id = $couche_id; - $igoCoucheContexte->groupe_id = $groupe_id; - $igoCoucheContexte->arbre_id = $arbre_id; - $igoCoucheContexte->attribut_id = $attribut_id; - $igoCoucheContexte->ind_fond_de_carte = 'D'; - //$igoCoucheContexte->couche_id = $couche_id; - - break; - - case 'couche': - $igoCouche = IgoCouche::findFirst('id=' . $couche_id); - if (!$igoCouche) { - $this->flash->error("La couche ayant le igo_couche.id « $couche_id » n'existe pas."); - } - $igoCoucheContexte->groupe_id = $groupe_id; - $igoCoucheContexte->couche_id = $couche_id; - $igoCoucheContexte->arbre_id = $arbre_id; - $igoCoucheContexte->ind_fond_de_carte = 'D'; - $igoCoucheContexte->mf_layer_meta_name = $igoCouche->mf_layer_meta_name; - $igoCoucheContexte->mf_layer_meta_title = $igoCouche->mf_layer_meta_title; - $igoCoucheContexte->mf_layer_meta_z_order = $igoCouche->mf_layer_meta_z_order; - if (!is_null($titre)) { - $igoCoucheContexte->mf_layer_meta_group_title = $titre; - $igoCoucheContexte->mf_layer_meta_title = $titre; - } - if (!is_null($ordre)) { - $igoCoucheContexte->layer_a_order = $ordre; - } - - break; - } - } - - if ($igoCoucheContexte) { - //Modifier la valeur de l'attribut - $valeur = $valeur == '1'; - - $attribut = substr($name, 1, 1); - switch ($attribut) { - case "V": - $changed = $changed || ($igoCoucheContexte->est_visible) <> $valeur; - $igoCoucheContexte->est_visible = $valeur; - - break; - case "A": - $changed = $changed || ($igoCoucheContexte->est_active) <> $valeur; - $igoCoucheContexte->est_active = $valeur; - break; - case "X": - $changed = $changed || ($igoCoucheContexte->est_exclu) <> $valeur; - $igoCoucheContexte->est_exclu = $valeur; - break; - case "T": - if (!is_null($titre) && "" != $titre) { - $changed = $changed || $igoCoucheContexte->mf_layer_meta_group_title <> $titre; - $igoCoucheContexte->mf_layer_meta_group_title = $titre; - } - break; - case "O": - if (!is_null($ordre)) { - $changed = $changed || $igoCoucheContexte->layer_a_order <> $ordre; - $igoCoucheContexte->layer_a_order = $ordre; - } - break; - } - } - - if ($changed) { - - if (!$igoCoucheContexte->save()) { - - foreach ($igoCoucheContexte->getMessages() as $message) { - $this->flash->error($message); - } - } - } - } - - $contexteController = new IgoContexteController(); - $contexteController->saveMapFile($contexte_id); - - $igo_contexte = IgoContexte::findFirstByid($contexte_id); - if (!$igo_contexte) { - $this->flash->error("igo_contexte non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => "igo_contexte", - "action" => "index" - )); - } - - $profils = $this->session->get("profils"); - $liste_profil_id_utilisateur = array(); - if ($profils) { - foreach ($profils as $profil) { - array_push($liste_profil_id_utilisateur, $profil["id"]); - } - } - - $liste_profil_id_utilisateur = implode(",", $liste_profil_id_utilisateur); - if (!$liste_profil_id_utilisateur) { - $liste_profil_id_utilisateur = 0; - } - -$sql=" select 'G'::character varying(1) AS type, - gr.groupe_id as id, - gr.nom, - cc.mf_layer_meta_group_title AS mf_layer_meta_group_title, - gr.groupe_id AS groupe_id, - NULL::integer AS attribut_id, - COALESCE(cc.est_visible, false) AS visible, - COALESCE(cc.est_active, false) AS active, - COALESCE(cc.est_exclu, false) AS exclu, - NULL::text AS colonne, - NULL::boolean AS est_commune, - NULL::integer AS couche_id, - cc.id AS couche_contexte_id, - cc.layer_a_order AS layer_a_order, - true AS association_est_association, - COALESCE(cc.arbre_id, gr.grp) as grp, - (length(grp) - length(replace(grp, '_'::text, ''::text))) as len - from igo_vue_groupes_recursif gr - LEFT JOIN igo_couche_contexte cc ON cc.arbre_id=grp AND cc.contexte_id={$contexte_id} and cc.couche_id IS NULL - --LEFT JOIN igo_vue_permissions_pour_groupes pg ON pg.profil_id IN ({$liste_profil_id_utilisateur}) - UNION - select 'C'::character varying(1) AS type, - c.id, - c.mf_layer_meta_title AS nom, - cc.mf_layer_meta_group_title AS mf_layer_meta_group_title, - gc.groupe_id AS groupe_id, - igo_attribut.id AS attribut_id, - COALESCE(cc.est_visible,false) AND cc.arbre_id = gr.grp AS visible, - COALESCE(cc.est_active,false) AND cc.arbre_id = gr.grp AS active, - COALESCE(cc2.est_exclu,false) AND igo_attribut.id = cc2.attribut_id AS exclu, - igo_attribut.colonne AS colonne, - c.est_commune AS est_commune, - c.id AS couche_id, - cc.id AS couche_contexte_id, - COALESCE(NULLIF(cc.layer_a_order, 0), c.layer_a_order) AS layer_a_order, - igo_vue_permissions_pour_couches.est_association AS association_est_association, - COALESCE(cc.arbre_id, gr.grp) as grp, - (length(grp) - length(replace(grp, '_'::text, ''::text))) as len - from igo_vue_groupes_recursif gr - JOIN igo_groupe_couche gc ON gc.groupe_id=gr.groupe_id - JOIN igo_couche c ON gc.couche_id=c.id - JOIN igo_geometrie ON c.geometrie_id = igo_geometrie.id - LEFT JOIN igo_attribut ON igo_attribut.geometrie_id = igo_geometrie.id - LEFT JOIN igo_couche_contexte cc ON c.id=cc.couche_id AND cc.contexte_id={$contexte_id} and cc.arbre_id=grp and cc.attribut_id IS NULL - LEFT JOIN igo_couche_contexte cc2 ON c.id=cc.couche_id AND cc.contexte_id={$contexte_id} and cc.arbre_id=grp and cc2.attribut_id IS NOT NULL and cc2.attribut_id=igo_attribut.id - LEFT JOIN igo_vue_permissions_pour_couches ON igo_vue_permissions_pour_couches.couche_id = cc.id -ORDER BY grp, len, type DESC, layer_a_order"; - //echo $sql; - $igo_groupe = new IgoGroupe(); - - $igo_groupe = new Resultset(null, $igo_groupe, $igo_groupe->getReadConnection()->query($sql)); - //$igo_groupe=$this->modelsManager->executeQuery($sql); - - $this->view->setVar("arbre", $igo_groupe); - // var_dump($this->udate()); - } -} diff --git a/pilotage/app/controllers/CRUD/IgoCoucheController.php b/pilotage/app/controllers/CRUD/IgoCoucheController.php deleted file mode 100644 index 5be728e4..00000000 --- a/pilotage/app/controllers/CRUD/IgoCoucheController.php +++ /dev/null @@ -1,247 +0,0 @@ -persistent->parameters = null; - - $this->setGeometrieDesc(); - parent::indexAction($r_controller, $r_action, $r_id); - } - - public function associerContexteAction($id, $page = 1) { - $this->view->setVar("id", $id); - $this->view->setVar("page", $page); - $this->view->setVar("contexte_id", $id); - } - - public function associerContexteEditAction($param) { - $numberPage = 1; - - if (strpos($param, "&") > 0) { //Ok, Ok, c'est pas joli... il faudra parser. voir arbreCouchesEditAction - $numberPage = substr($param, strpos($param, "&page=") + 6); - $param = substr($param, 0, strpos($param, "&")); - } - - if ($this->startsWith($param, "contexte_id")) { - $contexte_id = intval(substr($param, strrpos($param, "=") + 1)); - // Sauvegarde du formulaire - $act_id = $id = 0; - $nouvelleValeur = FALSE; // - $a_creer = TRUE; // L'instance de couche contexte doit être créee - foreach ($_POST as $attribut_id => $valeur) { - if ($this->endsWith($attribut_id, "_")) { - $couche_contexte_id = 0; - } else { - $couche_contexte_id = intval(substr($attribut_id, strrpos($attribut_id, "_") + 1)); - } - $attribut_id = substr($attribut_id, 0, strrpos($attribut_id, "_")); - $id = intval(substr($attribut_id, strrpos($attribut_id, "_") + 1)); - $attribut = substr($attribut_id, 0, strrpos($attribut_id, "_")); - - if ($id > 0) { //C'est un attribut - if ($act_id <> $id) { //une autre ligne - if ($act_id <> 0 && $nouvelleValeur) { - - $igoCouchecontexte->save(); - if (!($igoCouchecontexte->est_visible || $igoCouchecontexte->est_active)) { - $igoCouchecontexte->delete(); - } - } - $nouvelleValeur = FALSE; - $a_creer = TRUE; - } - if ($a_creer) { - if ($couche_contexte_id == 0) { - $igoCouchecontexte = new IgoCoucheContexte(); - //$igoCouche=IgoCouche::findFirst("id=" . $id); - $igoCouchecontexte->contexte_id = $contexte_id; - $igoCouchecontexte->couche_id = $id; - } else { - $igoCouchecontexte = IgoCoucheContexte::findFirst("id=" . $couche_contexte_id); - } - $nouvelleValeur = $igoCouchecontexte->est_visible || $igoCouchecontexte->est_active; - $igoCouchecontexte->est_visible = FALSE; - $igoCouchecontexte->est_active = FALSE; - $a_creer = FALSE; - } - - if (isset($valeur) && $valeur <> 0 && trim($valeur) <> "" && !is_null($valeur) && $valeur <> FALSE) { - $nouvelleValeur = TRUE; - } - - - $act_id = $id; - $igoCouchecontexte->$attribut = $valeur; - } - } - if ($act_id <> 0 && $nouvelleValeur) { - $igoCouchecontexte->save(); - if (!($igoCouchecontexte->est_visible || $igoCouchecontexte->est_active)) { - $igoCouchecontexte->delete(); - } - } - $this->flash->notice("Changements sauvegardés"); - - //Requête - $phql = $this->modelsManager->createBuilder() - ->columns("IgoCoucheContexte.id as id," - . "type," - . "IgoCouche.id as couche_id," - . "IgoCouche.description," - . "classe_entite_id," - . "geometrie_type_id," - . "est_fond_de_carte," - . "est_visible," - . "est_active," - . "ind_fond_de_carte," - . "IgoCoucheContexte.mf_layer_meta_name," - . "IgoCoucheContexte.mf_layer_meta_title," - . "IgoCoucheContexte.mf_layer_meta_group_title," - . "mf_layer_class_def") - ->from('IgoCouche') - ->join('IgoGeometrie') - ->leftjoin('IgoCoucheContexte') - ->where("IgoCoucheContexte." . $param . " OR IgoCoucheContexte.contexte_id IS NULL") - ->orderBy('contexte_id'); - } - - - $paginator = new Phalcon\Paginator\Adapter\QueryBuilder(array( - "builder" => $phql, - "limit" => 10, - "page" => $numberPage - )); - - $this->view->page = $paginator->getPaginate(); - } - - /** - * Displayes the creation form - */ - public function newAction($r_controller = null, $r_action = null, $r_id = null) { - - parent::newAction($r_controller, $r_action, $r_id); - /* - $igo_couche = IgoCouche::findFirstByid($id); - if (!$igo_couche) { - $this->flash->error("Couche $id non-trouvée"); - } else { - $this->tag->setDefault("acces", $igo_couche->IgoGeometrie->acces); - }*/ - $this->setGeometrieDesc(); - if ($this->session->has("geometrie_id")) { - $geometrie_id=$this->session->get("geometrie_id"); - $this->tag->setDefault("geometrie_id", $geometrie_id); - $igo_geometrie = IgoGeometrie::findFirstByid($geometrie_id); - $this->tag->setDefault("acces",$igo_geometrie->acces); - } - } - - /** - * Edits a igo_couche - * - * @param string $id - */ - public function editAction($id=null, $r_controller = null, $r_action = null, $r_id = null) { - - - if ($this->request->isPost() && (!isset($id) || !is_numeric($id))) { - $id = $this->request->getPost("id"); - } - - parent::editAction($id, $r_controller, $r_action, $r_id); - - $igo_couche = IgoCouche::findFirstByid($id); - - if (!$igo_couche) { - $this->flash->error("Couche $id non-trouvée"); - } else { - $this->tag->setDefault("acces", $igo_couche->IgoGeometrie->acces); - } - - $this->setGeometrieDesc(); - } - - public function saveAction($r_controller = null, $r_action = null, $r_id = null){ - - $this->setGeometrieDesc(); - parent::saveAction($r_controller, $r_action, $r_id); - - } - - function ficheAction($id, $r_controller = null, $r_action = null, $r_id = null) { - $retour = ""; - if (!is_null($r_id)) { - $retour = $r_controller . "/" . $r_action . "/" . $r_id . $this->r_parameters; - } - $this->view->setVar("retour", $retour); - - - if (!$this->request->isPost()) { - - $igo_couche = IgoCouche::findFirstByid($id); - if (!$igo_couche) { - $this->flash->error("Couche $id non-trouvée"); - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - if (!isset($igo_couche->IgoGeometrie->IgoClasseEntite->IgoCatalogueCsw)) { - $this->view->setVar("fiche","Catalogue non-trouvé"); - return; - } - $catalogue = $igo_couche->IgoGeometrie->IgoClasseEntite->IgoCatalogueCsw->url; - $fiche_csw_id = $igo_couche->fiche_csw_id; - if (trim($fiche_csw_id) == "") { - $fiche_csw_id = $igo_couche->mf_layer_name; //TODO devrait être fait par la réingénierie. Préséence à msp_class_meta - } - $url = "http://" . $catalogue . "?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&outputSchema=csw:IsoRecord&ID={$fiche_csw_id}&elementSetName=full"; - try{ - $xml = parent::curl_file_get_contents($url); - $this->view->setVar("fiche",$this->transform($xml, file_get_contents("xml/bs_full.xsl"))); - } catch (Exception $e){ - $this->view->setVar("fiche","Erreur lors de l'accès au catalogue"); - } - } - } -/* - public function saveAction($r_controller = null, $r_action = null, $r_id = null) { - parent::saveAction($r_controller, $r_action, $r_id); - $couche_id = $this->request->getPost("id"); - $couche = IgoCouche::findFirstById($couche_id); - if (!$couche) { - throw new Exception("Couche inexistante"); - } - $couche->save(); - - - }*/ - - function transform($xml, $xsl) { - $xslt = new XSLTProcessor(); - $xslt->importStylesheet(new SimpleXMLElement($xsl)); - return $xslt->transformToXml(new SimpleXMLElement($xml)); - } - - function setGeometrieDesc(){ - $phql = "SELECT g.id, CONCAT(e.nom,\":\",t.nom) as nom FROM IgoClasseEntite AS e, IgoGeometrie AS g, IgoGeometrieType AS t where g.classe_entite_id=e.id and g.geometrie_type_id=t.id ORDER BY nom"; - $geometrie_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("geometrie_desc", $geometrie_desc); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoGeometrieController.php b/pilotage/app/controllers/CRUD/IgoGeometrieController.php deleted file mode 100644 index b2afe56d..00000000 --- a/pilotage/app/controllers/CRUD/IgoGeometrieController.php +++ /dev/null @@ -1,14 +0,0 @@ -session->has("classe_entite_id")) { - $this->tag->setDefault("classe_entite_id", $this->session->get("classe_entite_id")); - } - - $this->tag->setDefault("acces", "L"); - - parent::newAction($r_controller, $r_action, $r_id); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoGeometrieTypeController.php b/pilotage/app/controllers/CRUD/IgoGeometrieTypeController.php deleted file mode 100644 index 15262588..00000000 --- a/pilotage/app/controllers/CRUD/IgoGeometrieTypeController.php +++ /dev/null @@ -1,12 +0,0 @@ -tag->setDefault("geometrie_type", "V"); - - parent::newAction($r_controller, $r_action, $r_id); - } -} diff --git a/pilotage/app/controllers/CRUD/IgoGroupeController.php b/pilotage/app/controllers/CRUD/IgoGroupeController.php deleted file mode 100644 index 4d69764c..00000000 --- a/pilotage/app/controllers/CRUD/IgoGroupeController.php +++ /dev/null @@ -1,509 +0,0 @@ -view->setVar("id", $id); - $this->view->setVar("page", $page); - $this->view->setVar("contexte_id", $id); - } - - public function associerContexteEditAction($param) { - $numberPage = 1; - - if (strpos($param, "&") > 0) { //Ok, Ok, c'est pas joli... il faudra parser. - $numberPage = substr($param, strpos($param, "&page=") + 6); - $param = substr($param, 0, strpos($param, "&")); - } - - if ($this->startsWith($param, "contexte_id")) { - $contexte_id = intval(substr($param, strrpos($param, "=") + 1)); - // Sauvegarde du formulaire - $act_id = $id = 0; - $nouvelleValeur = FALSE; // - $a_creer = TRUE; // L'instance de couche contexte doit être créée - foreach ($_POST as $attribut_id => $valeur) { - if ($this->endsWith($attribut_id, "_")) { - $couche_contexte_id = 0; - } else { - $couche_contexte_id = intval(substr($attribut_id, strrpos($attribut_id, "_") + 1)); - } - $attribut_id = substr($attribut_id, 0, strrpos($attribut_id, "_")); - $id = intval(substr($attribut_id, strrpos($attribut_id, "_") + 1)); - $attribut = substr($attribut_id, 0, strrpos($attribut_id, "_")); - /* - var_dump($contexte_id); - var_dump($id); - var_dump($attribut_id); - var_dump($attribut); - var_dump($valeur); - */ - if ($id > 0) { //C'est un attribut - if ($act_id <> $id) { //une autre ligne - if ($act_id <> 0 && $nouvelleValeur) { - $igoCouchecontexte->save(); - if (!($igoCouchecontexte->est_visible || $igoCouchecontexte->est_active)) { - $igoCouchecontexte->delete(); - } - } - $nouvelleValeur = FALSE; - $a_creer = TRUE; - } - if ($a_creer) { - if ($couche_contexte_id == 0) { - $igoCouchecontexte = new IgoCoucheContexte(); - //$igoCouche=IgoCouche::findFirst("id=" . $id); - $igoCouchecontexte->contexte_id = $contexte_id; - $igoCouchecontexte->groupe_id = $id; - } else { - $igoCouchecontexte = IgoCoucheContexte::findFirst("id=" . $couche_contexte_id); - } - $nouvelleValeur = $igoCouchecontexte->est_visible || $igoCouchecontexte->est_active; - $igoCouchecontexte->est_visible = FALSE; - $igoCouchecontexte->est_active = FALSE; - $a_creer = FALSE; - } - - if (isset($valeur) && $valeur <> 0 && trim($valeur) <> "" && !is_null($valeur) && $valeur <> FALSE) { - $nouvelleValeur = TRUE; - } - - $act_id = $id; - $igoCouchecontexte->$attribut = $valeur; - } - } - if ($act_id <> 0 && $nouvelleValeur) { - $igoCouchecontexte->save(); - if (!($igoCouchecontexte->est_visible || $igoCouchecontexte->est_active)) { - $igoCouchecontexte->delete(); - } - } - $this->flash->notice("Changements sauvegardés"); - //Requête - $phql = $this->modelsManager->createBuilder() - ->columns("IgoCoucheContexte.id as id," - . "IgoGroupe.id as groupe_id," - . "nom," - . "IgoGroupe.description," - . "ind_fond_de_carte," - . "est_visible," - . "est_active") - ->from('IgoGroupe') - ->leftjoin('IgoCoucheContexte') - ->where("IgoCoucheContexte." . $param . " OR IgoCoucheContexte.contexte_id IS NULL") - ->orderBy('contexte_id'); - } - - - $paginator = new Phalcon\Paginator\Adapter\QueryBuilder(array( - "builder" => $phql, - "limit" => 10, - "page" => $numberPage - )); - - $this->view->page = $paginator->getPaginate(); - } - - public function newAction($r_controller = null, $r_action = null, $r_id = null) { - - // $this->definirGroupesPourSelecteur(); - // $this->definirCouchesPourSelecteur(); - - parent::newAction($r_controller, $r_action, $r_id); - } - - function editAction($id, $r_controller = null, $r_action = null, $r_id = null) { - $this->definirParentsPourSelecteur($id); - //$this->definirGroupesPourSelecteur($id); - $this->definirCouchesPourSelecteur($id); - - parent::editAction($id, $r_controller, $r_action, $r_id); - } - - /** - * Créé le groupe et lui associe ses enfants - * @param type $r_controller - * @param type $r_action - * @param type $r_id - */ - public function createAction($r_controller = null, $r_action = null, $r_id = null) { - - if (!$this->request->isPost()) { - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - $igo_groupe = new IgoGroupe(); - - $this->assigneFromPost($igo_groupe); - try { - if (!$igo_groupe->save()) { - foreach ($igo_groupe->getMessages() as $message) { - $this->flash->error($message); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } else { - $this->flash->success(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " " . $igo_groupe->id . " créé avec succès"); - } - } catch (\Exception $e) { - - //Réassigner les couches enfants pour l'affichage - if ('couche' == $specifier) { - - //Couches qu'il ne faut pas réafficher comme enfant du groupe - $couchesPasEnfantDeGroupe = $this->modelsManager->executeQuery("SELECT c.id AS valeur, c.mf_layer_name AS libelle " . - "FROM IgoGroupeCouche AS gc " . - "INNER JOIN IgoCouche AS c ON c.id = gc.couche_id " . - "WHERE gc.id NOT IN ($ids) " . - "ORDER BY c.mf_layer_name" - ); - //Couches qu'ils faut réafficher comme enfant du groupe - $couchesEnfantDeGroupe = $this->modelsManager->executeQuery("SELECT c.id AS valeur, c.mf_layer_name AS libelle " . - "FROM IgoGroupeCouche AS gc " . - "INNER JOIN IgoCouche AS c ON c.id = gc.couche_id " . - "WHERE gc.id IN ($ids) " - ); - - $this->view->setVar("couchesPasEnfantDeGroupe", $couchesPasEnfantDeGroupe); - $this->view->setVar("couchesEnfantDeGroupe", $couchesEnfantDeGroupe); - - $this->definirGroupesPourSelecteur(); - - //Réassigner les groupes enfants pour l'affichage - } elseif ('groupe' == $specifier) { - - //Groupes qu'on peut assigner comme enfant. Ceux qui sont à la racine et qui ne sont pas ses parents - $groupesPasEnfantDeGroupe = $this->modelsManager->executeQuery("SELECT id AS valeur, nom AS libelle FROM IgoGroupe WHERE id NOT IN :ids: ORDER BY nom", array( - 'ids' => $ids - )); - - //Groupes qui sont dans le groupe - $groupesEnfantDeGroupe = $this->modelsManager->executeQuery("SELECT id AS valeur, nom AS libelle FROM IgoGroupe WHERE id IN :ids: ORDER BY nom", array( - 'ids' => $ids - )); - - $this->view->setVar("groupesPasEnfantDeGroupe", $groupesPasEnfantDeGroupe); - $this->view->setVar("groupesEnfantDeGroupe", $groupesEnfantDeGroupe); - - $this->definirCouchesPourSelecteur(); - } - - $this->flash->error($e->getMessage()); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - $specifier = $this->request->getPost('specifier'); - - - - //Nettoyer les id de la liste des enfants à traiter - if ('couche' == $specifier) { - - $ids = $this->request->getPost('multiselect_couche_valeurs'); - } elseif ('groupe' == $specifier) { - $ids = $this->request->getPost('multiselect_groupe_valeurs'); - } - - //Nettoyer la liste de ID - $ids = explode(',', $ids); - foreach ($ids as $cle => $valeur) { - $ids[$cle] = intval($valeur); - } - $ids = implode(',', $ids); - - $profil_proprietaire_id = intval($this->request->getPost('profil_proprietaire_id')); - $this->gererAssociationEnfantsGroupeCouche($specifier, $igo_groupe->id, $ids, $profil_proprietaire_id); - - if ($profil_proprietaire_id && !$igo_groupe->groupe_id) { - - //Créer une permission pour le groupe - $igo_permission = new IgoPermission(); - $igo_permission->profil_id = $profil_proprietaire_id; - $igo_permission->groupe_id = $igo_groupe->id; - $igo_permission->est_lecture = true; - $igo_permission->est_analyse = true; - $igo_permission->est_ecriture = true; - $igo_permission->est_export = true; - $igo_permission->est_association = true; - if (!$igo_permission->save()) { - foreach ($igo_permission->getMessages() as $message) { - echo $message; - } - } - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "search" - )); - } - - /* - * Fait enregistrer les enfants du groupe (soit des groupes ou des couches), - * puis enregistre les autres champs du formulaire - */ - - function saveAction($r_controller = null, $r_action = null, $r_id = null) { - - try { - $save = parent::saveAction($r_controller, $r_action, $r_id); - } catch (Exception $ex) { - $this->flash->error($e->getMessage()); - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - // On récupère le profil propriétaire du groupe ajouté - $profil_proprietaire_id = $this->request->getPost("profil_proprietaire_id"); - $id = intval($this->request->getPost('id')); - - $this->gererAssociationParentsGroupeCouche($id, $profil_proprietaire_id); - $this->gererAssociationEnfantsGroupeCouche($id, $profil_proprietaire_id); - - $igoVueGroupesRecursifMaterialized = new IgoVueContexteGroupesRecursifMaterialized(); - $igoVueGroupesRecursifMaterialized->refresh(); - - $igoVueContexteGroupesRecursifMaterialized = new IgoVueContexteGroupesRecursifMaterialized(); - $igoVueContexteGroupesRecursifMaterialized->refresh(); - - return $save; - } - - /** - * - * @param string $type Type d'enfant : 'couche' ou 'groupe' - - * @param int $profil_id Profil propriéraire du groupe - */ - private function gererAssociationEnfantsGroupeCouche($id, $profil_id) { - //Détermine si le groupe contient des couches ou des groupes - $specifier = $this->request->getPost('specifier'); - //Nettoyer les id de la liste des enfants à traiter - if ('couche' == $specifier) { - $ids = $this->request->getPost('multiselect_couche_enfant_valeurs'); - } elseif ('groupe' == $specifier) { - $ids = $this->request->getPost('multiselect_groupe_enfant_valeurs'); - } - - $ids = explode(',', $ids); - foreach ($ids as $index => $valeur) { - $valeur = intval($valeur); - - if ($valeur) { - $ids[$index] = $valeur; - }else{ - unset($ids[$index]); - } - - } - - $igo_groupe_couche = new IgoGroupeCouche(); - - switch ($specifier) { - - //Le groupe contient des couches - case 'couche': - - //Supprimer tous les sous-groupes de ce groupe - $this->modelsManager->executeQuery("DELETE FROM IgoGroupeGroupe WHERE parent_groupe_id = {$id}"); - - $igo_groupe_couche->enleverCouchesDuGroupe(implode(',', $ids), $id, $profil_id); - $igo_groupe_couche->ajouterCouchesAuGroupe(implode(',', $ids), $id, $profil_id); - - break; - - //Le groupe contient des groupes - case 'groupe': - - //Supprimer tous les sous-groupes de ce groupe - $this->modelsManager->executeQuery("DELETE FROM IgoGroupeGroupe WHERE parent_groupe_id = {$id}"); - - //Supprimer toutes les couches de ce groupe - $igo_groupe_couche->enleverCouchesDuGroupe(0, $id, $profil_id); - - foreach ($ids as $parent_groupe_id) { - //echo"INSERT into IgoGroupeGroupe (groupe_id, parent_groupe_id) VALUES ({$parent_groupe_id},{$id})"; - $this->modelsManager->executeQuery("INSERT into IgoGroupeGroupe (groupe_id, parent_groupe_id) VALUES ({$parent_groupe_id},{$id})"); - } - break; - default: - - break; - } - } - - /** - * - * @param string $type Type d'enfant : 'couche' ou 'groupe' - - * @param int $profil_id Profil propriéraire du groupe - */ - private function gererAssociationParentsGroupeCouche($id, $profil_id) { - //Nettoyer les id de la liste des parents à traiter - - $ids = $this->request->getPost('multiselect_groupe_parent_valeurs'); - - $ids = explode(',', $ids); - foreach ($ids as $index => $valeur) { - $valeur = intval($valeur); - - if ($valeur) { - $ids[$index] = $valeur; - }else{ - unset($ids[$index]); - } - - } - - $igo_groupe_couche = new IgoGroupeCouche(); - - //Supprimer tous les groupes parents de ce groupe - $this->modelsManager->executeQuery("DELETE FROM IgoGroupeGroupe WHERE groupe_id = {$id}"); - - - foreach ($ids as $parent_groupe_id) { - - $igoGroupeGroupe = new IgoGroupeGroupe(); - $igoGroupeGroupe->groupe_id = $id; - $igoGroupeGroupe->parent_groupe_id = $parent_groupe_id; - $igoGroupeGroupe->save(); - - } - } - - /** - * Stocke dans la vue, pour un groupe, les groupes, qui sont - * ses parents directs et qui ne sont ses parents - * @param int $id Groupe courant - */ - private function definirParentsPourSelecteur($id = 0) { - $groupe = IgoGroupe::findFirst($id); - $groupesParentsDeGroupe = array(); - $groupesEnfantsDeGroupe = array(); - $groupesPasParentsDeGroupe = array(); - $groupesPasEnfantsDeGroupe= array(); - - $estAdmin = $this->session->get("info_utilisateur")->estAdmin; - if ($estAdmin) { - foreach ($groupe->parents as $value) { - $groupesParentsDeGroupe[] = array("id" => $value->id, "valeur" => $value->nom); - } - - foreach ($groupe->enfants as $value) { - $groupesEnfantsDeGroupe[] = array("id" => $value->id, "valeur" => $value->nom); - } - - $sql = "SELECT last(groupe_id) as groupe_id, last(nom) as nom, last(parent_groupe_id) as parent_groupe_id, last(nom_complet) as nom_complet, last(est_exclu_arbre) as est_exclu_arbre" - . " from igo_vue_groupes_recursif" - . " WHERE groupe_id not in (select groupe_id from igo_vue_groupes_recursif where concat(' ',grp,' ') like '% " . $groupe->id . " %' )" - . " AND groupe_id not in (select groupe_id from igo_groupe_couche)" - . "GROUP BY groupe_id"; - $groupes = new IgoVueGroupesRecursif(); - $liste = new Resultset(null, $groupes, $groupes->getReadConnection()->query($sql)); - - - foreach ($liste as $value) { - $groupesPasParentsDeGroupe[] = array("id" => $value->groupe_id, "valeur" => $value->nom); - } - $sql = "SELECT last(groupe_id) as groupe_id, last(nom) as nom, last(parent_groupe_id) as parent_groupe_id, last(nom_complet) as nom_complet, last(est_exclu_arbre) as est_exclu_arbre" - . " from igo_vue_groupes_recursif" - . " WHERE groupe_id not in (select groupe_id from igo_vue_groupes_recursif where concat(' ',grp,' ') like '% " . $groupe->id . " %' )" - . "GROUP BY groupe_id"; - /* - $sql = "SELECT * from igo_vue_groupes_recursif" - . " WHERE groupe_id not in (select groupe_id from igo_vue_groupes_recursif where concat('/',nom_complet,'/')like '%/" . $groupe->nom . "/%')" */ ; - $groupes = new IgoVueGroupesRecursif(); - $liste = new Resultset(null, $groupes, $groupes->getReadConnection()->query($sql)); - - - foreach ($liste as $value) { - $groupesPasEnfantsDeGroupe[] = array("id" => $value->groupe_id, "valeur" => $value->nom); - } - - //Est un pilote - } else { - //TODO - } - - $this->view->setVar("groupesPasParentsDeGroupe", $groupesPasParentsDeGroupe); - $this->view->setVar("groupesPasEnfantsDeGroupe", $groupesPasEnfantsDeGroupe); - $this->view->setVar("groupesParentsDeGroupe", $groupesParentsDeGroupe); - $this->view->setVar("groupesEnfantsDeGroupe", $groupesEnfantsDeGroupe); - } - - /** - * Stocke dans la vue, pour un groupe, les groupes et les couches, qui sont son enfant et qui ne sont pas son enfant - * @param int $id Groupe courant - */ - private function definirCouchesPourSelecteur($id = 0) { - $id = intval($id); - $couchesEnfantDeGroupe = array(); - $couchesPasEnfantDeGroupe = array(); - - $groupe = IgoGroupe::findFirst($id); - $estAdmin = $this->session->get("info_utilisateur")->estAdmin; - if ($estAdmin) { - //Couches qui ne sont pas dans le groupe - $sql = "SELECT DISTINCT c.id , c.mf_layer_name AS valeur " - . "FROM igo_couche AS c " - . "LEFT JOIN igo_groupe_couche AS gc ON c.id = gc.couche_id WHERE gc.groupe_id <> {$id} " - . "AND NOT EXISTS (SELECT id FROM igo_groupe_couche AS sr_gc WHERE sr_gc.couche_id = c.id AND sr_gc.groupe_id = {$id}) "; - - $igo_groupe = new IgoGroupe(); - $couchesPasEnfantDeGroupe = new Resultset(null, $igo_groupe, $igo_groupe->getReadConnection()->query($sql)); - } else { - - $profils = $this->getDi()->getSession()->get("profils"); - $ids_profil = array(); - foreach ($profils as $profil) { - - $ids_profil[] = $profil["id"]; - } - $ids_profil = implode(',', $ids_profil); - - //Couches qui ne sont pas dans le groupe - $sql = "SELECT DISTINCT c.id , c.mf_layer_name AS valeur - FROM igo_couche AS c - LEFT JOIN igo_groupe_couche AS gc ON c.id = gc.couche_id - INNER JOIN IgoVuePermissionsPourCouches AS vpc - ON vpc.couche_id = gc.id - WHERE gc.groupe_id <> :groupe_id: - AND est_association AND profil_id IN ({$ids_profil})"; - - $couchesPasEnfantDeGroupe = $this->modelsManager->executeQuery($sql, array( - 'groupe_id' => $id - )); - } - - $estGroupeDeCouche = $groupe->couches->count(); - $this->view->setVar("estGroupeDeCouche", $estGroupeDeCouche); - - //Couches qui sont dans le groupe - foreach ($groupe->couches as $value) { - $couchesEnfantDeGroupe[] = array("id" => $value->id, "valeur" => $value->mf_layer_name); - } - - - $this->view->setVar("couchesPasEnfantDeGroupe", $couchesPasEnfantDeGroupe); - $this->view->setVar("couchesEnfantDeGroupe", $couchesEnfantDeGroupe); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoGroupeCoucheController.php b/pilotage/app/controllers/CRUD/IgoGroupeCoucheController.php deleted file mode 100644 index 672a9a81..00000000 --- a/pilotage/app/controllers/CRUD/IgoGroupeCoucheController.php +++ /dev/null @@ -1,8 +0,0 @@ -persistent->parameters = null; - $phql = "SELECT c.id, CONCAT(c.nom,\" , \",c.prenom) as nom FROM IgoContact c, IgoOrganismeResponsable o where o.contact_id=c.id order by nom"; - $contact_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("contact_desc", $contact_desc); - parent::initialize(); - } - public function newAction($r_controller = null, $r_action = null, $r_id = null) { - $this->persistent->parameters = null; - $phql = "SELECT c.id, CONCAT(c.nom,\" , \",c.prenom) as nom FROM IgoContact c order by nom"; - $contact_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("contact_desc", $contact_desc); - parent::newAction($r_controller, $r_action, $r_id); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoPermissionController.php b/pilotage/app/controllers/CRUD/IgoPermissionController.php deleted file mode 100644 index a5202e5f..00000000 --- a/pilotage/app/controllers/CRUD/IgoPermissionController.php +++ /dev/null @@ -1,302 +0,0 @@ -view->setVar("controller", $this->getControllerName()); - $this->view->setVar("action", $this->getActionName()."/".$this->getParameters()); - parent::searchAction($parameters); - } - - - public function editwAction($id, $r_controller = null, $r_action = null, $r_id = null) { - $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); - $this->editAction($id, "igo_permission", "editw", $id); - $this->view->setRenderLevel(View::LEVEL_MAIN_LAYOUT); - } - - public function editAction($id, $r_controller = null, $r_action = null, $r_id = null) { - $phql = "SELECT a.id, CONCAT(c.nom,\":\",a.colonne) as nom FROM IgoGeometrie as g, IgoAttribut as a, IgoClasseEntite as c where a.geometrie_id=g.id and g.classe_entite_id=c.id order by c.nom, a.colonne"; - $attribut_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("attribut_desc", $attribut_desc); - parent::editAction($id, $r_controller, $r_action, $r_id); - } - - public function arbreCouchesAction($profil_id) { - $this->view->setVar("id", $profil_id); - // $this->view->setVar("page", $page); - $this->view->setVar("profil_id", $profil_id); - } - - public function arbreCouchesEditAction($param) { - - $params = array(); - $deleted=false; - parse_str($param, $params); - - $profil_id = isset($params['profil_id']) ? $params['profil_id'] : false; - - - if (!$profil_id) { - $this->flash->error("igo_profil non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => "igo_profil", - "action" => "index" - )); - } - - //On récupère les données du formulaire Associer des groupes et des couches - if (isset($_POST['valeursArbo'])) { - $valeurs = json_decode($_POST['valeursArbo']); - - //On récupères les données de la rétro d'un mapfile - } else { - $valeurs = $_POST; - } - - //Sauvegarde des items du formulaire - $igoPermission = false; - - foreach ($valeurs as $name => $valeur) { - if (!$deleted){ - $phql = "DELETE FROM IgoPermission WHERE profil_id={$profil_id}"; - $this->modelsManager->executeQuery($phql); - $deleted=true; - //var_dump($deleted); - } - $couche_id=null; - $changed = false; - $type = null; - $titre = null; - - - //Déterminer à quoi on a affaire - if ('G' == substr($name, 0, 1)) { - $type = 'groupe'; - $a = explode("_", substr($name, 2)); - $groupe_id = array_pop($a); - } elseif ('CX' == substr($name, 0, 2)) { - $type = 'colonne'; - $a = explode("_", substr($name, 2)); - $attribut_id = array_pop($a); - $couche_id = substr($name, 2, strpos($name, "_") - 2); - } elseif ('C' == substr($name, 0, 1)) { - $type = 'couche'; - $couche_id = explode("_", substr($name, 2))[0]; - } - //if (isset($valeur)&& $valeur!=0){ - // printf("name: %s, groupe_id: %s, couche_id: %s, type: %s, valeur: %s
    ", $name, $groupe_id, $couche_id, $type, $valeur); - // } - //Tenter de récupérer le igo_couche_contexte associé - switch ($type) { - case 'groupe': - - if (!$igoPermission || $igoPermission->groupe_id <> $groupe_id) { - $igoPermission = IgoPermission::findFirst("profil_id={$profil_id} AND groupe_id={$groupe_id} AND attribut_id is null"); - } - break; - - case 'colonne': - - $igoPermission = IgoPermission::findFirst("profil_id={$profil_id} AND attribut_id={$attribut_id}"); - break; - - case 'couche': - if (!$igoPermission || $igoPermission->couche_id <> $couche_id) { - $igoPermission = IgoPermission::findFirst("profil_id={$profil_id} AND couche_id={$couche_id} AND attribut_id is null"); - } - break; - } - - if (!$igoPermission && $valeur) { - - $changed = true; - $igoPermission = new IgoPermission(); - $igoPermission->profil_id = $profil_id; - - switch ($type) { - case 'groupe': - - $igoPermission->groupe_id = $groupe_id; - break; - - case 'colonne': - - //$igoGroupeCouche = IgoGroupeCouche::findFirst('id=' . $couche_id); - // if (!$igoGroupeCouche) { - // $this->flash->error("La couche ayant le igo_couche.id « $couche_id » n'existe pas."); - // } - - $igoCouche = IgoCouche::findFirst('id=' . $couche_id); - if (!$igoCouche) { - $this->flash->error("La couche ayant le igo_couche.id « $couche_id » n'existe pas."); - } - - $igoPermission->attribut_id = $attribut_id; - $igoPermission->couche_id =$couche_id; - $igoPermission->est_exclu = null; - $igoPermission->couche_id = $couche_id; - break; - - case 'couche': - - // $igoGroupeCouche = IgoGroupeCouche::findFirst('id=' . $couche_id); - //// if (!$igoGroupeCouche) { - // $this->flash->error("La couche ayant le igo_couche.id « $couche_id » n'existe pas."); - // } - - $igoCouche = IgoCouche::findFirst('id=' . $couche_id); - if (!$igoCouche) { - $this->flash->error("La couche ayant le igo_couche.id « $couche_id » n'existe pas."); - } - $igoPermission->couche_id = $couche_id; - //$igoPermission->couche_id = $igoGroupeCouche->couche_id; - break; - } - } - - if ($igoPermission) { - - $valeur = $valeur == '1'; - - $attribut = substr($name, 1, 1); - switch ($attribut) { - case "L": - //$changed = $changed || ($igoPermission->est_lecture) <> $valeur; - $igoPermission->est_lecture = $igoPermission->est_lecture || $valeur; - break; - case "A": - // $changed = $changed || ($igoPermission->est_analyse) <> $valeur; - $igoPermission->est_analyse = $igoPermission->est_analyse || $valeur; - break; - case "E": - // $changed = $changed || ($igoPermission->est_ecriture) <> $valeur; - $igoPermission->est_ecriture = $igoPermission->est_ecriture || $valeur; - break; - case "P": - // $changed = $changed || ($igoPermission->est_export) <> $valeur; - $igoPermission->est_export = $igoPermission->est_export || $valeur; - break; - case "S": - // $changed = $changed || ($igoPermission->est_association) <> $valeur; - $igoPermission->est_association = $igoPermission->est_association ||$valeur; - break; - case "X": - // $changed = $changed || ($igoPermission->est_exclu) <> $valeur; - $igoPermission->est_exclu = $igoPermission->est_exclu || $valeur; - - break; - } - } - - if ($valeur) { - - if (!$igoPermission->save()) { - - foreach ($igoPermission->getMessages() as $message) { - $this->flash->error($message); - } - } - } - } - - /* - //Supprimer les permissions qui n'ont plus lieu d'être - $igoPermissions = IgoPermission::find('NOT (COALESCE(est_lecture,false) OR COALESCE(est_analyse,false) OR COALESCE(est_ecriture,false) OR COALESCE(est_export,false) OR COALESCE(est_association,false) OR COALESCE(est_exclu,false))'); - - foreach ($igoPermissions as $igoPermission) { - $igoPermission->delete(); - }*/ - - $igo_profil = IgoProfil::findFirstByid($profil_id); - if (!$igo_profil) { - $this->flash->error("igo_permission non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => "igo_permission", - "action" => "index" - )); - } - $this->view->igo_profil = $igo_profil; - ///****À TESTER ****/// - - $profils = $this->session->get("profils"); - - $liste_profil_id_utilisateur = array(); - if ($profils) { - foreach ($profils as $profil) { - array_push($liste_profil_id_utilisateur, $profil["id"]); - } - } - - $liste_profil_id_utilisateur = implode(",", $liste_profil_id_utilisateur); - if (!$liste_profil_id_utilisateur) { - $liste_profil_id_utilisateur = 0; - } - - $sql=" select 'G'::character varying(1) AS type, - gr.groupe_id as id, - gr.nom, - gr.nom_complet AS mf_layer_meta_group_title, - gr.groupe_id AS groupe_id, - NULL::integer AS attribut_id, - false AS lecture, - false AS analyse_spa, - false AS ecriture, - false AS export, - false AS association, - false AS exclu, - NULL::text AS colonne, - NULL::integer AS couche_id, - p.id AS permission_id, - true AS association_est_association, - gr.grp, - (length(grp) - length(replace(grp, '_'::text, ''::text))) as len - from igo_vue_groupes_recursif gr - LEFT JOIN igo_permission p ON p.groupe_id=gr.groupe_id AND p.profil_id={$profil_id} and p.couche_id IS NULL - --LEFT JOIN igo_vue_permissions_pour_groupes pg ON pg.profil_id IN ({$liste_profil_id_utilisateur}) - WHERE NOT (gr.grp IN ( SELECT substr(grp, strpos(concat(grp, '_'), '_'::text) + 1) AS substr - FROM igo_vue_groupes_recursif)) - UNION - select 'C'::character varying(1) AS type, - c.id, - c.mf_layer_meta_title AS nom, - gr.nom_complet AS mf_layer_meta_group_title, - gc.groupe_id AS groupe_id, - igo_attribut.id AS attribut_id, - COALESCE(p.est_lecture, false) AS lecture, - COALESCE(p.est_analyse, false) AS analyse_spa, - COALESCE(p.est_ecriture, false) AS ecriture, - COALESCE(p.est_export, false) AS export, - COALESCE(p.est_association, false) AS association, - COALESCE(p2.est_exclu, false) AND igo_attribut.id = p2.attribut_id AS exclu, - igo_attribut.colonne AS colonne, - c.id AS couche_id, - p.id AS permission_id, - igo_vue_permissions_pour_couches.est_association AS association_est_association, - gr.grp, - (length(grp) - length(replace(grp, '_'::text, ''::text))) as len - from igo_vue_groupes_recursif gr - JOIN igo_groupe_couche gc ON gc.groupe_id=gr.groupe_id - JOIN igo_couche c ON gc.couche_id=c.id - JOIN igo_geometrie ON c.geometrie_id = igo_geometrie.id - LEFT JOIN igo_attribut ON igo_attribut.geometrie_id = igo_geometrie.id - LEFT JOIN igo_permission p ON c.id=p.couche_id AND p.profil_id={$profil_id} and p.attribut_id IS NULL - LEFT JOIN igo_permission p2 ON c.id=p.couche_id AND p.profil_id={$profil_id} and p2.attribut_id IS NOT NULL and p2.attribut_id=igo_attribut.id - LEFT JOIN igo_vue_permissions_pour_couches ON igo_vue_permissions_pour_couches.couche_id = p.id - WHERE NOT (gr.grp IN ( SELECT substr(grp, strpos(concat(grp, '_'), '_'::text) + 1) AS substr - FROM igo_vue_groupes_recursif)) - ORDER BY grp, len, type DESC"; - //echo $sql; - $igo_permission = new IgoPermission(); - - $igo_permission = new Resultset(null, $igo_permission, $igo_permission->getReadConnection()->query($sql)); - - $this->view->setVar("arbre", $igo_permission); - } - -} diff --git a/pilotage/app/controllers/CRUD/IgoProfilController.php b/pilotage/app/controllers/CRUD/IgoProfilController.php deleted file mode 100644 index ca976395..00000000 --- a/pilotage/app/controllers/CRUD/IgoProfilController.php +++ /dev/null @@ -1,4 +0,0 @@ -nom == $this->session->get("info_utilisateur")->identifiant) { - $this->flash->error("Vous ne pouvez pas supprimer votre propre compte utilisateur."); - return $this->dispatcher->forward(array( - "controller" => $r_controller, - "action" => $r_action, - "params" => array($r_id) - )); - } else { - parent::deleteAction($id, $r_controller, $r_action, $r_id); - } - } -} diff --git a/pilotage/app/controllers/CRUD/IgoUtilisateurProfilController.php b/pilotage/app/controllers/CRUD/IgoUtilisateurProfilController.php deleted file mode 100644 index de876d7f..00000000 --- a/pilotage/app/controllers/CRUD/IgoUtilisateurProfilController.php +++ /dev/null @@ -1,14 +0,0 @@ -session->has("utilisateur_id")) { - $this->tag->setDefault("utilisateur_id", $this->session->get("utilisateur_id")); - } - if ($this->session->has("profil_id")) { - $this->tag->setDefault("profil_id", $this->session->get("profil_id")); - } - parent::newAction($r_controller, $r_action, $r_id); - } -} diff --git a/pilotage/app/controllers/CRUD/IgoValeurController.php b/pilotage/app/controllers/CRUD/IgoValeurController.php deleted file mode 100644 index 587ad99b..00000000 --- a/pilotage/app/controllers/CRUD/IgoValeurController.php +++ /dev/null @@ -1,5 +0,0 @@ -session->set("classe_entite_id",$id); - $this->view->setVar("id",$id); - } - -} diff --git a/pilotage/app/controllers/ContexteEtCoucheController.php b/pilotage/app/controllers/ContexteEtCoucheController.php deleted file mode 100644 index 88426a30..00000000 --- a/pilotage/app/controllers/ContexteEtCoucheController.php +++ /dev/null @@ -1,11 +0,0 @@ -view->setVar("id",$id); - $this->session->set("contexte_id",$id); - } - -} diff --git a/pilotage/app/controllers/ControllerBase.php b/pilotage/app/controllers/ControllerBase.php deleted file mode 100644 index bbbaae61..00000000 --- a/pilotage/app/controllers/ControllerBase.php +++ /dev/null @@ -1,512 +0,0 @@ -view->setVar("r_controller", $this->getControllerName()); - $this->view->setVar("controller", $this->getCtlName()); - $this->view->setVar("action", $this->getActionName()); - $parameters=$this->getParameters(); - preg_match('/\d?\/\w+\/\w+[\/\d]?(?P\/[^\d]+.+)/i', $parameters, $matches); - $r_parameters= isset ($matches['r_parameters'])?$matches['r_parameters']: ""; - - $this->view->setVar("parameters", $parameters); - $this->ctlName = Text::uncamelize(str_replace("Controller", "", get_class($this))); - $this->classe = Text::camelize($this->ctlName); - $this->r_parameters = (isset($_POST['r_parameters'])) ? $_POST['r_parameters'] : $r_parameters; - } - - public function indexAction($r_controller = null, $r_action = null, $r_id = null) { - $parameters = $this->persistent->parameters; - if (is_array($parameters)) { - foreach ($parameters as $parameter => $val) { - if ($parameter == "bind") { - foreach ($val as $key => $value) { - $this->tag->setDefault($key, trim($value, "%")); - } - } - } - } - - $retour = ""; - if (!is_null($r_id)) { - $retour = $r_controller . "/" . $r_action . "/" . $r_id; - } - - $this->view->setVar("retour", $retour); - } - - public function searchAllAction($parameters = null) { - $this->persistent->parameters = null; - $this->searchAction($parameters); - - $this->view->pick($this->ctlName . "/search"); - } - - public function searchAction($parameters = null) { - - $this->view->setVar("filter", $parameters); - - $this->ctlName = Text::uncamelize(str_replace("Controller", "", get_class($this))); - $this->classe = Text::camelize($this->ctlName); - - - $numberPage = $this->request->getQuery("page", "int"); - - if (is_null($numberPage)) { - $numberPage = $this->persistent->numberpage; - } - - if (!is_null($numberPage)) { - $this->persistent->numberpage = $numberPage; - } - - - $parameters = $this->getSearchParameters($parameters, $this->classe); - $order = $this->request->getQuery("order", "string"); - $this->view->order = $order ? $order : "id"; - - $criteres = ""; - - if (is_array($parameters)) { - foreach ($parameters as $parameter => $val) { - if ($parameter == "conditions") { - $parameters["conditions"] = str_replace("LIKE", "ILIKE", $parameters["conditions"]); // pg seulement - } else if ($parameter == "bind") { - foreach ($val as $key => $value) { - $criteres.= ", " . $key . "=" . $value; - } - } - } - } - if ($criteres <> "") { - $criteres = substr($criteres, 2); - $this->view->setVar("criteres", $criteres); - } - $classe = $this->classe; - try { - $objets = $classe::find($parameters); - - } catch (\Exception $e) { - $this->flash->error($e->getMessage()); - $objets=new $classe(); - } - - if (count($objets) == 0) { - $this->flash->notice("Aucun enregistrement de " . Text::camelize(str_replace("igo_", "", $this->ctlName))); - } - $paginator = new Paginator(array( - "data" => $objets, - "limit" => 10, - "page" => $numberPage - )); - // Hack pour régler le bug de phalcon https://github.com/phalcon/cphalcon/issues/2301 - $paginate = $paginator->getPaginate(); - if($paginate->next == $paginate->current){ - $paginate->next = $paginate->next+1; - } - - //Nettoyer les objets qu'on retourne à la vue - foreach($paginate->items as $index => $objet){ - - //Nettoyer tous les attributs - $attributs = get_object_vars($objet); - foreach($attributs as $nomAttribut => $valeurAttribut){ - - $paginate->items[$index]->{$nomAttribut} = $this->escaper->escapeHtml($valeurAttribut); - } - - } - $this->view->page = $paginate; - - } - - public function getSearchParameters($parameters, $className) { - if (is_null($parameters) || (!is_array($parameters) && is_callable($parameters))) { - $criteres = array(); - foreach (get_class_vars($className) as $prop => $val) { - if ($this->dispatcher->getParam($prop)) { - $criteres[$prop] = $this->dispatcher->getParam($prop); - } - if($this->request->getQuery($prop, "int")){ - $criteres[$prop] = $this->request->getQuery($prop, "int"); - } - - - } - if (0 < count($criteres)) { - $query = Criteria::fromInput($this->di, $className, $criteres); - $this->persistent->parameters = $query->getParams(); - } - - if ($this->request->isPost()) { - $query = Criteria::fromInput($this->di, $className, $_POST); - $this->persistent->parameters = $query->getParams(); - } - $parameters = $this->persistent->parameters; - if (!is_array($parameters)) { - $parameters = array(); - } - $order = null; - if (isset($parameters["order"])) - $order = $parameters["order"]; - if (is_null($order)) { - $order = $this->request->getQuery("order"); - } - if (is_null($order)) { - $order = $this->persistent->order; - } - - if (!is_null($order)) { - $this->persistent->order = $order; - } else { - $order = "id"; - } - - $parameters["order"] = $order; - } - - - return $parameters; - } - - public function newAction($r_controller = null, $r_action = null, $r_id = null) { - $retour = ""; - if (!is_null($r_action)) { - $retour = $r_controller . "/" . $r_action . "/" . $r_id; - } - - $parameters = $this->persistent->parameters; - if (is_array($parameters)) { - foreach ($parameters as $parameter => $val) { - if ($parameter == "bind") { - foreach ($val as $key => $value) { - $this->tag->setDefault($key,$value); - } - } - } - } - $this->view->setVar("retour", $retour); - } - - public function editAction($id, $r_controller = null, $r_action = null, $r_id = null) { - $retour = ""; - if (!is_null($r_action)) { - $retour = $r_controller . "/" . $r_action . "/" . $r_id . $this->r_parameters; - } - $this->view->setVar("retour", $retour); - - if (!$this->request->isPost()) { - $classe = $this->classe; - $objets = $classe::findFirstByid($id); - if (!$objets) { - $this->flash->error(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - foreach (get_class_vars(get_class($objets)) as $prop => $val) { - $this->tag->setDefault($prop, $objets->$prop); - } - } - } - - public function createAction($r_controller = null, $r_action = null, $r_id = null) { - if (!$this->request->isPost()) { - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - $objet = new $this->classe(); - - $this->assigneFromPost($objet); - try { - if (!$objet->save()) { - foreach ($objet->getMessages() as $message) { - $this->flash->error($message); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } else { - $this->flash->success(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " " . $objet->id . " créé avec succès"); - // $query = Criteria::fromInput($this->di, $this->classe, array("id" => $objet->id)); - // $this->persistent->parameters = $query->getParams(); - } - } catch (\Exception $e) { - $this->flash->error($e->getMessage()); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "new", - "param" => (!is_null($r_id)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - if ($r_action == "search") { - return $this->dispatcher->forward(array( - "controller" => $r_controller, - "action" => $r_action, - "params" => array("id" => $objet->id) - )); - } - if (!is_null($r_action)) { - $last = rtrim($r_controller . "/" . $r_action . "/" . $r_id, "/") . "/"; - $this->r_parameters = ltrim($this->r_parameters, "1234567890/"); - $this->r_parameters = str_replace($last, "", $this->r_parameters); - return $this->response->redirect($last . $this->r_parameters); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "search" - )); - } - - /** - * Saves a igo_couche edited - * - */ - public function saveAction($r_controller = null, $r_action = null, $r_id = null) { - - // $this->ctlName = Text::uncamelize(str_replace("Controller", "", get_class($this))); - // $this->classe = Text::camelize($this->ctlName); - - if (!$this->request->isPost()) { - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - $id = $this->request->getPost("id"); - $classe = $this->classe; - $objet = $classe::findFirstByid($id); - if (!$objet) { - $this->flash->error($this->ctlName . " n'existe pas " . $id); - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - $this->assigneFromPost($objet); - - - try { - if (!$objet->save()) { - foreach ($objet->getMessages() as $message) { - $this->flash->error($message); - } - $this->view->setVar("retour", $retour); - $last = rtrim($r_controller . "/" . $r_action . "/" . $r_id, "/") ; - return $this->response->redirect($this->ctlName."/edit/".$id."/".$last); - } else { - $this->flash->success(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " " . $objet->id . " modifié avec succès"); - } - } catch (\Exception $e) { - $this->flash->error($e->getMessage()); - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "edit", - "param" => (!is_null($r_action)) ? "/" . $r_controller . "/" . $r_action . "/" . $r_id : "" - )); - } - - if (!is_null($r_action)) { - $last = rtrim($r_controller . "/" . $r_action . "/" . $r_id, "/") . "/"; - $this->r_parameters = ltrim($this->r_parameters, "1234567890/"); - $this->r_parameters = str_replace($last, "", $this->r_parameters); - return $this->response->redirect($last . $this->r_parameters); - } - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - public function deleteAction($id, $r_controller = null, $r_action = null, $r_id = null) { - - $classe = $this->classe; - $objet = $classe::findFirstByid($id); - if (!$objet) { - $this->flash->error($this->ctlName . " non-trouvé"); - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - try { - if (!$objet->delete()) { - - foreach ($objet->getMessages() as $message) { - - $this->flash->error($message); - } - return $this->dispatcher->forward(array( - "controller" => $r_controller, - "action" => $r_action, - "params" => array($r_id) - )); - } else { - $this->flash->success(Text::camelize(str_replace("igo_", "", $this->ctlName)) . " " . $id . " détruit avec succès"); - } - } catch (\Exception $e) { - $message=$e->getMessage(); - if (strpos($message,"23503")>0){ - $message="Cet enregistrement est utilisé dans une autre table"; - } - $this->flash->error($message); - - } - if (!is_null($r_action)) { - $last = rtrim($r_controller . "/" . $r_action . "/" . $r_id, "/") . "/"; - $this->r_parameters = ltrim($this->r_parameters, "1234567890/"); - $this->r_parameters = str_replace($last, "", $this->r_parameters); - return $this->response->redirect($last . $this->r_parameters); - } - - - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "search", - "params" => array() - )); - } - - - function startsWith($haystack, $needle, $case = true) { - if ($case) - return strpos($haystack, $needle, 0) === 0; - - return stripos($haystack, $needle, 0) === 0; - } - - function endsWith($haystack, $needle, $case = true) { - $expectedPosition = strlen($haystack) - strlen($needle); - - if ($case) - return strrpos($haystack, $needle, 0) === $expectedPosition; - - return strripos($haystack, $needle, 0) === $expectedPosition; - } - - function getCtlName() { - return Text::uncamelize(str_replace("Controller", "", get_class($this))); - } - - function getControllerName() { - return $this->dispatcher->getControllerName(); - } - - function getActionName() { - $actionName = $this->dispatcher->getActionName(); - return $actionName; - } - - function getParameters() { - $parameters = ""; - foreach ($this->dispatcher->getParams() as $parameter => $valeur) { - $parameters.="/" . $valeur; - } - return ltrim($parameters, "/"); - } - - public function NullAsFalse($arg) { - return intval($arg) == null ? false : $arg; - } - - public function zeroAsNull($arg) { - return intval($arg) == 0 ? null : $arg; - } - function assigneFromPost($objet) { - $metaData = $objet->getModelsMetaData(); - $dataTypes = $metaData->getDataTypes($objet); - foreach (get_class_vars(get_class($objet)) as $prop => $val) { - if ($dataTypes[$prop] == Column::TYPE_INTEGER || $dataTypes[$prop] == Column::TYPE_DATETIME) { - $objet->$prop = $this->zeroAsNull($this->request->getPost($prop)); - } else if ($dataTypes[$prop] == Column::TYPE_BOOLEAN) { - $objet->$prop = $this->NullAsFalse($this->request->getPost($prop)); - } else { - $objet->$prop = $this->request->getPost($prop); - } - } - } - function fopen_file_get_contents($cheminFichier) { - $contenu = ''; - $handle = fopen($cheminFichier, 'r'); - if ($handle) { - $contenu = fread($handle, filesize($cheminFichier)); - } - return $contenu; - } - - function curl_file_get_contents($url){ - $url = urldecode($url); - $curl = curl_init(); - $userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'; - - curl_setopt($curl, CURLOPT_URL, $url); //The URL to fetch. This can also be set when initializing a session with curl_init(). - curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); //TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly. - curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 50); //The number of seconds to wait while trying to connect. - - curl_setopt($curl, CURLOPT_USERAGENT, $userAgent); //The contents of the "User-Agent: " header to be used in a HTTP request. - curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); //To fail silently if the HTTP code returned is greater than or equal to 400. - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); //To follow any "Location: " header that the server sends as part of the HTTP header. - curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE); //To automatically set the Referer: field in requests where it follows a Location: redirect. - curl_setopt($curl, CURLOPT_TIMEOUT, 10); //The maximum number of seconds to allow cURL functions to execute. - - $contenu = curl_exec($curl); - - if($contenu === false) - { - error_log("error in curl_file_get_contents"); - error_log(curl_error($curl)); - return 'Erreur Curl : ' . curl_error($curl); - } - - curl_close($curl); - - return $contenu; - } - - function succesAjax($msg = ''){ - $reponse = new stdClass(); - $reponse->statut = 'succes'; - $reponse->message = $msg; - $this->response->send(); - die(json_encode($reponse)); - } - - function erreurAjax($msg){ - $reponse = new stdClass(); - $reponse->statut = 'erreur'; - $reponse->message = $msg; - $this->response->send(); - die(json_encode($reponse)); - - } - -} - - diff --git a/pilotage/app/controllers/CoucheEtClasseController.php b/pilotage/app/controllers/CoucheEtClasseController.php deleted file mode 100644 index c45de395..00000000 --- a/pilotage/app/controllers/CoucheEtClasseController.php +++ /dev/null @@ -1,14 +0,0 @@ -classe_entite_id; - // $this->view->setVar("classe_entite_id",$classe_entite_id); - $this->view->setVar("id",$id); - $this->session->set("couche_id",$id); - } - -} diff --git a/pilotage/app/controllers/GeometrieEtAttributController.php b/pilotage/app/controllers/GeometrieEtAttributController.php deleted file mode 100644 index 106e815c..00000000 --- a/pilotage/app/controllers/GeometrieEtAttributController.php +++ /dev/null @@ -1,14 +0,0 @@ -classe_entite_id; - $this->view->setVar("classe_entite_id",$classe_entite_id); - $this->view->setVar("id",$id); - $this->session->set("geometrie_id",$id); - } - -} diff --git a/pilotage/app/controllers/GeometrieEtCoucheController.php b/pilotage/app/controllers/GeometrieEtCoucheController.php deleted file mode 100644 index 40c2632c..00000000 --- a/pilotage/app/controllers/GeometrieEtCoucheController.php +++ /dev/null @@ -1,14 +0,0 @@ -classe_entite_id; - $this->view->setVar("classe_entite_id",$classe_entite_id); - $this->view->setVar("id",$id); - $this->session->set("geometrie_id",$id); - } - -} diff --git a/pilotage/app/controllers/GestionCoucheController.php b/pilotage/app/controllers/GestionCoucheController.php deleted file mode 100644 index 2d08334a..00000000 --- a/pilotage/app/controllers/GestionCoucheController.php +++ /dev/null @@ -1,316 +0,0 @@ -persistent->parameters = null; - $phql = "SELECT id, CONCAT(acronyme,\" - \",nom) as nom FROM IgoOrganismeResponsable order by acronyme"; - $organisme_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("organisme_desc", $organisme_desc); - $phql = "SELECT g.id, CONCAT(e.nom,\":\",t.nom) as nom FROM IgoClasseEntite AS e, IgoGeometrie AS g, IgoGeometrieType AS t where g.classe_entite_id=e.id and g.geometrie_type_id=t.id ORDER BY nom"; - $geometrie_desc = $this->modelsManager->executeQuery($phql); - $this->view->setVar("geometrie_desc", $geometrie_desc); - parent::initialize(); - } - - public function editionAction($id) { - $igo_couche = IgoCouche::findFirstByid($id); - - - $igo_geometrie = $igo_couche->IgoGeometrie; - $classe_entite_id = $igo_geometrie->classe_entite_id; - $connexion_id = $igo_geometrie->IgoConnexion->id; - // $this->view->setVar("classe_entite_id",$classe_entite_id); - $this->view->setVar("id", $id); - $this->session->set("couche_id", $id); - - $this->view->setVar("connexion_id", $connexion_id); - $this->view->setVar("classe_entite_id", $classe_entite_id); - - $this->view->setVar("geometrie_id", $igo_geometrie->id); - } - - public function creationAction($r_controller = null, $r_action = null, $r_id = null) { - $this->tag->setDefault("acces", "L"); - parent::newAction($r_controller, $r_action, $r_id); - } - - public function mapfileAction($id) { - $mapfileInclude = ''; - if(isset($this->config->mapserver->mapfileInclude)){ - foreach($this->config->mapserver->mapfileInclude as $chemin){ - $mapfileInclude .= parent::fopen_file_get_contents($chemin); - } - } - $this->view->mapfileInclude = $mapfileInclude; - $couche = IgoCouche::findFirstByid($id); - $this->view->couche = $couche->getMapFileArray(); - $this->view->preview = true; - } - - public function loadMapfileAction($id) { - $this->tag->setDefault("id", $id); - } - - public function traiteMapfileAction($r_controller = null, $r_action = null, $r_id = null) { - - parent::newAction($r_controller, $r_action, $r_id); - - if (!$this->request->isPost()) { - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - $this->view->pick("gestion_couche/creation"); - $code = $this->request->getPost("code"); - $code = $this->traiteClass($code); - - - $lignes = explode("\n", $code); - - $mf_layer_meta_def = ""; - $mf_layer_def = ""; - $meta = false; - $projection = false; - - foreach ($lignes as $ligne) { - if ($projection) { - $this->tag->setDefault('mf_layer_projection', trim($ligne, " '\"\t\n\r")); - $projection = false; - continue; - } - if (trim($ligne) == "" || trim($ligne) == "LAYER") { - continue; - } - - preg_match("/[\s]?(?P[^\s]+)\s+(?P[^#\n]*)/i", $ligne, $matches); - if (!isset($matches['contenu'])) { - //echo "Pas de match pour $ligne
    "; - continue; - } else { - //printf ("Élément: %s Contenu: %s
    ",$matches['element'],$matches['contenu']); - } - - - switch ($matches['element']) { - case 'NAME': - $this->tag->setDefault('mf_layer_name', trim($matches['contenu'], "'\"\n\r")); - $this->tag->setDefault('fiche_csw_id', trim($matches['contenu'], "'\"\n\r")); - $catalogue = IgoCatalogueCsw::findFirst(); - $this->tag->setDefault('catalogue_csw_id', $catalogue->id); - $igoClasseEntite = IgoClasseEntite::findFirst("nom='" . trim($matches['contenu'], "'\"\n\r") . "'"); - if ($igoClasseEntite) { - $this->tag->setDefault('classe_entite_id', $igoClasseEntite->id); - } - break; - case 'TYPE': - $igoGeometrieType = IgoGeometrieType::findFirst("layer_type='" . trim($matches['contenu'], "\n\r") . "'"); - if($igoGeometrieType){ - $this->tag->setDefault('geometrie_type_id', $igoGeometrieType->id); - } - break; - case 'GROUP': - $this->tag->setDefault('mf_layer_group', trim($matches['contenu'], "'\"\n\r")); - break; - case 'CONNECTIONTYPE'://TODO aller chercher la connection - $igoConnexionType = IgoConnexionType::findFirst("nom='" . trim($matches['contenu'], "\n\r") . "'"); - if ($igoConnexionType){ - $this->tag->setDefault('connexion_type_id', $igoConnexionType->id); - } - - break; - case 'CONNECTION': - $this->tag->setDefault('connexion', trim($matches['contenu'], "'\"\n\r")); - // TODO bypasser l'erreur de phql - $where="connexion like '" . trim(str_replace("'", "_", trim($matches['contenu'], "'\"\n\r"))) . "'"; - $igoConnexion = IgoConnexion::findFirst($where); - //var_dump($where); - if ($igoConnexion) { - $this->tag->setDefault('connexion_id', $igoConnexion->id); - } - break; - case 'DATA': - $this->tag->setDefault('mf_layer_data', trim($matches['contenu'], "'\"\n\r")); - break; - case 'MINSCALE': - $this->tag->setDefault('mf_layer_minscale_denom', trim($matches['contenu'], "'\"\n\r")); - break; - case 'MAXSCALE': - $this->tag->setDefault('mf_layer_maxscale_denom', trim($matches['contenu'], "'\"\n\r")); - break; - case 'LABELMINSCALE': - $this->tag->setDefault('mf_layer_labelminscale_denom', trim($matches['contenu'], "'\"\n\r")); - break; - case 'LABELMAXSCALE': - $this->tag->setDefault('mf_layer_labelmaxscale_denom', trim($matches['contenu'], "'\"\n\r")); - break; - case 'OPACITY': - $this->tag->setDefault('mf_layer_opacity', trim($matches['contenu'], "'\"\n\r")); - break; - case 'FILTER': - $this->tag->setDefault('mf_layer_filter', trim($matches['contenu'], "'\"\n\r")); - break; - case '"wms_group_title"': - $this->tag->setDefault('wms_group_title', trim($matches['contenu'], "'\"\n\r")); - break; - case '"wms_name"': - $this->tag->setDefault('wms_name', trim($matches['contenu'], "'\"\n\r")); - break; - case '"wms_title"': - $this->tag->setDefault('wms_title', trim($matches['contenu'], "'\"\n\r")); - break; - case '"z_order"': - $this->tag->setDefault('z_order', trim($matches['contenu'], "'\"\n\r")); - break; - case '"msp_classe_meta"': - $this->tag->setDefault('fiche_csw_id', trim($matches['contenu'], "'\"\n\r")); - break; - case 'PROJECTION': - $projection = true; - break; - case 'METADATA': - $meta = true; - break; - case 'END': - $meta = false; - break; - case 'PROCESSING': - break; - default: - if ($meta) { - $mf_layer_meta_def = $mf_layer_meta_def . "\n" . $ligne; - } else { - $mf_layer_def = $mf_layer_def . "\n" . $ligne; - } - } - $this->tag->setDefault('mf_layer_meta_def', trim($mf_layer_meta_def, "'\"\n\r")); - $this->tag->setDefault('mf_layer_def', trim($mf_layer_def, "'\"\n\r")); - } - - } - - /** - * Retire la section CLASS[...]END du code. La partie retiré est affectée à mf_class_def - * @param string $code - * @return string - */ - function traiteClass($code) { - - $offset = strpos($code, "CLASS"); - if (!$offset) { - $this->tag->setDefault('mf_class_def', ''); - return $code; - } - - $offset = 0; - while ($offset < strlen($code)) { - - $offset += 1; - if (trim(substr($code, $offset, 6)) == "CLASS") { - $this->tag->setDefault('mf_class_def', trim(substr($code, $offset, strrpos($code, "END")), "'\"\n\r")); - return substr($code, 0, $offset) . "\n" . substr($code, strrpos($code, "END")); - } - } - } - - public function createAction($r_controller = null, $r_action = null, $r_id = null) { - - if (!$this->request->isPost()) { - return $this->dispatcher->forward(array( - "controller" => $this->ctlName, - "action" => "index" - )); - } - - $this->tag->setDefault('vue-avancee', $this->request->getPost('vue-avancee')); - try { - - $msg_succes = array(); - - $manager = new Phalcon\Mvc\Model\Transaction\Manager(); - $transaction = $manager->get(); - - $igo_geometrie = new IgoGeometrie(); - $igo_geometrie->setTransaction($transaction); - $this->assigneFromPost($igo_geometrie); - if(!$igo_geometrie->save()){ - $transaction->rollback(implode('
    ', $igo_geometrie->getMessages())); - } - $msg_succes[] = "Géométrie " . $igo_geometrie->id . " créée avec succès"; - - //TODO le code qui suit devrait être dans le model. Il faudra l'ajuster quand on saura quoi faire avec l'Inclusion des attributs - $igo_connexion = IgoConnexion::findFirstById(intval($this->request->getPost("connexion_id"))); - - if ($igo_connexion) { - $msg_succes[] = "Connexion " . $igo_connexion->id . " réutilisée"; - - }else{ - - //Ajouter la connexion qu'on va utiliser - $igo_connexion = new IgoConnexion(); - $igo_connexion->setTransaction($transaction); - $this->assigneFromPost($igo_connexion); - - $connexion_type_id = intval($this->request->getPost("connexion_type_id")); - if($connexion_type_id){ - $connexion_type = IgoConnexionType::findFirstById($connexion_type_id); - $igo_connexion->connexion_type_id = $connexion_type->id; - $igo_connexion->nom = $connexion_type->nom; //TODO à synchroniser avec la rétro - } - - if (!$igo_connexion->save()) { - - $transaction->rollback(implode('
    ', $igo_connexion->getMessages())); - } - - $msg_succes[] = "Connexion " . $igo_connexion->id . " créée avec succès"; - - } - - - $igo_couche = new IgoCouche(); - $igo_couche->setTransaction($transaction); - $this->assigneFromPost($igo_couche); - - $igo_couche->geometrie_id = $igo_geometrie->id; - - if(!$igo_couche->save()) { - $transaction->rollback(implode('
    ', $igo_couche->getMessages())); - } - - $msg_succes[] = "Couche " . $igo_couche->id . " créée avec succès"; - - $igo_classe = new IgoClasse(); - $igo_classe->setTransaction($transaction); - $this->assigneFromPost($igo_classe); - - if($igo_classe->mf_class_def){ - - $igo_classe->couche_id = $igo_couche->id; - if(!$igo_classe->save()) { - $transaction->rollback(implode('
    ', $igo_classe->getMessages())); - } - $msg_succes[] = "Classe " . $igo_classe->id . " créée avec succès"; - - } - - $transaction->commit(); - - foreach($msg_succes as $msg){ - $this->flash->success($msg); - } - - return; - } catch (\Exception $e) { - $this->flash->error($e->getMessage()); - return $this->dispatcher->forward(array( - "controller" => "gestion_couche", - "action" => "traiteMapfile" - )); - } - } -} diff --git a/pilotage/app/controllers/IndexController.php b/pilotage/app/controllers/IndexController.php deleted file mode 100644 index eac115d8..00000000 --- a/pilotage/app/controllers/IndexController.php +++ /dev/null @@ -1,12 +0,0 @@ -persistent->parameters = null; - } - - public function creeAction() { - - } - - public function genereAction() { - - $contexte_id = filter_input(INPUT_POST, 'contexte_id'); - if (strlen($contexte_id) == 0) { - $this->flashSession->error("Veuillez sélectionner un contexte."); - $previousURL = 'mapfile/cree'; - $response = new \Phalcon\Http\Response(); - return $response->redirect($previousURL); - } - - $profil_id = filter_input(INPUT_POST, 'profil_id'); - $utilisateur_id = filter_input(INPUT_POST, 'utilisateur_id'); - return $this->dispatcher->forward(array( - "controller" => "igo_contexte", - "action" => "mapfile", - "params" => array($contexte_id, $profil_id, $utilisateur_id) - )); - } - - public function retroAction() { - - if ($this->session->get('mapfile')) { - $this->view->mapfile = $this->session->get('mapfile'); - } else { - $this->view->mapfile = $this->getDI()->getConfig()->application->pilotage->retroCheminDefaut; - } - } - - public function loadAction() { - $request = new \Phalcon\Http\Request(); - $response = new \Phalcon\Http\Response(); - $data = null; - - //Load a mapfile content - if ($request->isPost()) { - $mapfile = trim($request->getPost('mapfile', null)); - if ($mapfile) { - $mapfileParser = new MapfileParser(); - - try { - $data = $mapfileParser->parseFile($mapfile); - } catch (Exception $e) { - $this->flashSession->error($e->getMessage()); - } - - $this->session->set('mapfile', $mapfile); - $this->session->set('mapfileData', $data); - } else { - $this->flashSession->error("Veuillez identifer un mapfile!"); - } - } else if ($this->session->get('mapfileData')) { - $data = $this->session->get('mapfileData'); - } - - //Store the mapfile content into the session - if ($data) { - $this->view->setVar("layers", array_merge($data['notDistinctLayers'], $data['distinctLayers'])); - $this->view->setVar("nLayers", $data['nLayers']); - $this->view->setVar("nNotDistinctLayers", count($data['notDistinctLayers'])); - } else { - return $response->redirect($this->cancelURL); - } - } - - public function selectAction() { - $request = new \Phalcon\Http\Request(); - $response = new \Phalcon\Http\Response(); - $previousURL = 'mapfile/load'; - $data = null; - - if ($request->isPost() == true) { - if ($mapfileData = $this->session->get('mapfileData')) { - $excludes = $request->getPost('exclude', null); - $excludes = ($excludes ? $excludes : array()); - - //Check if all layers are unique after excluding some of them - $layers = array(); - $layerNames = array(); - foreach ($mapfileData['notDistinctLayers'] as $notDistinctLayer) { - if (!array_key_exists($notDistinctLayer['id'], $excludes)) { - if (in_array($notDistinctLayer['name'], $layerNames)) { - //Some layers are still duplicated so we redirect to the previous page - $this->flashSession->error('Des couches sont toujours en double.'); - return $response->redirect($previousURL); - } else { - $layers[] = $notDistinctLayer; - $layerNames[] = $notDistinctLayer['name']; - } - } - } - - foreach ($mapfileData['distinctLayers'] as $distinctLayer) { - if (!array_key_exists($distinctLayer['id'], $excludes)) { - $layers[] = $distinctLayer; - } - } - - //Identify the layers that exist already and their group - $existingLayers = array(); - $newLayers = array(); - foreach ($layers as $layer) { - $layerQuery = 'mf_layer_name="' . $layer['name'] . '"'; - $igoLayer = IgoCouche::findFirst($layerQuery); - $layer['currentGroup'] = null; - $layer['selectClass'] = null; - - if (!$igoLayer) { - $layer['exists'] = false; - // Quelques couches n'ont pas de wms_group_title... utiliser le GROUP dans ces rare cas. - if (!isset($layer['wms_group_title']) || strlen($layer['wms_group_title']) == 0) { - $layer['wms_group_title'] = $layer['group']; - } - $newLayers[] = $layer; - } else { - - $layer['exists'] = true; - $existingLayers[] = $layer; - } - } - - //Find all the possible groups - $groups = array(); - foreach (IgoGroupe::getNomsComplet(true) as $group) { - $groups[] = $group->nom; - } - - //Store some data into the session - $data = array( - 'existingLayers' => $existingLayers, - 'newLayers' => $newLayers, - 'groups' => $groups - ); - - $this->session->set('selectData', $data); - } - } else if ($this->session->get('selectData')) { - $data = $this->session->get('selectData'); - } - - if ($data) { - $this->view->setVar("layers", array_merge($data['newLayers'], $data['existingLayers'])); - $this->view->setVar("nNewLayers", count($data['newLayers'])); - $this->view->setVar("nExistingLayers", count($data['existingLayers'])); - $this->view->setVar("groups", $data['groups']); - } else { - return $response->redirect($this->cancelURL); - } - } - - public function processAction() { - $request = new \Phalcon\Http\Request(); - $response = new \Phalcon\Http\Response(); - $data = null; - - if ($request->isPost() == true) { - if ($selectData = $this->session->get('selectData')) { - $actions = $request->getPost('action', null); - $actions = ($actions ? $actions : array()); - $groups = $request->getPost('group', null); - $groups = ($groups ? $groups : array()); - - //For each layer, check if we should ignore it or insert it (update if it exists already) - $data = array(); - foreach ($selectData['newLayers'] as &$newLayer) { - if (array_key_exists($newLayer['id'], $actions) && $actions[$newLayer['id']] == 'insert') { - if (array_key_exists($newLayer['id'], $groups)) { - $newLayer['wms_group_title'] = $groups[$newLayer['id']]; - $newLayer['action'] = $actions[$newLayer['id']]; - } - $data[] = $newLayer; - } - } - - foreach ($selectData['existingLayers'] as &$existingLayer) { - if (array_key_exists($existingLayer['id'], $actions) && ( - $actions[$existingLayer['id']] == 'insert' || $actions[$existingLayer['id']] == 'softinsert')) { - - if (array_key_exists($existingLayer['id'], $groups)) { - $existingLayer['wms_group_title'] = $groups[$existingLayer['id']]; - $existingLayer['action'] = $actions[$existingLayer['id']]; - } - $data[] = $existingLayer; - } - } - - $this->session->set('selectData', $selectData); - $this->session->set('processData', $data); - } - } else if ($this->session->get('processData')) { - $data = $this->session->get('processData'); - } - - if (!$data) { - return $response->redirect($this->cancelURL); - } else { - if ($this->session->get('contexteName')) { - $this->view->setVar("contexteName", $this->session->get('contexteName')); - $this->session->set('contexteName', null); - } else { - $this->view->setVar("contexteName", null); - } - - if ($this->session->get('contexteCode')) { - $this->view->setVar("contexteCode", $this->session->get('contexteCode')); - $this->session->set('contexteCode', null); - } else { - $this->view->setVar("contexteCode", null); - } - - if ($this->session->get('contexteDescription')) { - $this->view->setVar("contexteDescription", $this->session->get('contexteDescription')); - $this->session->set('contexteDescription', null); - } else { - $this->view->setVar("contexteDescription", null); - } - - if ($this->session->get('onlineResource')) { - $this->view->setVar("onlineResource", $this->session->get('onlineResource')); - $this->session->set('onlineResource', null); - } else { - $mapserverConfiguration = $this->getDI()->getConfig()->mapserver; - $onlineResource = $mapserverConfiguration->mapserver_path . $mapserverConfiguration->executable . $mapserverConfiguration->mapfileCacheDir . $mapserverConfiguration->contextesCacheDir . "{Code}.map"; - $this->view->setVar("onlineResource", $onlineResource); - } - } - } - - public function saveAction($r_controller = null, $r_action = null, $r_id = null) { - set_time_limit(180); - ini_set('memory_limit', '512M'); - - $request = new \Phalcon\Http\Request(); - $response = new \Phalcon\Http\Response(); - $previousURL = 'mapfile/process'; - - if (!$request->isPost()) { - return $response->redirect($this->cancelURL); - } - - $layers = $this->session->get('processData'); - if(!$layers){ - return $response->redirect($this->cancelURL); - } - - //Check if a context shoud be created - $creer_contexte = $request->getPost('creer_contexte', null); - $igoContexte = null; - if ($creer_contexte) { - $contexteName = trim($request->getPost('name', null)); - $contexteCode = trim($request->getPost('code', null)); - $contexteDescription = trim($request->getPost('description', null)); - $onlineResource = trim($request->getPost('onlineResource', null)); - - if (!$contexteName) { - $this->flashSession->error('Veuillez indiquer un nom de contexte.'); - } - - if (!$contexteCode) { - $this->flashSession->error('Veuillez indiquer un code de contexte.'); - } - - if (!$contexteDescription) { - $this->flashSession->error('Veuillez indiquer une description du contexte.'); - } - - if (!$onlineResource) { - $this->flashSession->error('Veuillez indiquer la resource en ligne.'); - } - - $mapServerConfig = $this->getDI()->getConfig()->mapserver; - $fileName = $mapServerConfig->mapfileCacheDir . $mapServerConfig->contextesCacheDir . trim($contexteCode) . ".map"; - if (file_exists($fileName)) { - $this->flash->error("Le fichier {$fileName} existe déjà. Choisissez un autre code."); - } - - $this->session->set('contexteName', $contexteName); - $this->session->set('contexteCode', $contexteCode); - $this->session->set('contexteDescription', $contexteDescription); - $this->session->set('onlineResource', $onlineResource); - - if ($this->flashSession->has('error')) { - - return $response->redirect($previousURL); - } - - $igoContexte = new IgoContexte(); - - $mapfileData = $this->session->get('mapfileData'); - - // Substitude contexteCode if provided - $onlineResource = str_replace("{Code}", $contexteCode, $onlineResource); - - $igoContexte->mf_map_meta_onlineresource = $onlineResource; - $igoContexte->mf_map_projection = $mapfileData['map']['projection']; - $igoContexte->nom = $contexteName; - $igoContexte->code = $contexteCode; - $igoContexte->description = $contexteDescription; - $igoContexte->mode = "l"; //mode Liste - $igoContexte->generer_onlineresource = true; - } - - //Save the layers (and optionally a context) - $mapfileParser = new MapfileParser(); - $data = $mapfileParser->formatSaveData($layers, $this->view->host, $this->view->host_alias); - try { - $this->save($data, $igoContexte); - $this->flashSession->success('Sauvegarde effectuée avec succès!'); - } catch (Exception $e) { - $this->flashSession->error($e->getMessage()); - return $response->redirect($previousURL); - } - - $this->clearSession(); - - } - - private function getConnection($connectionString, $connectionType) { - $connectionQuery = ''; - if ($connectionString) { - $connectionQuery .= 'connexion LIKE "' . $connectionString . '%"'; - } else { - $connectionQuery .= 'connexion IS NULL '; - } - $igoConnexionType = IgoConnexionType::findFirst("connexion_type = '$connectionType'"); - - if (!$igoConnexionType) { - die("Type de connection inconnu: ".$connectionType); - - } - - $connexionTypeId = $igoConnexionType->id; - $connexionTypeNom = $igoConnexionType->nom; - - if ($igoConnexionType) { - $connectionQuery .= ' AND connexion_type_id=' . $connexionTypeId ; - } - - //If connection doesn't exist, create it - $igoConnexion = IgoConnexion::findFirst($connectionQuery); - if (!$igoConnexion) { - $igoConnexion = new IgoConnexion(); - - $igoConnexion->connexion = $connectionString; - $igoConnexion->connexion_type_id = $connexionTypeId; - - $this->igoConnexionSave($igoConnexion); - - $igoConnexion->nom = $connexionTypeNom . ' ' . $igoConnexion->id; - $igoConnexion->save(false); - - } else { - if (!$igoConnexion->nom) { - - $igoConnexion->nom = $connexionTypeNom . ' ' . $igoConnexion->id; - $igoConnexion->connexion_type_id = $connexionTypeId; - - $igoConnexion->save(false); - } - } - return $igoConnexion; - } - - /** - * Save all layers and their depending classes in the database - * of distinct layers and not distinct layers. - * Distinct layers do not share the same name. - * - * $layers [array] : an array of layers - * - * TODO: This function became huge overtime. It could be split - * into multiple functions but it's not an easy task and I lacked - * time to do it. - * - */ - private function save($data, $igoContexte = null) { - $this->db->begin(); - - //Create a contexte if IgoContexte is defined - if ($igoContexte) { - $this->igoContexteSave($igoContexte); - - } - - //Create an associative array of all the possible non-multi geometry types - //This way, we dont need to issue a sql request for each layer - $geometryTypes = array(); - //TODO Déterminer pourquoi on ne veut pas les multi - $allGeometryTypes = IgoGeometrieType::find("NOT nom ilike '%multi%'"); - foreach ($allGeometryTypes as $geometryType) { - - $geometryTypes[$geometryType->layer_type] = $geometryType->id; - - } - - //Create an empty array that will be used to store the group IDs - $groups = array(); - $layerIndex = 1; - try { - - $igoCouches = array(); - - foreach ($data as $d) { - - $igoConnexion = null; - - if ($d['connection'] - && isset($d['connection']['connectionString']) - && isset($d['connection']['type'])) { - - //Check if connexion exists already in the database - $igoConnexion = $this->getConnection($d['connection']['connectionString'], $d['connection']['type']); - - } - - foreach ($d['layers'] as $layer) { - - if (isset($layer['connection']) - && isset($layer['connectiontype']) - && trim($layer['connection']) - && trim($layer['connectiontype'])) { - - //Check if connexion exists already in the database - $igoConnexion = $this->getConnection($layer['connection'], $layer['connectiontype']); - - } - $groupeCoucheId = null; - $groupID = null; - $layer['currentGroup'] = null; - - //If geometry type doesn't exist, create it - if (!array_key_exists($layer['type'], $geometryTypes)) { - $igoGeometrieType = new IgoGeometrieType(); - - $igoGeometrieType->layer_type = $layer['type']; - $igoGeometrieType->nom = $layer['type']; - - $this->igoGeometrieTypeSave($igoGeometrieType); - - //Store the new geometry type id in an array and refer to it - //for the following layers with the same geometry type - $geometryTypes[$layer['type']] = $igoGeometrieType->id; - - } - - $layerQuery = 'mf_layer_name="' . $layer['name'] . '"'; - $igoLayer = IgoCouche::findFirst($layerQuery); - $layerSaveSuccessful = false; - - if ($layer['action'] == 'insert') { - if ($igoLayer) { - //If a layer with the same name exists already - //Find its geometry - if ($igoLayer->geometrie_id) { - $geometryQuery = 'id="' . $igoLayer->geometrie_id . '"'; - $igoGeometrie = IgoGeometrie::findFirst($geometryQuery); - } else { - $igoGeometrie = new IgoGeometrie(); - } - - //Find it's classe d'entité - if ($igoGeometrie && $igoGeometrie->classe_entite_id) { - $classeEntiteQuery = 'id="' . $igoGeometrie->classe_entite_id . '"'; - $igoClasseEntite = IgoClasseEntite::findFirst($classeEntiteQuery); - } else { - $igoClasseEntite = null; - } - - //Find its classes - if ($igoLayer->id) { - $classesQuery = 'couche_id="' . $igoLayer->id . '"'; - $igoClasses = IgoClasse::find($classesQuery); - } else { - $igoClasses = null; - } - - } else { - //If a layer with the same name doesn't exist - //Create a new layer - $igoLayer = new IgoCouche(); - - //Create a new geometry - $igoGeometrie = new IgoGeometrie(); - - //Set some variables to null - $igoClasseEntite = null; - $igoClasses = null; - } - - $groupID = null; - if ($layer['wms_group_title']) { - //Create a new group only if no context are to be created or if the layer has no group already - if (!$igoContexte || !$layer['currentGroup']) { - //Find all the sub-groups - $groupNames = preg_split("/\//", $layer['wms_group_title']); - $fullGroupName = ''; - $parent_groupe_id = null; - foreach ($groupNames as $groupName) { - //Build the full group name by appending the group name to the previous - //full name. The full group name is used to store the ids of the - //groups parsed already (but not yet commited) in order to create them only once - //Exemple of two diffrent groups: - //Vigilance/Inondation != MTQ/Inondation - $fullGroupName .= '/' . $groupName; - - //Check if the group has been parsed already (from another layer) and retrieve its ID - $found = false; - - foreach ($groups as $group) { - if ($group['name'] == $fullGroupName) { - $groupID = $group['id']; - $found = true; - - break; - } - } - - //If the groups has not been created already, create it - if (!$found) { - //Check if this group exists in the database already - - $igoGroupe = IgoGroupe::findFirst('nom="' . $groupName . '"'); - - if ($igoGroupe) { - //If it exists already, retrieve it's id - $groupID = $igoGroupe->id; - } else { - //If it doesn't exist, create it and retrieve it's id - $igoGroupe = new IgoGroupe(); - - $igoGroupe->nom = $groupName; - $igoGroupe->est_exclu_arbre = 'FALSE'; - - if (!$igoGroupe->save()) { - - foreach ($igoGroupe->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - } - - $groupID = $igoGroupe->id; - - } - - $igoGroupe->specifie_parent($parent_groupe_id); - //Store the id of the newly created group in the groups array - $groups[] = array( - 'name' => $fullGroupName, - 'id' => $groupID - ); - } - $parent_groupe_id = $groupID; - } - } - } - - //This array is used to define a couche_contexte for each excluded attribute - $excludedAttributes = array(); - if (!$igoClasseEntite) { - //If the classe d'entité doesn't exist, create a new one - $igoClasseEntite = new IgoClasseEntite(); - - //Else, set the classe d'entité name to the layer name - $igoClasseEntite->nom = $layer['name']; - // TODO : presentement on prend le premier catalogue du bord. Il faudra penser à une meilleure solution. - $igoCatalogueCsw = IgoCatalogueCsw::findFirst(); - if ($igoCatalogueCsw) { - $igoClasseEntite->catalogue_csw_id = $igoCatalogueCsw->id; - } - - if (!$igoClasseEntite->save()) { - foreach ($igoClasseEntite->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - } - } //if (!$igoClasseEntite) { - // - //Update or set the geometry attributes - $igoGeometrie->mf_layer_projection = $layer['projection']; - $igoGeometrie->mf_layer_data = $layer['data']; - $igoGeometrie->connexion_id = ($igoConnexion ? $igoConnexion->id : $igoGeometrie->connexion_id); - $igoGeometrie->geometrie_type_id = $geometryTypes[$layer['type']]; - $igoGeometrie->classe_entite_id = $igoClasseEntite->id; - $igoGeometrie->vue_defaut = $layer['vue_defaut']; - $igoGeometrie->acces = "L"; - // Définir l'indice d'inclusion... - $indice_inclusion = "T"; // T=Tous, E=Exclusion I=Inclusion - foreach ($layer['attributes'] as $attribute) { - if ($attribute['est_inclu']) { - $indice_inclusion = "I"; - break; - } else { - $indice_inclusion = "E"; - break; - } - } - $igoGeometrie->ind_inclusion = $indice_inclusion; - - - if ($igoGeometrie->save(false) == false) { - $this->db->rollback(); - foreach ($igoGeometrie->getMessages() as $message) { - throw new Exception($message); - } - - } - - //Insert or update attributes - foreach ($layer['attributes'] as $attribute) { - $attributeQuery = 'geometrie_id="' . $igoGeometrie->id . '" AND colonne="' . $attribute['colonne'] . '"'; - $igoAttribute = IgoAttribut::findFirst($attributeQuery); - $update = false; - - if (!$igoAttribute) { - $igoAttribute = new IgoAttribut(); - $update = true; - } else if ($igoAttribute && !$igoContexte) { - $update = true; - } - - if ($update) { - - $igoAttribute->colonne = $attribute['colonne']; - $igoAttribute->est_cle = ($attribute['est_cle'] ? 'TRUE' : 'FALSE'); - $igoAttribute->est_inclu = ($attribute['est_inclu'] ? 'TRUE' : 'FALSE'); - $igoAttribute->geometrie_id = $igoGeometrie->id; - - if (!$igoAttribute->save(false)) { - foreach ($igoAttribute->getMessages() as $message) { - throw new Exception($message); - } - $this->db->rollback(); - - } - } else { - if ($igoContexte && !$attribute['est_inclu']) { - if ($igoAttribute->est_inclu == 'TRUE') { - $excludedAttributes[] = $igoAttribute->id; - } - } - } - } - - // Création ou mise à jour de la couche - $igoLayer->type = $layer['location']; - $igoLayer->geometrie_id = $igoGeometrie->id; - $igoLayer->mf_layer_name = $layer['name']; - $igoLayer->mf_layer_group = $layer['group']; - $igoLayer->mf_layer_meta_name = $layer['wms_name']; - $igoLayer->mf_layer_meta_attribution_title = $layer['wms_attribution_title']; - $igoLayer->mf_layer_meta_title = $layer['wms_title']; - $igoLayer->mf_layer_meta_group_title = $layer['wms_group_title']; - $igoLayer->mf_layer_filtre = $layer['filter']; - $igoLayer->mf_layer_opacity = $layer['opacity']; - $igoLayer->mf_layer_minscale_denom = ($layer['minscaledenom'] == -1 ? null : $layer['minscaledenom']); - $igoLayer->mf_layer_maxscale_denom = ($layer['maxscaledenom'] == -1 ? null : $layer['maxscaledenom']); - $igoLayer->mf_layer_labelitem = $layer['labelitem']; - $igoLayer->mf_layer_labelminscale_denom = ($layer['labelminscaledenom'] == -1 ? null : $layer['labelminscaledenom']); - $igoLayer->mf_layer_labelmaxscale_denom = ($layer['labelmaxscaledenom'] == -1 ? null : $layer['labelmaxscaledenom']); - $igoLayer->mf_layer_def = $layer['layer_def']; - $igoLayer->mf_layer_meta_def = $layer['meta_def']; - - if (isset($layer['wfs_maxfeatures']) && is_numeric($layer['wfs_maxfeatures'])) { - $igoLayer->mf_layer_meta_wfs_max_feature = $layer['wfs_maxfeatures']; - } - - // Assignation du champ fiche_csw_id tel que décrit dans issue 39 - $igoLayer->fiche_csw_id = $layer['name']; - if (isset($layer['msp_classe_meta'])) { - $igoLayer->fiche_csw_id = $layer['msp_classe_meta']; - } - - //Check if some attributes should be overwritten in igoCoucheContexte - $coucheContexteName = null; - if ($igoContexte && $igoLayer->mf_layer_meta_name && $igoLayer->mf_layer_meta_name != $layer['wms_name']) { - $coucheContexteName = $layer['wms_name']; - } else { - $igoLayer->mf_layer_meta_name = (isset($layer['wms_name']) ? $layer['wms_name'] : $layer['name']); - } - - $coucheContexteTitle = null; - if ($igoContexte && $igoLayer->mf_layer_meta_title && $igoLayer->mf_layer_meta_title != $layer['wms_title']) { - $coucheContexteTitle = $layer['wms_title']; - } else { - $igoLayer->mf_layer_meta_title = $layer['wms_title']; - } - - $coucheContexteFilter = null; - if ($igoContexte && $igoLayer->mf_layer_filtre && $igoLayer->mf_layer_filtre != $layer['filter']) { - $coucheContexteFilter = $layer['filter']; - } else { - $igoLayer->mf_layer_filtre = $layer['filter']; - } - //If the new group is different than the current group, assign the new group the the context instead - //of changing the group itself - if ($layer['currentGroup'] && ($layer['currentGroup'] != $layer['wms_group_title'])) { - $igoCoucheContexte->mf_layer_meta_group_title = $layer['wms_group_title']; - } - - if (!$igoLayer->save(false)) { - foreach ($igoLayer->getMessages() as $message) { - throw new Exception($message); - } - $this->db->rollback(); - - } else { - $layerSaveSuccessful = true; - //If the layer has some classes defined already, delete them and re-insert them - //We need to delete them and re-insert since it is not possible to update them - //(they don't have a name on which we can query) - if ($igoClasses) { - foreach ($igoClasses as $igoClass) { - - if ($igoClass->delete() == false) { - foreach ($igoClass->getMessages() as $message) { - throw new Exception($message); - } - } - } - } - - //Save each classes and assign them a z order - $mf_class_z_order = 0; - foreach ($layer['classes'] as $class) { - $igoClass = new IgoClasse(); - - $igoClass->mf_class_def = $class; - $igoClass->couche_id = $igoLayer->id; - $igoClass->mf_class_z_order = $mf_class_z_order; - $igoClass->save(false); - - if ($igoLayer->save(false) == false) { - foreach ($igoClass->getMessages() as $message) { - throw new Exception($message); - } - $this->db->rollback(); - - } - - $mf_class_z_order++; - } - if ($groupID) { - $igoGroupeeCouche = IgoGroupeCouche::findFirst('couche_id=' . $igoLayer->id . ' AND groupe_id=' . $groupID); - if (!$igoGroupeeCouche) { - $igoGroupeeCouche = new IgoGroupeCouche (); - $igoGroupeeCouche->groupe_id = $groupID; - $igoGroupeeCouche->couche_id = $igoLayer->id; - - $igoGroupeeCouche->save(); - } - } else { - echo("La couche {$layer['name']} est dans aucun groupe.
    "); - } - - } - } - - //Conserver = softinsert, Insérer/remplacer = insert - if ($layer['action'] == 'softinsert' || ($layer['action'] == 'insert' && $layerSaveSuccessful)) { - if (!isset($excludedAttributees)) { - $excludedAttributes = array(); - } - if ($igoContexte) { - //If no attributes are excluded, append a null value to the excluded attributes - //array. This way a couche_contexte with no excluded attribute will be created - if (count($excludedAttributes) == 0) { - $excludedAttributes[] = null; - } - - foreach ($excludedAttributes as $excludedAttribute) { - $igoCoucheContexte = new IgoCoucheContexte(); - - $igoCoucheContexte->contexte_id = $igoContexte->id; - $igoCoucheContexte->couche_id = $igoLayer->id; - $igoCoucheContexte->layer_a_order = $layerIndex++; - - $nomComplet = str_replace("'", "_", $layer['wms_group_title']); - - while (!empty($nomComplet)) { - - // Fix pour que le groupe existe la première fois. - $igoVueGroupesRecursif = IgoVueGroupesRecursif::findFirst("nom_complet like '%{$nomComplet}'"); - - $groupe_id = $igoVueGroupesRecursif ? $igoVueGroupesRecursif->groupe_id : $groupID; - - if ($groupe_id && $igoVueGroupesRecursif) { - - $arbre_id = $igoVueGroupesRecursif->grp; - $igoCoucheContexteGroupe = IgoCoucheContexte::findFirst("contexte_id={$igoContexte->id} and couche_id IS NULL and arbre_id='{$arbre_id}'"); - if (!$igoCoucheContexteGroupe) { - - $igoCoucheContexteGroupe = new IgoCoucheContexte(); - - $igoCoucheContexteGroupe->contexte_id = $igoContexte->id; - $igoCoucheContexteGroupe->couche_id = null; - $igoCoucheContexteGroupe->groupe_id = $groupe_id; - $igoCoucheContexteGroupe->arbre_id = $arbre_id; - $igoCoucheContexteGroupe->mf_layer_meta_name = $igoVueGroupesRecursif->nom; - $igoCoucheContexteGroupe->mf_layer_meta_title = $igoVueGroupesRecursif->nom_complet; - $a = explode("/", $igoVueGroupesRecursif->nom_complet); - $s = array_pop($a); - $igoCoucheContexteGroupe->mf_layer_meta_title = $s; - $igoCoucheContexteGroupe->mf_layer_meta_group_title = $s; - $igoCoucheContexteGroupe->layer_a_order = $layerIndex++; - $igoCoucheContexteGroupe->est_visible = 'TRUE'; - $igoCoucheContexteGroupe->ind_fond_de_carte = 'D'; - $igoCoucheContexteGroupe->save(); - } - } - - $t = explode('/', $nomComplet); - array_pop($t); - $nomComplet = implode('/', $t); - - } - - $igoCoucheContexte->groupe_id = $groupe_id; - $igoVueGroupesRecursif = IgoVueGroupesRecursif::findFirst("nom_complet like '%" . str_replace("'", "_", $layer['wms_group_title']) . "'"); - $igoCoucheContexte->arbre_id = $igoVueGroupesRecursif ? $igoVueGroupesRecursif->grp : $groupe_id; - $igoCoucheContexte->mf_layer_meta_name = $layer['wms_name']; - - $igoCoucheContexte->mf_layer_meta_title = $layer['wms_title']; - - $a = explode("/", $layer['wms_title']); - $s = array_pop($a); - $igoCoucheContexte->mf_layer_meta_title = $s; - $igoCoucheContexte->mf_layer_meta_group_title = $s; - $igoCoucheContexte->mf_layer_meta_z_order = $layer['zIndex']; - - $igoCoucheContexte->est_visible = 'TRUE'; - $igoCoucheContexte->ind_fond_de_carte = 'D'; - - //Check if some attributes should be overwritten in igoCoucheContexte - $coucheContexteName = null; - if ($igoContexte && $igoLayer->mf_layer_meta_name && $igoLayer->mf_layer_meta_name != $layer['wms_name']) { - $coucheContexteName = $layer['wms_name']; - } else { - $igoLayer->mf_layer_meta_name = ($layer['wms_name'] ? $layer['wms_name'] : $layer['name']); - } - - $coucheContexteTitle = null; - if ($igoContexte && $igoLayer->mf_layer_meta_title && $igoLayer->mf_layer_meta_title != $layer['wms_title']) { - $coucheContexteTitle = $layer['wms_title']; - } else { - $igoLayer->mf_layer_meta_title = $layer['wms_title']; - } - - $coucheContexteFilter = null; - if ($igoContexte && $igoLayer->mf_layer_filtre && $igoLayer->mf_layer_filtre != $layer['filter']) { - $coucheContexteFilter = $layer['filter']; - } else { - $igoLayer->mf_layer_filtre = $layer['filter']; - } - - if ($coucheContexteName) { - $igoCoucheContexte->mf_layer_meta_name = $coucheContexteName; - } - - if ($coucheContexteTitle) { - $igoCoucheContexte->mf_layer_meta_title = $coucheContexteTitle; - } - - if ($coucheContexteFilter) { - $igoCoucheContexte->mf_layer_filtre = $coucheContexteFilter; - } - - if ($excludedAttribute) { - $igoCoucheContexte->attribut_id = $excludedAttribute; - $igoCoucheContexte->est_exclu = 'TRUE'; - } - //If the new group is different than the current group, assign the new group the the context instead - //of changing the group itself - if ($layer['currentGroup'] && ($layer['currentGroup'] != $layer['wms_group_title'])) { - $igoCoucheContexte->mf_layer_meta_group_title = $layer['wms_group_title']; - } - $this->igoCoucheContexteSave($igoCoucheContexte); - - - } - } - } - $igoCouches[] = $igoLayer; - } - } - - $this->db->commit(); - - if ($igoContexte !== null) { - $igoContexte->saveMapFile(); - } - foreach ($igoCouches as $igoCouche) { - $igoCouche->saveMapFile(false); - } - } catch (Exception $e) { - error_log(json_encode($e)); - throw $e; - } - } - - - - private function clearSession(){ - //Clear session - $this->session->set('mapfile', null); - $this->session->set('mapfileData', null); - $this->session->set('selectData', null); - $this->session->set('processData', null); - $this->session->set('contexteName', null); - $this->session->set('contexteCode', null); - $this->session->set('contexteDescription', null); - $this->session->set('onlineResource', null); - - } - - private function igoCoucheContexteSave($igoCoucheContexte){ - if ($igoCoucheContexte->save() == false) { - foreach ($igoCoucheContexte->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - } - } - - - private function igoConnexionSave($igoConnexion){ - if (!$igoConnexion->save(false)) { - foreach ($igoConnexion->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - } - } - - private function igoContexteSave($igoContexte){ - if (!$igoContexte->save(false)) { - foreach ($igoContexte->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - - } - } - - private function igoGeometrieTypeSave($igoGeometrieType){ - if (!$igoGeometrieType->save()) { - foreach ($igoGeometrieType->getMessages() as $message) { - throw new Exception($message); - } - - $this->db->rollback(); - } - } - -} diff --git a/pilotage/app/controllers/MapfileParser/MapfileParser.php b/pilotage/app/controllers/MapfileParser/MapfileParser.php deleted file mode 100644 index 77767bd3..00000000 --- a/pilotage/app/controllers/MapfileParser/MapfileParser.php +++ /dev/null @@ -1,237 +0,0 @@ -message); - exit; - } - - $map = new Map($oMap); - - $layers = array_merge($layers, $map->parseLayers()); - } - } - - return $this->formatParsingOutput($layers); - } - - function fopen_file_get_contents($cheminFichier) { - $contenu = ''; - $handle = fopen($cheminFichier, 'r'); - if ($handle) { - $contenu = fread($handle, filesize($cheminFichier)); - } - return $contenu; - } - - /** - * Returns all layers found in a mapfile - * - * $file [string] : file path - */ - public function parseFile($file) { - if (is_file($file)) { - if (substr($file, -4) == '.map') { - //create a map object - try { - $projLib = getenv("PROJ_LIB"); - $mapFileContent = $this->fopen_file_get_contents($file); - $mapFileContent = preg_replace('/(\n|^)\s*MAP\s*(\n|#)/', "$0\nCONFIG PROJ_LIB {$projLib}\n", $mapFileContent, 1); - $oMap = ms_newMapObjFromString($mapFileContent, dirname($file)); - } catch (Exception $e) { - $error = ms_getErrorObj(); - throw new Exception($error->message); - exit; - } - - $map = new Map($oMap); - - $m = array(); - - $mapMetaData = array( - "wms_onlineresource" - ); - - $mapParameters = array( - "projection" - ); - - foreach ($mapMetaData as $metaData) { - $m[$metaData] = $map->getMeta($metaData); - } - - foreach ($mapParameters as $parameter) { - $m[$parameter] = $map->getParam($parameter); - } - - $layers = $map->parseLayers(); - - return $this->formatParsingOutput($m, $layers); - } else { - throw new Exception("Le fichier spécifié n'est pas un mapfile valide."); - } - } else { - throw new Exception("Le fichier n'existe pas."); - } - } - - /** - * Splits an array of layer into arrays - * of distinct layers and not distinct layers. - * Distinct layers do not share the same name. - * - * $layers [array] : an array of layers with the 'name' property - */ - private function formatParsingOutput($map, $layers) { - - $distinctNames = array(); - $notDistinctNames = array(); - - foreach ($layers as $layer) { - if (!in_array($layer['name'], $distinctNames)) { - $distinctNames[] = $layer['name']; - } else { - $notDistinctNames[] = $layer['name']; - } - } - - $notDistinctLayers = array(); - $distinctLayers = array(); - - $i = 1; - foreach ($layers as $layer) { - $layer['id'] = $i; - - if (in_array($layer['name'], $notDistinctNames)) { - $layer['distinct'] = false; - $notDistinctLayers[] = $layer; - } else { - $layer['distinct'] = true; - $distinctLayers[] = $layer; - } - $i++; - } - - return array( - "distinctLayers" => $distinctLayers, - "notDistinctLayers" => $notDistinctLayers, - "nLayers" => count($distinctLayers) + count($notDistinctLayers), - "map" => $map - ); - } - - /** - * Splits an array of layer into an - * array of connexion each with it's - * corresponding layers - * - * $layers [array] : an array of layers - */ - public function formatSaveData($layers, $host = null, $hostAlias = null) { - $distinctConnections = array(); - $data = array(); - - foreach ($layers as $layer) { - //Get a list of all the distinct connections in the parsed layers - //Convert the connection string to an object with all the connection parameters - //We can't simply compare the connexion string since the parameters can be ordered - //differently - $layer['location'] = 'L'; - $connection=null; // À vérifier.... - - //error_log("LayerName: " . $layer['name'] . " LayerConnection: " . $layer['connection'] . " LayerConnectionType: " . $layer['connectiontype']); - if ($layer['connection'] && $layer['connectiontype']) { - $connection = connectionStringToObject($layer['connection'], $layer['connectiontype']); - - //Check if layer is internal or external - if ($host and $hostAlias) { - if (array_key_exists('host', $connection)) { - if (strtolower($connection['host']) != strtolower($hostAlias)) { - $layer['location'] = 'D'; - } - } else { - if (array_key_exists('connectionString', $connection)) { - if (strpos(strtolower($connection['connectionString']), strtolower($host)) === false) { - $layer['location'] = 'D'; - } - } - } - } - - $i = 0; - $match = false; - - foreach ($distinctConnections as $distinctConnection) { - - $match = true; - //Compare all the connection parameters (host, user, password...) - foreach ($connection as $connectionParameter => $parameterValue) { - //error_log("param: " . $connectionParameter . " paramvalue: ". $parameterValue); - if ($match == true && $distinctConnection != null) { - if (array_key_exists($connectionParameter, $distinctConnection)) { - if ($parameterValue != $distinctConnection[$connectionParameter]) { - $match = false; - } - } else { - $match = false; - } - } else { - break; - } - } - - //If a match is found, stop and add the layer to the data array - if ($match == true) { - //error_log("Adding layer {$layer['name']} to connection {$data[$i]['connection']['connectionString']}"); - $data[$i]['layers'][] = $layer; - break; - } - - $i++; - } - - //If no match is found, add the layer connection to the distinct connections and add it the data array - if ($match == false) { - //error_log("adding layer {$layer['name']} to connection {$connection['connectionString']}"); - $distinctConnections[] = $connection; - $data[] = array( - 'connection' => $connection, - 'layers' => array($layer) - ); - } - } else { - // TODO : On passe ici pour les shapefiles... Est-ce normal? - //error_log("else... Layer->Connection:{$layer['connection']} & Layer->ConnectionType:{$layer['connectiontype']}"); - if(isset($connection)){ - $distinctConnections[] = $connection; - } - - $data[] = array( - 'connection' => null, - 'layers' => array($layer) - ); - } - } - - return $data; - } - -} diff --git a/pilotage/app/controllers/MapfileParser/core/inc/layer.inc.php b/pilotage/app/controllers/MapfileParser/core/inc/layer.inc.php deleted file mode 100644 index b19a907a..00000000 --- a/pilotage/app/controllers/MapfileParser/core/inc/layer.inc.php +++ /dev/null @@ -1,301 +0,0 @@ - "POSTGIS", - MS_RASTER => "RASTER", - MS_OGR => "OGR", - MS_SHAPEFILE => "SHAPEFILE", - MS_WMS => "WMS", - MS_ORACLESPATIAL => "ORACLESPATIAL", - MS_WFS => "WFS", - MS_MYSQL => "MYSQL", - MS_SDE => "SDE", - MS_GRATICULE => "GRATICULE", - MS_TILED_SHAPEFILE => "TILED_SHAPEFILE", - MS_PLUGIN => "PLUGIN", - MS_UNION => "UNION", - MS_UVRASTER => "UVRASTER", - MS_INLINE => "INLINE" - ); - - var $geometryTypes = array( - MS_LAYER_POINT => "POINT", - MS_LAYER_LINE => "LINE", - MS_LAYER_POLYGON => "POLYGON", - MS_LAYER_RASTER => "RASTER", - MS_LAYER_ANNOTATION => "ANNOTATION", - MS_LAYER_QUERY => "QUERY", - MS_LAYER_CIRCLE => "CIRCLE", - MS_LAYER_TILEINDEX => "TILEINDEX", - MS_LAYER_CHART => "CHART" - ); - - var $booleanTypes = array( - MS_TRUE => "TRUE", - MS_FALSE => "FALSE" - ); - - var $unitTypes = array( - MS_INCHES => 'inches', - MS_FEET => 'feet', - MS_MILES => 'miles', - MS_METERS => 'meters', - MS_NAUTICALMILES => 'nauticalmiles', - MS_KILOMETERS => 'kilometers', - MS_DD => 'dd', - MS_PIXELS => 'pixels', - ); - - function __construct($oLayer){ - $this->oLayer = $oLayer; - } - - /** - * Returns the value of a given paarameter - * - * $param [string] : layer parameter - */ - function getParam($param){ - if($param == 'projection'){ - $value = $this->getProjection(); - } else if($param == 'type'){ - $value = $this->getGeometryType(); - } else if($param == 'connectiontype'){ - $value = $this->getConnectionType(); - } else if($param == 'filter'){ - $value = $this->getUnsupportedParam($param); - } else if($param == 'vue_defaut'){ - $value = $this->getVueDefaut(); - } else if($param == 'opacity'){ - $value = $this->oLayer->$param; - if(!$value or trim($value) == ''){ - $transparency = $this->oLayer->transparency; - if($transparency and trim($transparency) != ''){ - $value = $transparency; - } - return utf8_encode($value); - } - } else{ - $value = utf8_encode($this->oLayer->$param); - } - return $value; - } - - function getUnsupportedParam($param){ - $value = null; - $layerDef = $this->getLayerDef(array()); - //echo $layerDef; - //preg_split string into a line-by-line array - $lines = preg_split("/\n/", $layerDef); - - foreach ($lines as $line) { - $l = trim(str_replace("\t", " ", $line)); - $components = preg_split("/\s/", str_replace(array("\n", "\r"), "", $l)); - $parameter = trim($components[0]); - - if(strlen($parameter) > 0 && strtolower($parameter) == strtolower($param)){ - $value = ''; - - for($i=1; $ioLayer->getMetaData($meta)); - } - - function getAttributes(){ - $data = $this->getParam('data'); - $uniqueIDPattern = "/(?<=using unique\s).*\s+/Ui"; - $uniqueID = null; - preg_match($uniqueIDPattern, $data, $match); - if(count($match) > 0){ - $uniqueID = trim($match[0]); - } - - $attributes = array(); - $includedAttributes = $this->getMeta('gml_include_items'); - $excludedAttributes = $this->getMeta('gml_exclude_items'); - - if(strlen($includedAttributes) > 0){ - foreach(preg_split("/,/", $includedAttributes) as $attribute){ - $name = trim($attribute); - if($name != 'all' && strlen($name) > 0){ - $attributes[] = array( - "colonne" => $name, - "est_inclu" => true, - "est_cle" => ($name == $uniqueID ? true : false) - ); - } - } - } - - if(strlen($excludedAttributes) > 0){ - foreach(preg_split("/,/", $excludedAttributes) as $attribute){ - $name = trim($attribute); - if($name != 'all' && strlen($name) > 0){ - $found = false; - foreach($attributes as &$att){ - if($att['colonne'] == $name){ - $att['est_inclu'] = false; - $found = true; - } - } - - if($found == false){ - $attributes[] = array( - "colonne" => $name, - "est_inclu" => false, - "est_cle" => ($name == $uniqueID ? true : false) - ); - } - } else if($name == 'all'){ - foreach($attributes as &$att){ - $att['est_inclu'] = false; - } - } - } - } - - if($uniqueID && strlen($uniqueID) > 0){ - $found = false; - foreach($attributes as $attribute){ - if($attribute['colonne'] == $uniqueID){ - $found = true; - break; - } - } - - if($found == false){ - $attributes[] = array( - "colonne" => $uniqueID, - "est_inclu" => false, - "est_cle" => true - ); - } - } - return $attributes; - } - - function getGeometryType(){ - $intType = $this->oLayer->type; - return $this->geometryTypes[$intType]; - } - - function getProjection(){ - $projection = ''; - $layerString = $this->oLayer->convertToString(); - $pattern = '/(?<=PROJECTION).*(?=END)/Uis'; - - if(preg_match($pattern, $layerString, $matches)){ - $projection = $matches[0]; - $projectionCode = trim(str_replace(array("'", '"', "init=epsg:"), '', strtolower($projection))); - if(ctype_digit($projectionCode)){ - $projection = $projectionCode; - } - } - - return utf8_encode($projection); - } - - function getConnectionType(){ - $intType = $this->oLayer->connectiontype; - return $this->connectionTypes[$intType]; - } - - function getVueDefaut(){ - $vueDefaut = null; - $data = $this->getParam('data'); - $pattern = '/(?<=from\s).*[\s;]+/Uis'; - - if(preg_match($pattern, $data, $matches)){ - $vueDefaut = $matches[0]; - } - - return $vueDefaut; - } - - function getClasses(){ - $classes = array(); - for($i = 0; $i < $this->oLayer->numclasses; $i++){ - $classes[] = $this->oLayer->getClass($i); - } - return $classes; - } - - function getLayerDef($exclusions){ - $layerString = $this->oLayer->convertToString(); - $contentPattern = '/(?<=LAYER).*(?=END)/is'; - $classesPattern = '/\n\s*CLASS\s*(\n|#).*END\s#\sCLASS/is'; - $metaDataPattern = '/\n\s*METADATA\s*(\n|#).*END\s#\sMETADATA/Uis'; - $projectionPattern = '/\n\s*PROJECTION\s*(\n|#).*END\s#\sPROJECTION/is'; - $closeDeferPattern = '/PROCESSING\s+(\"|\')CLOSE_CONNECTION=DEFER[(\"|\')$]/Uis'; - - if(preg_match($contentPattern, $layerString, $matches)){ - $layerContent = $matches[0]; - //Remove classes - $layerContent = preg_replace($classesPattern, '', $layerContent); - //Remove metadata - $layerContent = preg_replace($metaDataPattern, '', $layerContent); - //Remove projection - $layerContent = preg_replace($projectionPattern, '', $layerContent); - //Remove close connection defer - $layerContent = preg_replace($closeDeferPattern, '', $layerContent); - } - - //preg_split string into a line-by-line array - $lines = preg_split("/\n/", $layerContent); - - $layerDef = ''; - foreach ($lines as $line) { - $l = trim(str_replace("\t", " ", $line)); - $components = preg_split("/\s/", str_replace(array("\n", "\r"), "", $l)); - $parameter = trim($components[0]); - - if(strlen($parameter) > 0 && !in_array(strtolower($parameter), $exclusions)){ - $layerDef = $layerDef . $line . "\n"; - } - } - echo $layerDef; - return utf8_encode($layerDef); - } - - function getMetaDef($exclusions){ - $metaDef = ''; - $layerString = $this->oLayer->convertToString(); - $metaDataPattern = '/(?<=METADATA).*(?=END\s#\sMETADATA)/Uis'; - - if(preg_match($metaDataPattern, $layerString, $matches)){ - $layerContent = $matches[0]; - //preg_split string into a line-by-line array - $lines = preg_split("/\n/", $layerContent); - - $metaDef = ''; - foreach ($lines as $line) { - $l = trim(str_replace("\t", " ", $line)); - $components = preg_split("/\s/", str_replace(array("\n", "\r", "'", '"'), "", $l)); - $parameter = trim($components[0]); - - if(strlen($parameter) > 0 && !in_array(strtolower($parameter), $exclusions)){ - $metaDef = $metaDef . $line . "\n"; - } - } - } - - return utf8_encode($metaDef); - } -} - -?> diff --git a/pilotage/app/controllers/MapfileParser/core/inc/map.inc.php b/pilotage/app/controllers/MapfileParser/core/inc/map.inc.php deleted file mode 100644 index 945f84fd..00000000 --- a/pilotage/app/controllers/MapfileParser/core/inc/map.inc.php +++ /dev/null @@ -1,152 +0,0 @@ -oMap = $oMap; - } - - function getMeta($meta){ - return utf8_encode($this->oMap->getMetaData($meta)); - } - - function getParam($param){ - if($param == 'projection'){ - $value = $this->getProjection(); - } else{ - $value = utf8_encode($this->oMap->$param); - } - - return $value; - } - - function getProjection(){ - $projection = ''; - $mapString = $this->oMap->convertToString(); - - $layersPattern = '/LAYER.*END\s#\sLAYER/is'; - //Remove layers - $mapContent = preg_replace($layersPattern, '', $mapString); - - $projectionPattern = '/(?<=PROJECTION).*(?=END)/Uis'; - - if(preg_match($projectionPattern, $mapContent, $matches)){ - $projection = $matches[0]; - $projectionCode = trim(str_replace(array("'", '"', "init=epsg:"), '', strtolower($projection))); - if(ctype_digit($projectionCode)){ - $projection = $projectionCode; - } - } - - return utf8_encode($projection); - } - - function createLayerFromString($string){ - $layer = new Layer(new LayerObj($this->oMap)); - $layer->oLayer->updateFromString($string); - - return $layer; - } - - function parseLayers(){ - $layerParameters = array( - "name", - "group", - "type", - "projection", - "connection", - "connectiontype", - "data", - "filter", - "opacity", - "minscaledenom", - "maxscaledenom", - "labelitem", - "labelminscaledenom", - "labelmaxscaledenom", - "vue_defaut" - ); - - $layerMetaData = array( - "wms_name", - "wms_title", - "wms_group_title", - "wfs_maxfeatures", - "gml_include_items", - "gml_exclude_items", - "ows_exclude_items", - "ows_include_items", - "msp_classe_meta", - "wms_attribution_title", - "layer_name_igo" - ); - - $layerZIndex = array( - 'LINE' => 2001, - 'POINT' => 3001, - 'POLYGON' => 1001, - 'RASTER' => 1, - 'CHART' => 5000, - 'CIRCLE' => 1001, - 'QUERY' => 0, - 'ANNOTATION' => 4001, - 'TILEINDEX' => 1001 - ); - - $baseIndex = -1; - $index = -1; - $layers = array(); - - //Parse layers - for($i = 0; $i < $this->oMap->numlayers; $i++){ - //create new layer object - $layer = new Layer($this->oMap->getLayer($i)); - - //Create new empty hash array to store layer data - $l = array(); - - //Get some layer parameters - foreach ($layerParameters as $parameter) { - $l[$parameter] = $layer->getParam($parameter); - - } - //Get some metadata - foreach ($layerMetaData as $metaData) { - $metaDataValue = $layer->getMeta($metaData); - $l[$metaData] = $metaDataValue; - if('layer_name_igo' == $metaData && $metaDataValue ){ - - $l['name'] = $metaDataValue; - } - } - - //Get other parameters as plain text - $l['layer_def'] = $layer->getLayerDef($layerParameters); - //Get other metadata as plain text - $l['meta_def'] = $layer->getMetaDef($layerMetaData); - //Get attributes - $l['attributes'] = $layer->getAttributes(); - - //Parse layer classes - $classes = $layer->getClasses(); - $l['classes'] = array(); - foreach ($classes as $class) { - $l['classes'][] = utf8_encode($class->convertToString()); - } - - if(($layerZIndex[$l['type']] > $baseIndex) && ($layerZIndex[$l['type']] > $index)){ - $index = $layerZIndex[$l['type']]; - } else{ - $index += 1; - } - $baseIndex = $layerZIndex[$l['type']]; - $l['zIndex'] = $index; - $layers[] = $l; - } - - return $layers; - } -} - -?> diff --git a/pilotage/app/controllers/MapfileParser/core/inc/utils.inc.php b/pilotage/app/controllers/MapfileParser/core/inc/utils.inc.php deleted file mode 100644 index 9d49bbaa..00000000 --- a/pilotage/app/controllers/MapfileParser/core/inc/utils.inc.php +++ /dev/null @@ -1,72 +0,0 @@ - $connectionType - ); - - if(in_array($connectionType, array("POSTGIS", "ORACLESPATIAL", "MYSQL"))){ - $optionsPattern = '/(?<=options=)\'.+\'{1}/s'; - - foreach(array('host', 'user', 'password', 'dbname', 'port') as $parameter){ - $pattern = '/(?<=' . $parameter . '=)[\w_]+\s*/s'; - if(preg_match($pattern, $connectionString, $value)){ - $connection[$parameter] = trim($value[0]); - } - } - - if(preg_match($optionsPattern, $connectionString, $value)){ - $connection['options'] = $value[0]; - } - - $connection['connectionString'] = objectToConnectionString($connection); - } else{ - //Any other type of connection - if(strlen($connectionString) > 0){ - //phalcon doesn't escape the double quotes so we can't store the full connection string - - $connection['connectionString'] = $connectionString; //$connection['connectionString'] = 'CONNECTION "' . $connectionString . '"'; - } else{ - $connection['connectionString'] = null; - } - - } - - return $connection; -} - -function objectToConnectionString($connection){ - $connectionString = 'host=' . $connection['host']; - $connectionString .= ' dbname=' . $connection['dbname']; - $connectionString .= ' user=' . $connection['user']; - if(array_key_exists('password', $connection)){ - $connectionString .= ' password=' . $connection['password']; - } - if(array_key_exists('port', $connection)){ - $connectionString .= ' port=' . $connection['port']; - } - if(array_key_exists('options', $connection)){ - $connectionString .= ' options=' . $connection['options']; - } - //phalcon doesn't escape the double quotes so we can't store the full connection string - return $connectionString; //return 'CONNECTION "' . $connectionString . '"'; -} - -function listFilesInDirectory($directory, $prefix = '') { - $directory = rtrim($directory, '\\/'); - $files = array(); - - foreach (scandir($directory) as $file) { - if ($file !== '.' and $file !== '..') { - if (is_dir("$directory/$file")) { - $files = array_merge($files, listFilesInDirectory("$directory/$file", "$prefix$file/")); - } else { - $files[] = $prefix.$file; - } - } - } - - return $files; -} - -?> diff --git a/pilotage/app/controllers/MapfileParser/core/init.inc.php b/pilotage/app/controllers/MapfileParser/core/init.inc.php deleted file mode 100644 index 4473e4ea..00000000 --- a/pilotage/app/controllers/MapfileParser/core/init.inc.php +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/pilotage/app/controllers/MenuController.php b/pilotage/app/controllers/MenuController.php deleted file mode 100644 index aa16d2db..00000000 --- a/pilotage/app/controllers/MenuController.php +++ /dev/null @@ -1,22 +0,0 @@ -persistent->parameters = null; - $baseUri = $this->url->getBaseUri(); - $this->tag->setDefault("baseUri", $baseUri); - } - - public function infoAction($r_controller = null, $r_action = null, $r_id = null) { - $this->persistent->parameters = null; - $this->tag->setDefault("info", phpinfo()); - } - -} diff --git a/pilotage/app/controllers/ProfilEtPermissionController.php b/pilotage/app/controllers/ProfilEtPermissionController.php deleted file mode 100644 index 68ac999c..00000000 --- a/pilotage/app/controllers/ProfilEtPermissionController.php +++ /dev/null @@ -1,11 +0,0 @@ -view->setVar("id",$id); - $this->session->set("profil_id",$id); - } - -} diff --git a/pilotage/app/controllers/ProfilEtUtilisateurController.php b/pilotage/app/controllers/ProfilEtUtilisateurController.php deleted file mode 100644 index abf1af15..00000000 --- a/pilotage/app/controllers/ProfilEtUtilisateurController.php +++ /dev/null @@ -1,11 +0,0 @@ -session->set("profil_id",$id); - $this->view->setVar("id",$id); - } - -} diff --git a/pilotage/app/controllers/UtilisateurEtProfilController.php b/pilotage/app/controllers/UtilisateurEtProfilController.php deleted file mode 100644 index 248db31c..00000000 --- a/pilotage/app/controllers/UtilisateurEtProfilController.php +++ /dev/null @@ -1,11 +0,0 @@ -session->set("utilisateur_id",$id); - $this->view->setVar("id",$id); - } - -} diff --git a/pilotage/app/helpers/Arborescence.php b/pilotage/app/helpers/Arborescence.php deleted file mode 100644 index 27ac8aa6..00000000 --- a/pilotage/app/helpers/Arborescence.php +++ /dev/null @@ -1,37 +0,0 @@ -get('session')->get('info_utilisateur')->estAdmin) { - return $this->linkTo($parameters); - } - } - - /* - * Fonction qui vérifie si l'utilisateur possède le profil propriétaire - * et affiche le lien le cas échéant - */ - public function linkIfProprietaire($parameters, $proprietaire_id) { - - $di = \Phalcon\DI::getDefault(); - $info_utilisateur = $di->getSession()->get("info_utilisateur"); - $profils = $info_utilisateur->profils; - - // Les admins ont le droits de tout modifier - if ($info_utilisateur->estAdmin) { - return $this->linkTo($parameters); - } - - //TODO Cette vérification ne prend pas en compte les propriétaires au - //delà du premier niveau. Il faudrait que ça soit récursif - foreach ($profils as $profil) { - - if ($profil["id"] == $proprietaire_id) { - return $this->linkTo($parameters); - } - - } - } - - /* - * Fonction qui créé un bouton de création en fonction du - * controlleur dans lequel l'utilisateur se trouve. - */ - - public function createButton($parameters, $controller) { - - $di = \Phalcon\DI::getDefault(); - - switch ($controller) { - - // Ici on ajoute les boutons de création que l'on veut - // autoriser aux pilotes. - case "igo_groupe": - return $this->linkTo($parameters); - case "igo_contexte": - return $this->linkTo($parameters); - case "igo_profil": - return $this->linkTo($parameters); - case "igo_permission": - return $this->linkTo($parameters); - // Sinon on autorise l'accès qu'aux admins - default: - if ($di->get('session')->get('info_utilisateur')->estAdmin) { - return $this->linkTo($parameters); - } - break; - } - } - - /** - * Outil de sélection - * Nécessite selecteucGaucheDroite.js - * @param array $parameters - */ - static public function selecteurGaucheDroite($parameters) { - - // Converting parameters to array if it is not - if (!is_array($parameters)) { - $parameters = array($parameters); - } - - // Determining attributes "id" and "name" - if (!isset($parameters['prefixe'])) { - $parameters['prefixe'] = ''; - } - - if (!isset($parameters["listeDe"])) { - $parameters["listeDe"] = array(); - } - - if (!$parameters["listeA"]) { - $parameters["listeA"] = array(); - } - - $prefixe = 'multiselect_' . $parameters['prefixe']; - $prefixe_droite = 'multiselect_' . $parameters['prefixe'] . '_to'; - - $code = ' -
    - Actuels
    - ' . IgoTag::selecteur($prefixe_droite, $parameters['listeA']) . '
    - - -
    '; - $code .='
    - - Potentiels
    - ' . IgoTag::selecteur($prefixe, $parameters['listeDe']) . ' -
    - - -
    '; - - $code .= ''; - return $code; - } - - /** - * - * @param string $prefixe - * @param array $liste - * @return string - */ - static private function selecteur($prefixe, $liste) { - - $id = "{$prefixe}"; - $code = ""; - return $code; - } - -} - -?> \ No newline at end of file diff --git a/pilotage/app/models/IgoAttribut.php b/pilotage/app/models/IgoAttribut.php deleted file mode 100644 index 27ea2514..00000000 --- a/pilotage/app/models/IgoAttribut.php +++ /dev/null @@ -1,126 +0,0 @@ -IgoGeometrie->acces=="L"){ - foreach ($this->IgoGeometrie->IgoCouche as $couche){ - $couche->saveMapFile(); - } - } - return $retour; - } - - public function delete(){ - foreach ($this->IgoListeValeur as $liste){ - $liste->delete(); - } - return parent::delete(); - } - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("geometrie_id", "IgoGeometrie", "id", NULL); - $this->belongsTo("liste_valeur_id", "IgoListeValeur", "id", NULL); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_attribut_id_seq'; - } -} diff --git a/pilotage/app/models/IgoCatalogueCsw.php b/pilotage/app/models/IgoCatalogueCsw.php deleted file mode 100644 index fc128557..00000000 --- a/pilotage/app/models/IgoCatalogueCsw.php +++ /dev/null @@ -1,65 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoClasseEntite", "catalogue_csw_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'url', - 'message' => 'Veuillez indiquer l\'URL' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'URL', - 'field' => 'url', - 'max' => 500, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoClasse.php b/pilotage/app/models/IgoClasse.php deleted file mode 100644 index f79f1a29..00000000 --- a/pilotage/app/models/IgoClasse.php +++ /dev/null @@ -1,78 +0,0 @@ -IgoCouche->IgoGeometrie->acces=="L"){ - $this->IgoCouche->save(); - } - return $retour; - } - - - - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("couche_id", "IgoCouche", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_classe_id_seq'; - } - -} diff --git a/pilotage/app/models/IgoClasseEntite.php b/pilotage/app/models/IgoClasseEntite.php deleted file mode 100644 index 16596e0a..00000000 --- a/pilotage/app/models/IgoClasseEntite.php +++ /dev/null @@ -1,150 +0,0 @@ -IgoGeometrie as $geometrie){ - $geometrie->delete(); - } - - return parent::delete(); - } - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoGeometrie", "classe_entite_id", array( - 'reusable' => true - )); - $this->belongsTo("catalogue_csw_id", "IgoCatalogueCsw", "id", array( - 'reusable' => true - )); - $this->belongsTo("classification_id", "IgoClassification", "id", array( - 'reusable' => true - )); - $this->belongsTo("contact_id", "IgoContact", "id", array( - 'reusable' => true - )); - $this->belongsTo("organisme_responsable_id", "IgoOrganismeResponsable", "id", array( - 'reusable' => true - )); - $this->belongsTo("source_entite_id", "IgoSourceEntite", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 200, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Description dd', - 'field' => 'description', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Remarque', - 'field' => 'remarque', - 'max' => 2000, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_classe_entite_id_seq'; - } - -} diff --git a/pilotage/app/models/IgoClassification.php b/pilotage/app/models/IgoClassification.php deleted file mode 100644 index b508afcc..00000000 --- a/pilotage/app/models/IgoClassification.php +++ /dev/null @@ -1,92 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoClasseEntite", "classification_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Description cc', - 'field' => 'description', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Code GeoNetwork', - 'field' => 'code_geonetwork', - 'max' => 50, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoConnexion.php b/pilotage/app/models/IgoConnexion.php deleted file mode 100644 index 2953066a..00000000 --- a/pilotage/app/models/IgoConnexion.php +++ /dev/null @@ -1,101 +0,0 @@ -IgoGeometrie->acces=="L"){ - foreach ($this->IgoGeometrie->IgoCouche as $couche){ - $couche->saveMapFile(); - } - } - return $retour; - } - - - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("connexion_type_id", "IgoConnexionType", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 50, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Connexion', - 'field' => 'connexion', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'connexion_type_id', - 'message' => 'Vous devez choisir le type de connexion.' - ))); - - return !$this->validationHasFailed(); - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_connexion_id_seq'; - } - -} diff --git a/pilotage/app/models/IgoConnexionType.php b/pilotage/app/models/IgoConnexionType.php deleted file mode 100644 index 854e51ad..00000000 --- a/pilotage/app/models/IgoConnexionType.php +++ /dev/null @@ -1,93 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoConnexion", "connexion_type_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 50, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Code LayerType??', - 'field' => 'connexion_type', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new Regex(array( - 'field' => 'geometrie_type', - 'pattern' => '/^[A-Z]$/', - 'message' => 'Vous devez choisir le type de géométrie.' - ))); - - - return !$this->validationHasFailed(); - } - - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_connexion_type_id_seq'; - } -} diff --git a/pilotage/app/models/IgoContact.php b/pilotage/app/models/IgoContact.php deleted file mode 100644 index 3bb9d0f1..00000000 --- a/pilotage/app/models/IgoContact.php +++ /dev/null @@ -1,151 +0,0 @@ -nom.", ".$this->prenom; - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoClasseEntite", "contact_id", NULL); - $this->hasMany("id", "IgoOrganismeResponsable", "contact_id", NULL); - $this->belongsTo("organisme_responsable_id", "IgoOrganismeResponsable", "id", NULL); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'prenom', - 'message' => 'Veuillez indiquer le prénom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Prénom', - 'field' => 'prenom', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Poste occupé', - 'field' => 'poste', - 'max' => 70, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Téléphone', - 'field' => 'no_telephone', - 'max' => 30, - 'min' => 0 - ))); - - if($this->courriel){ - - $this->validate(new IgoStringLength(array( - 'label' => 'Courriel', - 'field' => 'courriel', - 'max' => 100, - 'min' => 0 - ))); - - $this->validate(new EmailValidator(array( - 'field' => 'courriel' - ))); - - } - - $this->validate(new IgoStringLength(array( - 'label' => 'Remarque', - 'field' => 'remarque', - 'max' => 2000, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoContexte.php b/pilotage/app/models/IgoContexte.php deleted file mode 100644 index 0a9faadc..00000000 --- a/pilotage/app/models/IgoContexte.php +++ /dev/null @@ -1,330 +0,0 @@ -validationHasFailed(); - } - - - function getMapFile() { - - $contexteController= new IgoContexteController(); - $vue=$contexteController->view; - - $contexteController->mapfileAction($this->id); - $vue->preview = false; - $contenuMapfile = $vue->getRender('igo_contexte', 'mapfile', null, function($view) { - $view->setRenderLevel(Phalcon\Mvc\View::LEVEL_ACTION_VIEW); - }); - $vue->setRenderLevel(Phalcon\Mvc\View::LEVEL_MAIN_LAYOUT); - return $contenuMapfile; - } - - - public function save($saveMapFile = true, $data = NULL, $whiteList = NULL){ - $retour=parent::save($data, $whiteList); - if($saveMapFile && $retour){ - $this->saveMapFile(); - } - return $retour; - } - - public function saveMapFile(){ - $cacheMapfileDir = $this->getDI()->getConfig()->mapserver->mapfileCacheDir; - $contextesCacheDir = $this->getDI()->getConfig()->mapserver->contextesCacheDir; - $contenuMapfile = $this->getMapFile(); - $dir = $cacheMapfileDir . $contextesCacheDir; - if (!file_exists($dir) && !is_dir($dir)) { - mkdir($dir); - } - - $cle = $dir . $this->code .".map"; - if(!(is_writable($dir) || (file_exists($cle) && !is_writable($cle)))){ - - echo("Impossible d'écrire le fichier $cle"); - return; - } - - $contenuMapfile = utf8_decode($contenuMapfile); - - file_put_contents($cle, $contenuMapfile); - } - - - public function delete(){ - foreach ($this->IgoCoucheContexte as $groupe){ - $groupe->delete(); - } - return parent::delete(); - } - - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoCoucheContexte", "contexte_id", array( - 'reusable' => true - )); - - $this->hasMany("id", "IgoVueContexteCoucheNavigateur", "contexte_id", array( - 'reusable' => true - )); - - $this->belongsTo("profil_proprietaire_id", "IgoProfil", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_contexte_id_seq'; - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'code', - 'message' => 'Veuillez spécifier le code.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'mf_map_projection', - 'message' => 'Veuillez spécifier la projection.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'mf_map_meta_onlineresource', - 'message' => 'Veuillez spécifier un Online Resource.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 100, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Code', - 'field' => 'code', - 'max' => 100, - 'min' => 0 - ))); - - if($this->code){ - - $this->validate(new Phalcon\Mvc\Model\Validator\Uniqueness(array( - "field" => "code", - "message" => "Le code doit être unique." - ))); - - $this->validate(new Regex(array( - 'field' => 'code', - 'pattern' => '/^[A-Z0-9]{1,}$/i', - 'message' => 'Le code peut seulement contenir les caractères suivants : a-z, 0-9.' - ))); - } - - $this->validate(new IgoStringLength(array( - 'label' => 'Description', - 'field' => 'description', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new Regex(array( - 'field' => 'mode', - 'pattern' => '/^(l|p)$/', - 'message' => 'Vous devez choisir un mode.' - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Position', - 'field' => 'position', - 'max' => 50, - 'min' => 0 - ))); - - if($this->zoom){ - $this->validate(new Regex(array( - 'field' => 'zoom', - 'pattern' => '/^1?[0-9]([,.][0-9]{0,2})?$/', - 'message' => 'Zoom est invalide.' - ))); - } - - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Map Def', - 'field' => 'mf_map_def', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Projection', - 'field' => 'mf_map_projection', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'OnlineResource', - 'field' => 'mf_map_meta_onlineresource', - 'max' => 1000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'JSON', - 'field' => 'json', - 'max' => 2000, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - } - - - public static function remplacerCodeDansOnlineResource($onlineResource, $ancien, $nouveau){ - //Trouver où est la dernière occurence - $position = strpos($onlineResource, $ancien); - - //On n'a pas trouvé - if(false === $position){ - return $onlineResource; - } - - return substr_replace($onlineResource, $nouveau, $position, strlen($ancien)); - - } - /** - * Créé une copie d'un contexte et de ses dépendances (igo_couche_contexte) - * @param int $idContexteCible Id du contexte où va la copie - */ - public function dupliquer($idContexteCible){ - - //Créer les associations couche/contexte - $igoCoucheContextes = $this->IgoCoucheContexte; - $nbCoucheContexte = 0; - foreach($igoCoucheContextes as $igoCoucheContexte){ - - $nbCoucheContexte++; - - $igoCoucheContexte->dupliquer($idContexteCible); - - } - - } - -} diff --git a/pilotage/app/models/IgoCouche.php b/pilotage/app/models/IgoCouche.php deleted file mode 100644 index f414097c..00000000 --- a/pilotage/app/models/IgoCouche.php +++ /dev/null @@ -1,681 +0,0 @@ -mf_class_z_order > $b->mf_class_z_order; -} - -class IgoCouche extends \Phalcon\Mvc\Model { - - public $id; - public $description; - public $geometrie_id; - public $est_commune; - public $est_publique; - public $vue_validation; - public $mf_layer_name; - public $mf_layer_group; - public $mf_layer_meta_name; - public $mf_layer_meta_group_title; - public $mf_layer_meta_title; - public $mf_layer_filtre; - public $mf_layer_minscale_denom; - public $mf_layer_maxscale_denom; - public $mf_layer_labelitem; - public $mf_layer_labelminscale_denom; - public $mf_layer_labelmaxscale_denom; - public $mf_layer_opacity; - public $mf_layer_meta_z_order; - public $layer_a_order; - public $mf_layer_def; - public $mf_layer_meta_def; - public $service_tuile; - public $fiche_csw_id; - public $mf_layer_meta_wfs_max_feature; - public $est_fond_de_carte; - public $date_modif; - public $max_zoom_level; - public $min_zoom_level; - public $mf_layer_meta_attribution_title; - - function getMapFile() { - - $coucheController = new IgoCoucheController(); - $vue = $coucheController->view; - - $mapfileInclude = ''; - $config = $this->getDI()->getConfig(); - if(isset($config->mapserver->mapfileInclude)){ - foreach($config->mapserver->mapfileInclude as $chemin){ - $mapfileInclude .= $this->fopen_file_get_contents($chemin); - } - } - $vue->mapfileInclude = $mapfileInclude; - - $vue->preview = false; - $vue->couche = $this->getMapFileArray(); - $vue->setRenderLevel(Phalcon\Mvc\View::LEVEL_LAYOUT); - $vue->start(); - $vue->render('gestion_couche', 'mapfile'); //Pass a controller/action as parameters if required - $vue->finish(); - - $contenuMapfile = $vue->getContent(); - - $vue->setRenderLevel(Phalcon\Mvc\View::LEVEL_MAIN_LAYOUT); - - return $contenuMapfile; - } - - public function saveContextesMapFile() { - foreach ($this->IgoVueContexteCoucheNavigateur as $couchecontexte) { - $couchecontexte->IgoContexte->saveMapFile(); - } - } - - public function saveMapFile($saveContexte = true) { - - $cacheMapfileDir = $this->getDI()->getConfig()->mapserver->mapfileCacheDir; - $contenuMapfile = $this->getMapFile(); - $couchesCacheDir = $this->getDI()->getConfig()->mapserver->couchesCacheDir; - - $dir = $cacheMapfileDir . $couchesCacheDir; - if (!file_exists($dir) && !is_dir($dir)) { - mkdir($dir); - } - - $cle = $dir . $this->mf_layer_name . ".map"; - - file_put_contents($cle, $contenuMapfile); - if ($saveContexte) { - $this->saveContextesMapFile(); - } - } - - public function save($saveMapFile = true, $data = NULL, $whiteList = NULL) { - - $retour = parent::save($data, $whiteList); - if ($saveMapFile && $this->IgoGeometrie->acces == "L") { - $this->saveMapFile(); - } - return $retour; - } - - public function delete() { - foreach ($this->IgoCoucheContexte as $groupe) { - $groupe->delete(); - } - foreach ($this->IgoPermission as $permission) { - $permission->delete(); - } - foreach ($this->IgoClasse as $classe) { - $classe->delete(); - } - return parent::delete(); - } - - public function include_items($igo_profil) { - $include_list = ""; - if ($this->IgoGeometrie->ind_inclusion == "I") { - foreach ($this->IgoGeometrie->IgoAttribut as $value) { - if ($value->est_inclu) { - $include_list = $include_list . ', "' . $value->colonne . '"'; - } - } - } - if ($include_list <> "") { - - $include_list = substr($include_list, 1); - } else { - $include_list = '"all"'; - } - - return '"gml_include_items" ' . $include_list; - } - - public function exclude_items($igo_contexte, $igo_profil) { - - $exclude_list = ""; - - if ($this->IgoGeometrie->ind_inclusion == "E") { - foreach ($this->IgoGeometrie->IgoAttribut as $value) { - if (!$value->est_inclu) { - $exclude_list = $exclude_list . ', ' . $value->colonne; - } - } - } - $igo_couche_contexte = IgoCoucheContexte::find("couche_id=" . $this->id . "and contexte_id=" . $igo_contexte->id . "and est_exclu"); - - - foreach ($igo_couche_contexte as $value) { - $exclude_list = $exclude_list . ', ' . $value->IgoAttribut->colonne; - } - - if ($igo_profil && (isset($igo_profil->id))) { - - $igo_permission = IgoPermission::find("couche_id=" . $this->id . "and profil_id=" . $igo_profil->id . "and est_exclu"); - foreach ($igo_permission as $value) { - $exclude_list = $exclude_list . ', ' . $value->IgoAttribut->colonne; - } - } - - if ($exclude_list <> "") { - $exclude_list = substr($exclude_list, 2); - return '"gml_exclude_items" "' . $exclude_list . '"'; - } else - return ''; - } - - public function mf_layer_filter($igo_profil) { - - if (!$igo_profil || (!isset($igo_profil->id))) { - return $this->mf_layer_filtre; - } - - $filtre = ""; - - $igo_permission = $this->getPermissionProfil($igo_profil->id); - foreach ($igo_permission as $value) { - if (!is_null($value["mf_layer_filtre"]) && trim($value["mf_layer_filtre"]) <> "") { - if ($filtre <> "") { - if ((strpos($filtre, " " . $value["mf_layer_filtre"] . " ") == 0) && $value["mf_layer_filtre"] <> $this->mf_layer_filtre) { - $filtre = $filtre . "or " . $value["mf_layer_filtre"] . " "; - } - } else { - $filtre = $value["mf_layer_filtre"] . " "; - } - } - } - - if (strpos($filtre, " or ") > 0) { - $filtre = "(" . $filtre . ")"; - } - - if (!is_null($filtre) && trim($filtre) <> "" and !is_null($this->mf_layer_filtre) && trim($this->mf_layer_filtre) <> "") { - $filtre = $filtre . ' and '; - } - $filtre = $filtre . $this->mf_layer_filtre; - - return $filtre; - } - - public function getMapfileArray($igo_contexte = null, $igo_profil = null) { - - - $coucheArray = $this->toArray(); - - /** - * Récupération du lien du contexte - */ - // $classe_couchecontexte =null; - if (!is_null($igo_contexte)) { - foreach ($this->IgoCoucheContexte as $couchecontexte) { - if ($couchecontexte->contexte_id == $igo_contexte->id) { - $classe_couchecontexte = $couchecontexte; - } - } - if (!isset($classe_couchecontexte)) { - $groupe = $this->IgoGroupe; - while ($groupe) { - if (!is_null($groupe->IgoCoucheContexte) && isset($groupe->IgoCoucheContexte->contexte_id)) { - //var_dump($groupe->IgoCoucheContexte); - if ($groupe->IgoCoucheContexte->contexte_id == $igo_contexte->id) { - $classe_couchecontexte = $groupe->IgoCoucheContexte; - } - } - $groupe = $groupe->IgoGroupe; - } - } - } - - // C'est pas clean, mais cette fonction est utilisé de différentes facon - /* - if (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_name) != '') { - $coucheArray["mf_layer_name"] = $classe_couchecontexte->mf_layer_name; - } - */ - - //$coucheArray["url"] = $this->IgoGeometrie->IgoClasseEntite->IgoCatalogueCsw->url; - $coucheArray["layer_type"] = $this->IgoGeometrie->IgoGeometrieType->layer_type; - $coucheArray["acces"] = $this->IgoGeometrie->acces; - - $coucheArray["mf_layer_group"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_meta_group_title) != '') ? $classe_couchecontexte->mf_layer_meta_group_title : $this->mf_layer_group; - - // Je ne comprend vraiment pas le pourquoi de $classe_couchecontexte.... - //$coucheArray["est_active"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->est_active) != '') ? $classe_couchecontexte->est_active : $this->est_active; - //$coucheArray["est_visible"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->est_visible) != '') ? $classe_couchecontexte->est_visible : $this->est_visible; - - - if ($coucheArray["mf_layer_group"] == "") { - //TODO Écraser avec le getNom de la couche - } - - if (isset($this->mf_layer_meta_wfs_max_feature)) { - $coucheArray["wfs_maxfeatures"] = '"wfs_maxfeatures" "' . $this->mf_layer_meta_wfs_max_feature . '"'; - } else { - $coucheArray["wfs_maxfeatures"] = ""; - } - - - if (isset($this->IgoGeometrie->IgoConnexion) && $this->IgoGeometrie->IgoConnexion != null) { - $coucheArray["connexion_type"] = $this->IgoGeometrie->IgoConnexion->IgoConnexionType->nom; - $coucheArray["connexion"] = str_replace("\n", "\n\t\t", ltrim($this->IgoGeometrie->IgoConnexion->connexion)); - } - - foreach ($this->IgoGeometrie->IgoAttribut as $attribut) { - if ($attribut->est_geometrie) { - $attribut_colonne = $attribut->colonne; - } - if ($attribut->est_cle) { - $attribut_unique = $attribut->colonne; - } - } - - $coucheArray["mf_layer_data"] = $this->IgoGeometrie->mf_layer_data; - if (isset($attribut_colonne)) { - $coucheArray["mf_layer_data"] = $attribut_colonne . " from " . $this->IgoGeometrie->vue_defaut . " using " . ((isset($attribut_unique)) ? " unique " . $attribut_unique : "") . " srid=" . $this->IgoGeometrie->mf_layer_projection; - } - - if (!is_null($igo_profil)) { - - $coucheArray["mf_layer_filter"] = $this->mf_layer_filter($igo_profil); - } else { - $coucheArray["mf_layer_filter"] = $this->mf_layer_filtre; - } - - $mf_layer_projection = trim($this->IgoGeometrie->mf_layer_projection); - - //On a une projection EPSG - if (is_numeric($mf_layer_projection)) { - // $mf_layer_projection = "\"init=epsg:" . $mf_layer_projection . "\""; - - //On a une projection avec des paramètres "inline" - } else if ($mf_layer_projection) { - - $mf_layer_projection = str_replace('" ', '\n ', $mf_layer_projection); - $mf_layer_projection = str_replace('"', "\t\t\t", $mf_layer_projection); - - } - $coucheArray["mf_layer_projection"] = $mf_layer_projection; - - - $coucheArray["wms_group_title"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_meta_group_title) != '') ? $classe_couchecontexte->mf_layer_meta_group_title : (isset($this->mf_layer_meta_group_title) && trim($this->mf_layer_meta_group_title) != '') ? $this->mf_layer_meta_group_title : ($this->IgoGroupe ? $this->IgoGroupe->getNomComplet() : ""); - $coucheArray["wms_group_title"] = trim($coucheArray["wms_group_title"], "/"); - - //$coucheArray["wms_name"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_meta_name) != '') ? $classe_couchecontexte->mf_layer_meta_name : $this->mf_layer_name; - $coucheArray["wms_name"] = $this->mf_layer_meta_name; - $coucheArray["mf_layer_name"] = $this->mf_layer_name; - $coucheArray["wms_title"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_meta_title) != '') ? $classe_couchecontexte->mf_layer_meta_title : $this->mf_layer_meta_title; - - if (isset($this->est_fond_de_carte) && $this->est_fond_de_carte) { - $coucheArray["mf_layer_meta_z_order"] = 0; - } else { - $coucheArray["mf_layer_meta_z_order"] = (isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_meta_z_order) != '') ? $classe_couchecontexte->mf_layer_meta_z_order : ((trim($this->mf_layer_meta_z_order) != '') ? $this->mf_layer_meta_z_order : $this->IgoGeometrie->IgoGeometrieType->mf_layer_meta_z_order); - } - - - - $coucheArray["mf_layer_meta_def"] = str_replace("\n", "\n\t\t\t", ltrim($this->mf_layer_meta_def)); - - if (!is_null($igo_profil)) { - $coucheArray["include_items"] = $this->include_items($igo_profil); - $coucheArray["exclude_items"] = $this->exclude_items($igo_contexte, $igo_profil); - }else{ - $coucheArray["include_items"] = ''; - $coucheArray["exclude_items"] = ''; - } - - $classes = $this->IgoClasse; - $classes = iterator_to_array($classes); - usort($classes, "ordre_z"); - $coucheArray["mf_layer_class_def"] = ""; - foreach ($classes as $classe) { - $coucheArray["mf_layer_class_def"] = $coucheArray["mf_layer_class_def"] . "\n" . - ((isset($classe_couchecontexte) && trim($classe_couchecontexte->mf_layer_class_def) != '') ? str_replace("\n", "\n\t\t", "\t\t" . ltrim($classe_couchecontexte->mf_layer_class_def)) : str_replace("\n", "\n\t\t", "\t\t" . ltrim($classe->mf_class_def))); - } - return $coucheArray; - } - - public function getPermissionProfil($profil_id) { - $igo_permission = IgoPermission::find("couche_id=" . $this->id . "and profil_id=" . $profil_id)->toArray(); - - $groupe = $this->IgoGroupe; - while ($groupe) { - $igo_permission = array_merge($igo_permission, IgoPermission::find("groupe_id=" . $groupe->id . "and profil_id=" . $profil_id)->toArray()); - $groupe = $groupe->IgoGroupe; - } - return $igo_permission; - } - - public function getCouche($profil_id = null, $utilisateur_id = null) { - if ((is_null($profil_id) || trim($profil_id) == "") && (is_null($utilisateur_id) || trim($utilisateur_id) == "")) { - $sql = " SELECT c.*, true as est_visible, false as est_active, true as est_lecture, true as est_ecriture, true as est_analyse, true as est_export" . - " FROM igo_couche c where c.id={$this->id}; "; - } else if (!is_null($profil_id) && trim($profil_id) <> "") { - $sql = "SELECT c.*, true as est_visible, false as est_active,est_lecture or est_publique as est_lecture, est_ecriture, est_analyse, est_export" - . " FROM igo_couche c LEFT JOIN igo_permission p ON c.id=p.couche_id and p.profil_id=" . $profil_id . " where c.id={$this->id} "; - } else { - - $sql = " SELECT c.*, est_visible, est_active, est_lecture or est_publique as est_lecture, est_ecriture, est_analyse, est_export" - . " FROM igo_couche c LEFT JOIN igo_permission p, igo_utilisateur_profil up ON c.id=p.couche_id and and p.profil_id=up.profil_id and up.utilisateur_id=" . $utilisateur_id . "" - . " where c.id={$this->id}"; - } - - $igo_couche = new IgoCouche(); - $igo_couche = new Resultset(null, $igo_couche, $igo_couche->getReadConnection()->query($sql)); - - return $igo_couche; - } - - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoCoucheContexte", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoVueContexteCoucheNavigateur", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoPermission", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoClasse", "couche_id", array( - 'reusable' => true - )); - $this->belongsTo("geometrie_id", "IgoGeometrie", "id", array( - 'reusable' => true - )); - $this->belongsTo("groupe_couche_id", "IgoGroupeCouche", "id", array( - 'reusable' => true - )); - - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'geometrie_id', - 'message' => 'Veuillez sélectionner une géométrie.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Description', - 'field' => 'description', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'mf_layer_name', - 'message' => 'Veuillez indiquer le nom de code.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom de code', - 'field' => 'mf_layer_name', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Titre', - 'field' => 'mf_layer_meta_title', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Code de groupe', - 'field' => 'mf_layer_group', - 'max' => 300, - 'min' => 0 - ))); - - //mf_layer_meta_title peut ne pas être unique... - - $this->validate(new PresenceOf(array( - 'field' => 'mf_layer_meta_title', - 'message' => 'Veuillez indiquer le titre.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Titre', - 'field' => 'mf_layer_meta_title', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Code de groupe', - 'field' => 'mf_layer_group', - 'max' => 300, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'mf_layer_meta_name', - 'field' => 'mf_layer_meta_name', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Condition d\'affichage', - 'field' => 'mf_layer_filtre', - 'max' => 1000, - 'min' => 0 - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Ordre Z', - 'field' => 'mf_layer_meta_z_order' - ))); - - - $this->validate(new IgoEntier(array( - 'label' => 'Échelle minimale d\'affichage', - 'field' => 'mf_layer_minscale_denom' - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Échelle maximale d\'affichage', - 'field' => 'mf_layer_maxscale_denom' - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Échelle minimale d\'affichage des étiquettes', - 'field' => 'mf_layer_labelminscale_denom' - ))); - $this->validate(new IgoEntier(array( - 'label' => 'Échelle maximale d\'affichage des étiquettes', - 'field' => 'mf_layer_labelmaxscale_denom' - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Opacité', - 'field' => 'mf_layer_opacity' - ))); - $this->validate(new IgoEntier(array( - 'label' => 'Nombre maximale d\'éléments WFS', - 'field' => 'mf_layer_meta_wfs_max_feature' - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Of Layer Of Meta Of Def', - 'field' => 'mf_layer_meta_def', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Of Layer Of Def', - 'field' => 'mf_layer_def', - 'max' => 2000, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Service de tuile', - 'field' => 'service_tuile', - 'max' => 500, - 'min' => 0 - ))); - - //TODO utiliser un regex - $this->validate(new IgoStringLength(array( - 'label' => 'Id de fiche de métadonnées (catalogue CSW)', - 'field' => 'fiche_csw_id', - 'max' => 50, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Hiérarchie et/ou titre du groupe(obligatoire si on a un code de groupe)', - 'field' => 'mf_layer_meta_group_title', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom de l\'attribut d\'affichage des étiquettes', - 'field' => 'mf_layer_labelitem', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'mf_layer_meta_name', - 'field' => 'print_option_url', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'mf_layer_meta_name', - 'field' => 'print_option_layer_name', - 'max' => 100, - 'min' => 0 - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Niveau de zoom maximum', - 'field' => 'max_zoom_level' - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Niveau de zoom minimum', - 'field' => 'min_zoom_level' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Attribution', - 'field' => 'mf_layer_meta_attribution_title', - 'max' => 5000, - 'min' => 0 - ))); - - if($this->max_zoom_level < $this->min_zoom_level){ - $this->appendMessage( - new Phalcon\Mvc\Model\Message('Veuillez vérifier les minimums et maximums de niveau de zoom.
    ' - . 'Le maximum doit être plus grand que le minimum', '') - ); - } - // var_dump($this->validationHasFailed());die; - return !$this->validationHasFailed(); - } - - public function validation() { - - $validation = new Phalcon\Validation(); -//echo "test";die; - $validation->setFilters('mf_layer_name', 'trim'); - $validation->setFilters('mf_layer_meta_title', 'trim'); - $validation->setFilters('mf_layer_group', 'trim'); - $validation->setFilters('mf_layer_meta_group_title', 'trim'); - $validation->setFilters('fiche_csw_id', 'trim'); - $validation->setFilters('mf_class_def', 'trim'); - $validation->setFilters('mf_layer_labelitem', 'trim'); - $validation->setFilters('mf_layer_def', 'trim'); - $validation->setFilters('mf_layer_meta_def', 'trim'); - $validation->setFilters('mf_layer_filtre', 'trim'); - $validation->setFilters('vue_validation', 'trim'); - $validation->setFilters('description', 'trim'); - - - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema . '.igo_couche_id_seq'; - } - - //TODO Rendre cette fonctionalité disponible pour tous les models - public static function findByRawSql($conditions, $params=null){ - // A raw SQL statement - $sql = "SELECT * FROM igo_couche WHERE $conditions"; - - // Base model - $igoCouche = new IgoCouche(); - - // Execute the query - return new Phalcon\Mvc\Model\Resultset\Simple(null, $igoCouche, $igoCouche->getReadConnection()->query($sql, $params)); - } - - /** - * Retourne toutes les couches associables - */ - public static function findEstAssociable($params = null) { - - $profils = \Phalcon\DI::getDefault()->getSession()->get("info_utilisateur")->profils; - $profil_ids = array(); - - foreach($profils as $profil) { - array_push($profil_ids, $profil["id"]); - } - - $profil_ids = implode(",", $profil_ids); - $sql = "SELECT DISTINCT igo_vue_permissions_pour_couches.couche_id AS id, igo_couche.mf_layer_name AS nom " - ." FROM igo_vue_permissions_pour_couches " - ." INNER JOIN igo_groupe_couche ON igo_groupe_couche.id = igo_vue_permissions_pour_couches.couche_id " - ." INNER JOIN igo_couche ON igo_couche.id = igo_groupe_couche.couche_id " - ." WHERE igo_vue_permissions_pour_couches.profil_id IN ({$profil_ids}) AND igo_vue_permissions_pour_couches.est_association"; - $igo_couche = new IgoCouche(); - - return new \Phalcon\Mvc\Model\Resultset\Simple(null, - $igo_couche, - $igo_couche->getReadConnection()->query($sql, $params)); - } - - public function fopen_file_get_contents($cheminFichier) { - $contenu = ''; - $handle = fopen($cheminFichier, 'r'); - if ($handle) { - $contenu = fread($handle, filesize($cheminFichier)); - } - return $contenu; - } - -} diff --git a/pilotage/app/models/IgoCoucheContexte.php b/pilotage/app/models/IgoCoucheContexte.php deleted file mode 100644 index 05f7a56d..00000000 --- a/pilotage/app/models/IgoCoucheContexte.php +++ /dev/null @@ -1,210 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("contexte_id", "IgoContexte", "id", array( - 'reusable' => true - )); - $this->belongsTo("couche_id", "IgoCouche", "id", array( - 'reusable' => true - )); - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - $this->belongsTo("attribut_id", "IgoAttribut", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function onConstruct(){ - - $this->est_active = false; - $this->est_visible = false; - $this->est_exclu = false; - - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' =>'contexte_id', - 'message' => 'Veuillez indiquer le contexte.' - ))); - - if(!$this->groupe_id){ - //$this->appendMessage(new Phalcon\Mvc\Model\Message('Veuillez sélectionner un groupe de couche.', '')); - } - - $this->validate(new Regex(array( - 'field' => 'ind_fond_de_carte', - 'pattern' => '/^[D|O|N]$/', - 'message' => 'Sélectionner l\'indicateur de fond de carte' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Layer Meta Name', - 'field' => 'mf_layer_meta_name', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Layer Meta Title', - 'field' => 'mf_layer_meta_title', - 'max' => 150, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Layer Meta Group Title', - 'field' => 'mf_layer_meta_group_title', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Layer Class Def', - 'field' => 'mf_layer_class_def', - 'max' => 500, - 'min' => 0 - ))); - /* - if($this->layer_a_order){ - $this->validate(new Regex(array( - 'field' => 'layer_a_order', - 'pattern' => '/^[A-Z]$/', - 'message' => 'Veuillez indiquer l\'Ordre A' - ))); - } -*/ - $this->validate(new IgoEntier(array( - 'label' => 'Ordre A', - 'field' => 'layer_a_order' - ))); - - $this->validate(new IgoEntier(array( - 'label' => 'Ordre Z', - 'field' => 'mf_layer_meta_z_order' - ))); - - //On soit choisir une couche ou un groupe de couche - return !$this->validationHasFailed(); - - } - - - public function validation(){ - - $this->validate(new Uniqueness(array( - "field" => ['couche_id','contexte_id', 'attribut_id'], - "message" => "La combinaison profil et couche doit être unique" - ))); - - - return !$this->validationHasFailed(); - - } - - public function beforeCreate(){ - /* - //Initialiser les valeurs par défaut - if(!isset($this->est_active)){ - $this->est_active = false; - } - - if(!isset($this->est_visible)){ - $this->est_visible = false; - } - - if(!isset($this->est_exclu)){ - $this->est_exclu = false; - } - * - */ - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_couche_contexte_id_seq'; - } - - /** - * Créé une copie d'une association igo_couche_contexte - * @param int $contexte_id Id de contexte à associer au igo_couche_contexte - * return IgoCoucheContexte|bool Le IgoCoucheContexte, false en cas d'erreur - */ - public function dupliquer($contexte_id = false){ - // error_log("Début IgoCoucheContexte->dupliquer()"); - $igoNouveauCoucheContexte = new IgoCoucheContexte(); - - - $igoNouveauCoucheContexte->contexte_id = $contexte_id ? $contexte_id : $this->contexte_id; - $igoNouveauCoucheContexte->couche_id = $this->couche_id; - $igoNouveauCoucheContexte->groupe_id = $this->groupe_id; - $igoNouveauCoucheContexte->arbre_id = $this->arbre_id; - $igoNouveauCoucheContexte->attribut_id = $this->attribut_id; - $igoNouveauCoucheContexte->est_visible = $this->est_visible; - $igoNouveauCoucheContexte->est_active = $this->est_active; - $igoNouveauCoucheContexte->est_exclu = $this->est_exclu; - $igoNouveauCoucheContexte->ind_fond_de_carte = $this->ind_fond_de_carte; - $igoNouveauCoucheContexte->mf_layer_meta_name = $this->mf_layer_meta_name; - $igoNouveauCoucheContexte->mf_layer_meta_title = $this->mf_layer_meta_title; - $igoNouveauCoucheContexte->mf_layer_meta_group_title = $this->mf_layer_meta_group_title; - $igoNouveauCoucheContexte->mf_layer_meta_z_order = $this->mf_layer_meta_z_order; - $igoNouveauCoucheContexte->layer_a_order = $this->layer_a_order; - $igoNouveauCoucheContexte->mf_layer_class_def = $this->mf_layer_class_def; - $igoNouveauCoucheContexte->date_modif = $this->date_modif; - - if(!$igoNouveauCoucheContexte->save()){ - $flash = $this->getDI()->getFlash(); - foreach ($igoNouveauCoucheContexte->getMessages() as $message) { - $flash->error($message); - } - return false; - } - - // error_log("Fin IgoCoucheContexte->dupliquer()"); - return $igoNouveauCoucheContexte; - - } -} \ No newline at end of file diff --git a/pilotage/app/models/IgoGeometrie.php b/pilotage/app/models/IgoGeometrie.php deleted file mode 100644 index 535827b7..00000000 --- a/pilotage/app/models/IgoGeometrie.php +++ /dev/null @@ -1,229 +0,0 @@ -acces=="L"){ - foreach ($this->IgoCouche as $couche){ - $couche->saveMapFile(); - } - } - return $retour; - } - - - public function delete(){ - foreach ($this->IgoCouche as $couche){ - $couche->delete(); - } - foreach ($this->IgoAttribut as $attribut){ - $attribut->delete(); - } - return parent::delete(); - } - /** - * Initialize method for model. - */ - public function initialize() { - - $this->setSchema($this->getDI()->getConfig()->database->schema); - - $this->hasMany("id", "IgoAttribut", "geometrie_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoCouche", "geometrie_id", array( - 'reusable' => true - )); - $this->belongsTo("classe_entite_id", "IgoClasseEntite", "id", array( - 'reusable' => true - )); - $this->belongsTo("connexion_id", "IgoConnexion", "id", array( - 'reusable' => true - )); - - $this->belongsTo("geometrie_type_id", "IgoGeometrieType", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'classe_entite_id', - 'message' => 'Vous devez choisir une classe d\'entiée.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'geometrie_type_id', - 'message' => 'Vous devez choisir un type de géométrie.' - ))); - - $this->validate(new Regex(array( - 'field' => 'acces', - 'pattern' => '/^[D|L]$/', - 'message' => 'Vous devez choisir le point d\'accès.' - ))); - - /* Cette validation fait échouer la rétro... Trouver une meilleure validation... - if(self::ACCES_LOCAL == $this->acces){ - - $this->validate(new IgoStringLength(array( - 'field' => 'mf_layer_projection', - 'max' => 200, - 'min' => 1, - 'messageMaximum' => 'Le champ projectin doit faire 200 caractères au maximum.', - 'messageMinimum' => 'Vous devez spécifier la projection.' - ))); - - } - */ - - $this->validate(new IgoStringLength(array( - 'label' => 'Projection', - 'field' => 'mf_layer_projection', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Vue', - 'field' => 'vue_defaut', - 'max' => 250, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Échelle de production', - 'field' => 'echelle_prod', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Remarque', - 'field' => 'remarque', - 'max' => 2000, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - } - - public function validation(){ - - return !$this->validationHasFailed(); - } - - - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_geometrie_id_seq'; - } - - - -} diff --git a/pilotage/app/models/IgoGeometrieType.php b/pilotage/app/models/IgoGeometrieType.php deleted file mode 100644 index 5f96ce24..00000000 --- a/pilotage/app/models/IgoGeometrieType.php +++ /dev/null @@ -1,102 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoGeometrie", "geometrie_type_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Code LayerType', - 'field' => 'layer_type', - 'max' => 50, - 'min' => 0 - ))); - - $this->validate(new Regex(array( - 'field' => 'geometrie_type', - 'pattern' => '/^[A-Z]$/', - 'message' => 'Vous devez choisir le type de géométrie.' - ))); - - - $this->validate(new IgoEntier(array( - 'label' => 'Ordre Z', - 'field' => 'mf_layer_meta_z_order' - ))); - - return !$this->validationHasFailed(); - - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema.'.igo_geometrie_type_id_seq'; - } -} diff --git a/pilotage/app/models/IgoGroupe.php b/pilotage/app/models/IgoGroupe.php deleted file mode 100644 index 1bb566a7..00000000 --- a/pilotage/app/models/IgoGroupe.php +++ /dev/null @@ -1,251 +0,0 @@ -getReadConnection()->query($sql)); - - return $igo_groupe; - } - - public function getNomComplet($sansexclusion = false) { - if ($sansexclusion) { - - $sql = " WITH RECURSIVE s(id, nom, groupe_id, est_exclu_arbre) AS" - . " ( SELECT id, CAST(nom as VARCHAR(500)) as nom, groupe_id,est_exclu_arbre" - . " FROM igo_groupe" - . " UNION SELECT g.id, " - . " CAST( s.nom||'/'||g.nom as VARCHAR(500))," - . " g.groupe_id, g.est_exclu_arbre FROM igo_groupe g, s, igo_groupe_groupe gg " - . " WHERE s.id = gg.parent_groupe_id and gg.groupe_id= g.id) " - . " SELECT id, last(nom) as nom, last(groupe_id) as groupe_id " - . " FROM s where id=" . $this->id . " group by id ORDER BY nom;"; - } else { - $sql = " WITH RECURSIVE s(id, nom, groupe_id, est_exclu_arbre) AS" - . " ( SELECT id, CAST(nom as VARCHAR(500)) as nom, groupe_id,est_exclu_arbre " - . " FROM igo_groupe" - . " UNION SELECT g.id," - . " CASE WHEN NOT s.est_exclu_arbre AND NOT g.est_exclu_arbre THEN CAST( s.nom||'/'||g.nom as VARCHAR(500))" - . " WHEN s.est_exclu_arbre AND NOT g.est_exclu_arbre THEN CAST(g.nom as VARCHAR(500)) " - . " WHEN NOT s.est_exclu_arbre AND g.est_exclu_arbre THEN CAST(s.nom as VARCHAR(500)) " - . " ELSE CAST('' as VARCHAR(500)) " - . " END, " - . " g.groupe_id, g.est_exclu_arbre FROM igo_groupe g, s, igo_groupe_groupe gg " - . " WHERE s.id = gg.parent_groupe_id and gg.groupe_id= g.id) " - . " SELECT id, last(nom) as nom, last(groupe_id) as groupe_id, bool_or(est_exclu_arbre) " - . " FROM s where id=" . $this->id . " group by id ORDER BY nom;"; - } - $igo_groupe = new IgoGroupe(); - - $igo_groupe = new Resultset(null, $igo_groupe, $igo_groupe->getReadConnection()->query($sql)); - - return $igo_groupe[0]->nom; - } - - public function specifie_parent($groupID) { - - if (is_null($groupID)) { - return; - } - $groupe_groupe = IgoGroupeGroupe::findFirst("groupe_id ={$this->id} and parent_groupe_id={$groupID}"); - if (!$groupe_groupe) { - $groupe_groupe = new IgoGroupeGroupe(); - - $groupe_groupe->groupe_id = $this->id; - $groupe_groupe->parent_groupe_id = $groupID; - if ($groupe_groupe->save() == false) { - foreach ($groupe_groupe->getMessages() as $message) { - throw new Exception($message); - } - } - } - } - - /** - * Initialize method for model. - */ - public function initialize() { - $this->setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoCoucheContexte", "groupe_id", array( - 'reusable' => true - )); - - $this->hasManyToMany( - "id", "IgoGroupeGroupe", "parent_groupe_id", - "groupe_id", "IgoGroupe", "id", array( - 'reusable' => true, - 'alias' => 'enfants' - )); - - $this->hasManyToMany( - "id", "IgoGroupeGroupe", "groupe_id", - "parent_groupe_id", "IgoGroupe", "id", array( - 'reusable' => true, - 'alias' => 'parents' - )); - - $this->hasManyToMany( - "id", "IgoGroupeCouche", "groupe_id", - "couche_id", "IgoCouche", "id", array( - 'reusable' => true, - 'alias' => 'couches' - )); - - - $this->belongsTo("profil_proprietaire_id", "IgoProfil", "id"); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation() { - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 150, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'Description', - 'field' => 'description', - 'max' => 2000, - 'min' => 0 - ))); - - $info_u = $this->getDi()->getSession()->get("info_utilisateur"); - $profils = $this->getDi()->getSession()->get("profils"); - if (!$info_u->estAdmin) { - if (count($profils) == 0) { - $this->appendMessage(new \Phalcon\Mvc\Model\Message("Vous n'avez pas de profils.", '')); - return false; - } - - if (is_null($this->profil_proprietaire_id)) { - $this->appendMessage(new \Phalcon\Mvc\Model\Message("Veuillez indiquer le profil propriétaire.", '')); - return false; - } - } - - return !$this->validationHasFailed(); - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema . '.igo_groupe_id_seq'; - } - - /** - * Récupère le groupe parent le plus haut dans l'arborescence - * @param int $id Id du groupe pour lequel on cherche le parent - */ - public static function getPlusHautParent($id) { - // TODO à reviser puisque plusieurs racines - // - //Récupérer le groupe - $igoGroupe = IgoGroupe::findFirstById($id); - if (!$igoGroupe) { - return false; - } - - //On a trouvé le groupe le plus en haut dans l'arborescence - if (!$igoGroupe->groupe_id) { - return $igoGroupe; - } - - return IgoGroupe::getPlusHautParent($igoGroupe->groupe_id); - } - - public function delete(){ - foreach ($this->IgoCoucheContexte as $groupe){ - $groupe->delete(); - } - return parent::delete(); - } - - // Retourne tous les groupes associables - public static function findEstAssociable($params = null) { - - $profils = \Phalcon\DI::getDefault()->getSession()->get("info_utilisateur")->profils; - $profil_ids = array(); - - foreach ($profils as $profil) { - array_push($profil_ids, $profil["id"]); - } - - $profil_ids = implode(",", $profil_ids); - $sql = "SELECT DISTINCT igo_vue_permissions_pour_groupes.groupe_id AS id, " . - " igo_groupe.nom AS nom " . - "FROM igo_vue_permissions_pour_groupes " . - "INNER JOIN igo_groupe ON igo_groupe.id = igo_vue_permissions_pour_groupes.groupe_id " . - "WHERE igo_vue_permissions_pour_groupes.profil_id IN ($profil_ids) AND igo_vue_permissions_pour_groupes.est_association "; - $igo_groupe = new IgoGroupe(); - - return new \Phalcon\Mvc\Model\Resultset\Simple(null, $igo_groupe, $igo_groupe->getReadConnection()->query($sql, $params)); - } - -} diff --git a/pilotage/app/models/IgoGroupeCouche.php b/pilotage/app/models/IgoGroupeCouche.php deleted file mode 100644 index 75defbbd..00000000 --- a/pilotage/app/models/IgoGroupeCouche.php +++ /dev/null @@ -1,164 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - $this->belongsTo("couche_id", "IgoCouche", "id", array( - 'reusable' => true - )); - - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'groupe_id', - 'message' => 'Veuillez choisir un groupe.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'couche_id', - 'message' => 'Veuillez choisir une couche.' - ))); - - if(!$this->validationHasFailed() && count(IgoGroupeCouche::find("groupe_id=" . $this->groupe_id . "and couche_id=" . $this->couche_id))){ - - $this->appendMessage(new Phalcon\Mvc\Model\Message('Cette association groupe/couche existe déjà' . "groupe_id=" . $this->groupe_id . "and couche_id=" . $this->couche_id, '')); - } - - return !$this->validationHasFailed(); - - } - - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema . '.igo_groupe_couche_id_seq'; - } - - /** - * Enlève d'un groupe les couches, sauf celles spécifiées - * @param string $id_couches Liste des couches à conserver - * @param int $groupe_id - * @param int $profil_id Id du profil propriétaire - */ - public function enleverCouchesDuGroupe($id_couches, $groupe_id, $profil_id){ - - if(!$id_couches){ - $id_couches = 0; - } - - $estAdmin = $this->getDi()->getSession()->get("info_utilisateur")->estAdmin; - if(!$estAdmin){ - - //Récupérer la liste des profils du pilote - $profils = $this->getDi()->getSession()->get("info_utilisateur")->profils; - $liste_profil_id_utilisateur = array(); - foreach($profils as $profil) { - array_push($liste_profil_id_utilisateur, $profil["id"]); - } - - $liste_profil_id_utilisateur = implode(",", $liste_profil_id_utilisateur); - } - - //Récupérer les couches qui sont à enlever du groupe - $igoGroupeCouches = IgoGroupeCouche::find("groupe_id = {$groupe_id} AND couche_id NOT IN ({$id_couches})"); - - foreach($igoGroupeCouches as $igoGroupeCouche){ - - //L'utilisateur n'est pas un pilote - if(!$estAdmin){ - - //Vérifier si l'utilisateur à le droit d'enlever la couche du groupe - $igoVuePermissionsPourCouches = IgoVuePermissionsPourCouches::findFirst("couche_id = {$igoGroupeCouche->couche_id} AND groupe_id = {$groupe_id} AND profil_id IN({$liste_profil_id_utilisateur})"); - - } - - //L'utilisateur a le droit d'enlever la couche du groupe - if($estAdmin || ($igoVuePermissionsPourCouches && $igoVuePermissionsPourCouches->est_association)){ - - //Supprimer les associations de cette couche dans les contextes - $igoCoucheContextes = IgoCoucheContexte::find("groupe_id = {$igoGroupeCouche->id}"); - foreach($igoCoucheContextes as $igoCoucheContexte){ - if(!$igoCoucheContextes->delete()){ - foreach ($igoCoucheContextes->getMessages() as $message) { - $this->flash->error($message); - } - } - - } - - if(!$igoGroupeCouche->delete()){ - foreach ($igoGroupeCouche->getMessages() as $message) { - $this->flash->error($message); - } - } - - } - - } - - } - - /** - * Ajoute au groupe les couches qui n'y sont pas déjà - * @param type $id_couches - * @param type $groupe_id - * @param type $profil_id Profil de l'utilisateur qui pose l'action - */ - public function ajouterCouchesAuGroupe($id_couches, $groupe_id, $profil_id){ - - if(!$id_couches){ - - $id_couches = 0; - } - - //Récupérer les couches qui ne sont pas déjà dans le groupe - $sql = " NOT EXISTS( - SELECT id - FROM igo_groupe_couche AS gc - WHERE igo_couche.id = gc.couche_id - AND groupe_id = {$groupe_id} - AND couche_id IN ({$id_couches}) - ) - AND igo_couche.id IN ({$id_couches})"; - - - $igoCouches = IgoCouche::findByRawSql($sql); - - foreach($igoCouches as $igoCouche){ - - //Ajouter la couche dans le groupe - $igoGroupeCouche = new IgoGroupeCouche(); - $igoGroupeCouche->couche_id = $igoCouche->id; - $igoGroupeCouche->groupe_id = $groupe_id; - if(!$igoGroupeCouche->save()){ - foreach($igoGroupeCouche->getMessages() as $message){ - echo $message; - } - die(); - } - - } - - } - -} diff --git a/pilotage/app/models/IgoGroupeGroupe.php b/pilotage/app/models/IgoGroupeGroupe.php deleted file mode 100644 index 4dfa9d0b..00000000 --- a/pilotage/app/models/IgoGroupeGroupe.php +++ /dev/null @@ -1,46 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true, - 'alias' => 'enfant' - )); - $this->belongsTo("parent_groupe_id", "IgoGroupe", "id", array( - 'reusable' => true, - 'alias' => 'parent' - )); - } - - public function beforeValidation() { - - $this->validate(new PresenceOf(array( - 'field' => 'groupe_id', - 'message' => 'Veuillez choisir un groupe.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'parent_groupe_id', - 'message' => 'Veuillez choisir un groupe.' - ))); - - return !$this->validationHasFailed(); - } - - /** - * This is necessary otherwise phalcon doesn't find the sequence name - */ - public function getSequenceName() { - return $this->getDI()->getConfig()->database->schema . '.igo_groupe_groupe_id_seq'; - } - -} diff --git a/pilotage/app/models/IgoListeValeur.php b/pilotage/app/models/IgoListeValeur.php deleted file mode 100644 index 9d9e9df4..00000000 --- a/pilotage/app/models/IgoListeValeur.php +++ /dev/null @@ -1,48 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoAttribut", "liste_valeur_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoValeur", "liste_valeur_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - -} diff --git a/pilotage/app/models/IgoOrganismeResponsable.php b/pilotage/app/models/IgoOrganismeResponsable.php deleted file mode 100644 index 86f54f8e..00000000 --- a/pilotage/app/models/IgoOrganismeResponsable.php +++ /dev/null @@ -1,129 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoClasseEntite", "organisme_responsable_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoContact", "organisme_responsable_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoSourceEntite", "organisme_responsable_id", array( - 'reusable' => true - )); - $this->belongsTo("contact_id", "IgoContact", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer l\'organisme' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Organisme', - 'field' => 'nom', - 'max' => 100, - 'min' => 0 - ))); - - - $this->validate(new PresenceOf(array( - 'field' => 'acronyme', - 'message' => 'Veuillez indiquer l\'acronyme' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Acronyme', - 'field' => 'acronyme', - 'max' => 10, - 'min' => 0 - ))); - - - $this->validate(new IgoStringLength(array( - 'label' => 'URL', - 'field' => 'url', - 'max' => 500, - 'min' => 0 - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Remarque', - 'field' => 'remarque', - 'max' => 2000, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoPermission.php b/pilotage/app/models/IgoPermission.php deleted file mode 100644 index fca04a37..00000000 --- a/pilotage/app/models/IgoPermission.php +++ /dev/null @@ -1,149 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("couche_id", "IgoCouche", "id", array( - 'reusable' => true - )); - $this->belongsTo("profil_id", "IgoProfil", "id", array( - 'reusable' => true - )); - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - - $this->belongsTo("attribut_id", "IgoAttribut", "id", array( - 'reusable' => true - )); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s', - 'timezone' => 'Canada/Montreal' - ) - ))); - } - - public function onContruct(){ - - $this->est_lecture = false; - $this->est_analyse = false; - $this->est_ecriture = false; - $this->est_export = false; - $this->est_association = false; - $this->est_exclu = false; - - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'profil_id', - 'message' => 'Veuillez indiquer le profil.' - ))); - - if(!$this->couche_id && !$this->groupe_id){ - - $this->appendMessage(new Phalcon\Mvc\Model\Message('Veuillez sélectionner une couche ou un groupe de couche.', '')); - } - - if($this->couche_id && $this->groupe_id){ - - $this->appendMessage(new Phalcon\Mvc\Model\Message('Il faut spécifier une couche ou un groupe de couche, pas les deux!', '')); - } - - $this->validate(new IgoStringLength(array( - 'label' => 'Mf Layer Filtre', - 'field' => 'mf_layer_filtre', - 'max' => 200, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - - public function validation(){ - - //C'est un attribut - if($this->attribut_id){ - $this->validate(new Uniqueness(array( - "field" => ['couche_id','profil_id', 'attribut_id'], - "message" => "La combinaison profil et couche doit être unique" - ))); - - //C'est une couche - }elseif($this->couche_id){ - $this->validate(new Uniqueness(array( - "field" => ['couche_id','profil_id', 'attribut_id'], - "message" => "La combinaison profil et couche doit être unique" - ))); - - //C'est un groupe - }else{ - $this->validate(new Uniqueness(array( - "field" => ['groupe_id','profil_id'], - "message" => "La combinaison profil et groupe doit être unique" - ))); - } - - return !$this->validationHasFailed(); - - } - - public function beforeCreate(){ - /* - //Initialiser les valeurs par défaut - if(!isset($this->est_lecture)){ - $this->est_lecture = false; - } - - - if(!isset($this->est_analyse)){ - $this->est_analyse = false; - } - - if(!isset($this->est_ecriture)){ - $this->est_ecriture = false; - } - - if(!isset($this->est_export)){ - $this->est_export = false; - } - - if(!isset($this->est_association)){ - $this->est_association = false; - } - - if(!isset($this->est_exclu)){ - $this->est_exclu = false; - } - -*/ - } -} diff --git a/pilotage/app/models/IgoProfil.php b/pilotage/app/models/IgoProfil.php deleted file mode 100644 index e99a6298..00000000 --- a/pilotage/app/models/IgoProfil.php +++ /dev/null @@ -1,155 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoPermission", "profil_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoServiceProfil", "profil_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoUtilisateurProfil", "profil_id", array( - 'reusable' => true - )); - - $this->belongsTo("profil_proprietaire_id", "IgoProfil", "id"); - - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'libelle', - 'message' => 'Veuillez indiquer le libellé.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 200, - 'min' => 0 - ))); - - $this->validate(new Uniqueness(array( - "field" => 'nom', - "message" => "Le nom de profil doit être unique." - ))); - - - $info_u = $this->getDi()->getSession()->get("info_utilisateur"); - $profils = $this->getDi()->getSession()->get("profils"); - if(!$info_u->estAdmin) { - if(count($profils) == 0) { - $this->appendMessage(new \Phalcon\Mvc\Model\Message("Vous n'avez pas de profils.", '')); - return false; - } - - if(is_null($this->profil_proprietaire_id)) { - $this->appendMessage(new \Phalcon\Mvc\Model\Message("Veuillez indiquer le profil propriétaire.", '')); - return false; - } - - } - - //On soit choisir une couche ou un groupe de couche - return !$this->validationHasFailed(); - } - - public static function findAllProfils() { - $profils = \Phalcon\DI::getDefault()->getSession()->get("info_utilisateur")->profils; - $profil_ids = array(); - - if(\Phalcon\DI::getDefault()->getSession()->get("info_utilisateur")->estAdmin){ - $sql = "SELECT id, libelle FROM igo_profil"; - }else if( count($profils) > 0){ - foreach($profils as $profil) { - array_push($profil_ids, $profil["id"]); - } - $str = implode(',', $profil_ids); - $sql = "SELECT id, libelle FROM igo_profil WHERE id in ($str)"; - }else{ - $sql = "SELECT id, libelle FROM igo_profil WHERE id is null"; - } - $igo_profils = new IgoProfil(); - - return new \Phalcon\Mvc\Model\Resultset\Simple(null, - $igo_profils, - $igo_profils->getReadConnection()->query($sql) - ); - } - - // Fonction qui retourne tous les sous profils - // Qui ont le profil propriétaire ID correspondant. - public static function findProfilsByProfilsProprietaires() { - $profils = \Phalcon\DI::getDefault()->getSession()->get("info_utilisateur")->profils; - $profils_proprietaires_ids = array(); - - foreach($profils as $profil) { - array_push($profils_proprietaires_ids, $profil["id"]); - } - - $str = implode(',', $profils_proprietaires_ids); - $sql = "SELECT id, libelle FROM igo_profil WHERE profil_proprietaire_id IN ($str)"; - - $igo_profils = new IgoProfil(); - - return new \Phalcon\Mvc\Model\Resultset\Simple(null, - $igo_profils, - $igo_profils->getReadConnection()->query($sql) - ); - } -} \ No newline at end of file diff --git a/pilotage/app/models/IgoService.php b/pilotage/app/models/IgoService.php deleted file mode 100644 index da9f99bf..00000000 --- a/pilotage/app/models/IgoService.php +++ /dev/null @@ -1,70 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoServiceProfil", "service_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $validator->add('profil_id', new PresenceOf(array( - 'message' => 'Veuillez indiquer le profil.' - ))); - - $validator->add('service_id', new PresenceOf(array( - 'message' => 'Veuillez indiquer le service.' - ))); - - return !$this->validationHasFailed(); - - } -} diff --git a/pilotage/app/models/IgoServiceProfil.php b/pilotage/app/models/IgoServiceProfil.php deleted file mode 100644 index d5ea508f..00000000 --- a/pilotage/app/models/IgoServiceProfil.php +++ /dev/null @@ -1,64 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("profil_id", "IgoProfil", "id", array( - 'reusable' => true - )); - $this->belongsTo("service_id", "IgoService", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'profil_id', - 'message' => 'Veuillez indiquer le profil.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'service_id', - 'message' => 'Veuillez indiquer le service.' - ))); - - return !$this->validationHasFailed(); - - } -} diff --git a/pilotage/app/models/IgoSourceEntite.php b/pilotage/app/models/IgoSourceEntite.php deleted file mode 100644 index 48c05823..00000000 --- a/pilotage/app/models/IgoSourceEntite.php +++ /dev/null @@ -1,73 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoClasseEntite", "contact_id", array( - 'reusable' => true - )); - $this->belongsTo("organisme_responsable_id", "IgoOrganismeResponsable", "id"); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'url', - 'message' => 'Veuillez indiquer l\'URL' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'URL', - 'field' => 'url', - 'max' => 500, - 'min' => 0 - ))); - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoUtilisateur.php b/pilotage/app/models/IgoUtilisateur.php deleted file mode 100644 index 0a75a501..00000000 --- a/pilotage/app/models/IgoUtilisateur.php +++ /dev/null @@ -1,93 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoUtilisateurProfil", "utilisateur_id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'nom', - 'message' => 'Veuillez indiquer le nom.' - ))); - - $this->validate(new IgoStringLength(array( - 'label' => 'Nom', - 'field' => 'nom', - 'max' => 50, - 'min' => 0 - ))); - - - $this->validate(new Uniqueness(array( - "field" => 'nom', - "message" => "Le nom doit être unique." - ))); - - if($this->est_admin && $this->est_pilote){ - $this->appendMessage(new Phalcon\Mvc\Model\Message('Un utilisateur ne peut pas être administrateur et pilote.', '')); - } - - return !$this->validationHasFailed(); - - } - -} diff --git a/pilotage/app/models/IgoUtilisateurProfil.php b/pilotage/app/models/IgoUtilisateurProfil.php deleted file mode 100644 index 001edfd8..00000000 --- a/pilotage/app/models/IgoUtilisateurProfil.php +++ /dev/null @@ -1,86 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("profil_id", "IgoProfil", "id", array( - 'reusable' => true - )); - $this->belongsTo("utilisateur_id", "IgoUtilisateur", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - - public function beforeValidation(){ - - $this->validate(new PresenceOf(array( - 'field' => 'profil_id', - 'message' => 'Veuillez indiquer le profil.' - ))); - - $this->validate(new PresenceOf(array( - 'field' => 'utilisateur_id', - 'message' => 'Veuillez indiquer l\'utilisateur' - ))); - - return !$this->validationHasFailed(); - } - - /* - * Fonction retournant les profils de l'utilisateur courant. - * Utile dans les cas de création/édition et affichage filtré. - */ - public static function findProfilsByUser($params = null) { - $di = \Phalcon\DI::getDefault(); - - $utilisateur_id = $di->get("session")->get("info_utilisateur")->id; - - $sql = "SELECT igo_profil.id, igo_profil.libelle FROM igo_utilisateur_profil " - . "INNER JOIN igo_profil ON (igo_profil.id = igo_utilisateur_profil.profil_id) " - . "WHERE igo_utilisateur_profil.utilisateur_id = $utilisateur_id "; - //. "AND (igo_profil.id = igo_utilisateur_profil.profil_id)"; - - $igo_utilisateur_profil = new IgoUtilisateurProfil(); - - return new \Phalcon\Mvc\Model\Resultset\Simple(null, - $igo_utilisateur_profil, - $igo_utilisateur_profil->getReadConnection()->query($sql) - ); - } -} diff --git a/pilotage/app/models/IgoValeur.php b/pilotage/app/models/IgoValeur.php deleted file mode 100644 index 0e583337..00000000 --- a/pilotage/app/models/IgoValeur.php +++ /dev/null @@ -1,57 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->belongsTo("liste_valeur_id", "IgoListeValeur", "id", array( - 'reusable' => true - )); - $this->addBehavior(new Timestampable(array( - 'beforeCreate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ), - 'beforeUpdate' => array( - 'field' => 'date_modif', - 'format' => 'Y-m-d H:i:s' - ) - ))); - } - -} diff --git a/pilotage/app/models/IgoVueContexte.php b/pilotage/app/models/IgoVueContexte.php deleted file mode 100644 index ed91a27a..00000000 --- a/pilotage/app/models/IgoVueContexte.php +++ /dev/null @@ -1,450 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - $this->belongsTo("contexte_id", "IgoContexte", "id", array( - 'reusable' => true - )); - - } - - /** - * Independent Column Mapping. - */ - public function columnMap() - { - return array( - 'contexte_id' => 'contexte_id', - 'id' => 'id', - 'description' => 'description', - 'geometrie_id' => 'geometrie_id', - 'groupe_id' => 'groupe_id', - 'vue_validation' => 'vue_validation', - 'mf_layer_name' => 'mf_layer_name', - 'mf_layer_group' => 'mf_layer_group', - 'mf_layer_meta_name' => 'mf_layer_meta_name', - 'est_visible' => 'est_visible', - 'est_active' => 'est_active', - 'mf_layer_filtre' => 'mf_layer_filtre', - 'mf_layer_minscale_denom' => 'mf_layer_minscale_denom', - 'mf_layer_maxscale_denom' => 'mf_layer_maxscale_denom', - 'mf_layer_labelminscale_denom' => 'mf_layer_labelminscale_denom', - 'mf_layer_labelmaxscale_denom' => 'mf_layer_labelmaxscale_denom', - 'mf_layer_def' => 'mf_layer_def', - 'mf_layer_meta_def' => 'mf_layer_meta_def', - 'mf_layer_class_def' => 'mf_layer_class_def', - 'service_tuile' => 'service_tuile', - 'catalogue_csw_id' => 'catalogue_csw_id', - 'fiche_csw_id' => 'fiche_csw_id', - 'mf_layer_meta_wfs_max_feature' => 'mf_layer_meta_wfs_max_feature', - 'est_fond_de_carte' => 'est_fond_de_carte', - 'mf_layer_opacity' => 'mf_layer_opacity', - 'mf_layer_meta_title' => 'mf_layer_meta_title', - 'mf_layer_meta_group_title' => 'mf_layer_meta_group_title', - 'mf_layer_labelitem' => 'mf_layer_labelitem', - 'mf_layer_meta_z_order' => 'mf_layer_meta_z_order', - 'print_option_url' => 'print_option_url', - 'print_option_layer_name' => 'print_option_layer_name', - 'est_commune' => 'est_commune', - 'est_publique' => 'est_publique', - 'layer_a_order' => 'layer_a_order', - 'classe_entite_id' => 'classe_entite_id', - 'geometrie_type_id' => 'geometrie_type_id', - 'vue_defaut' => 'vue_defaut', - 'date_chargement' => 'date_chargement', - 'connexion_id' => 'connexion_id', - 'echelle_prod' => 'echelle_prod', - 'remarque_geometrie' => 'remarque_geometrie', - 'ind_inclusion' => 'ind_inclusion', - 'mf_layer_data' => 'mf_layer_data', - 'mf_layer_projection' => 'mf_layer_projection', - 'acces' => 'acces', - 'nom_classe_entite' => 'nom_classe_entite', - 'description_classe_entite' => 'description_classe_entite', - 'source_entite_id' => 'source_entite_id', - 'classification_id' => 'classification_id', - 'organisme_responsable_id' => 'organisme_responsable_id', - 'contact_id' => 'contact_id', - 'remarque_classe_entite' => 'remarque_classe_entite', - 'nom_connexion' => 'nom_connexion', - 'connexion' => 'connexion', - 'connexion_type_id' => 'connexion_type_id', - 'nom_connexion_type' => 'nom_connexion_type', - 'connexion_type' => 'connexion_type', - 'nom_geometrie_type' => 'nom_geometrie_type', - 'layer_type' => 'layer_type', - 'geometrie_type' => 'geometrie_type' - ); - } - -} diff --git a/pilotage/app/models/IgoVueContexteCoucheNavigateur.php b/pilotage/app/models/IgoVueContexteCoucheNavigateur.php deleted file mode 100644 index 1b646e31..00000000 --- a/pilotage/app/models/IgoVueContexteCoucheNavigateur.php +++ /dev/null @@ -1,77 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - $this->belongsTo("contexte_id", "IgoContexte", "id", array( - 'reusable' => true - )); - - $this->belongsTo("couche_id", "IgoCouche", "id", array('reusable' => true)); - - - } - -} diff --git a/pilotage/app/models/IgoVueContexteGroupesRecursif.php b/pilotage/app/models/IgoVueContexteGroupesRecursif.php deleted file mode 100644 index 1ca45e6f..00000000 --- a/pilotage/app/models/IgoVueContexteGroupesRecursif.php +++ /dev/null @@ -1,28 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - - } - -} diff --git a/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php b/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php deleted file mode 100644 index c40f4ab5..00000000 --- a/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php +++ /dev/null @@ -1,55 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - - } - - public function refresh(){ - - $this->getDI()->get('db')->execute('REFRESH MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized'); - - // #recette métadata - // Décommenter les lignes suivantes, allez dans le pilotage et modifiez un Groupe. - //$m = ($this->getModelsMetaData()->readMetaData($this)); - //echo 'Contenu pour le $m de metaData de IgoVueContexteGroupesRecursifMaterialized.php
    '; - //echo ''; - //die(); - // #fin recette métadata - - } - - /** - * Spécifier explicitement les métadata parce que Phalcon ne supporte pas - * les vues matérialisées - * @return onject - */ - public function metaData(){ - - // Nécessaire parce que Phalcon a de la misère avec les vues matérialisées - // La valeur de $m peut être générée en suivant la #recette métadata - $m = '{"0":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"contexte_id":0,"parent_groupe_id":0,"nom_complet":6,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"contexte_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"contexte_id":1,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; - return json_decode($m, true); - - } -} diff --git a/pilotage/app/models/IgoVueCouche.php b/pilotage/app/models/IgoVueCouche.php deleted file mode 100644 index 03e4d5d2..00000000 --- a/pilotage/app/models/IgoVueCouche.php +++ /dev/null @@ -1,95 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - $this->hasMany("id", "IgoCoucheContexte", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoVueContexteCoucheNavigateur", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoPermission", "couche_id", array( - 'reusable' => true - )); - $this->hasMany("id", "IgoClasse", "couche_id", array( - 'reusable' => true - )); - $this->belongsTo("geometrie_id", "IgoGeometrie", "id", array( - 'reusable' => true - )); - $this->belongsTo("groupe_id", "IgoGroupe", "id", array( - 'reusable' => true - )); - - } - - -} diff --git a/pilotage/app/models/IgoVueGroupesRecursif.php b/pilotage/app/models/IgoVueGroupesRecursif.php deleted file mode 100644 index 01a8500d..00000000 --- a/pilotage/app/models/IgoVueGroupesRecursif.php +++ /dev/null @@ -1,43 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - } - -} diff --git a/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php b/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php deleted file mode 100644 index 79608d65..00000000 --- a/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php +++ /dev/null @@ -1,72 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - - } - - public function refresh(){ - - $this->getDI()->get('db')->execute('REFRESH MATERIALIZED VIEW igo_vue_groupes_recursif_materialized') ; - - // #recette métadata - // Recette pour obtenir les médatada ($m) - // Décommenter les lignes suivantes, allez dans le pilotage et modifiez un Groupe. - //echo 'Contenu pour le $m de metaData de IgoVueGroupesRecursif.php
    '; - //echo ''; - //die(); - // #fin recette métadata - - } - - /** - * Spécifier explicitement les métadata parce que Phalcon ne supporte pas - * les vues matérialisées - * @return onject - */ - public function metaData(){ - - // Nécessaire parce que phalcon a de la misère avec les vues matérialisées - // La valeur de $m peut être générée en suivant la #recette métadata - $m = '{"0":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"parent_groupe_id":0,"nom_complet":2,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; - return json_decode($m, true); - - } - -} diff --git a/pilotage/app/models/IgoVuePermissionProfil.php b/pilotage/app/models/IgoVuePermissionProfil.php deleted file mode 100644 index 9bb62e79..00000000 --- a/pilotage/app/models/IgoVuePermissionProfil.php +++ /dev/null @@ -1,37 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - } - - /** - * Independent Column Mapping. - */ - public function columnMap() - { - return array( - 'profil_id' => 'profil_id', - 'couche_id' => 'couche_id', - 'groupe_id' => 'groupe_id', - 'est_lecture' => 'est_lecture', - 'est_analyse' => 'est_analyse', - 'est_ecriture' => 'est_ecriture', - 'est_export' => 'est_export' - ); - } -} - diff --git a/pilotage/app/models/IgoVuePermissionsPourCouches.php b/pilotage/app/models/IgoVuePermissionsPourCouches.php deleted file mode 100644 index b5ab0da5..00000000 --- a/pilotage/app/models/IgoVuePermissionsPourCouches.php +++ /dev/null @@ -1,37 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - } - - /** - * Independent Column Mapping. - */ - public function columnMap(){ - return array( - 'couche_id' => 'couche_id', - 'groupe_id' => 'groupe_id', - 'profil_id' => 'profil_id', - 'est_lecture' => 'est_lecture', - 'est_analyse' => 'est_analyse', - 'est_ecriture' => 'est_ecriture', - 'est_export' => 'est_export', - 'est_association' => 'est_association' - ); - } -} - diff --git a/pilotage/app/models/IgoVuePermissionsPourGroupes.php b/pilotage/app/models/IgoVuePermissionsPourGroupes.php deleted file mode 100644 index bdb0447e..00000000 --- a/pilotage/app/models/IgoVuePermissionsPourGroupes.php +++ /dev/null @@ -1,35 +0,0 @@ -setSchema($this->getDI()->getConfig()->database->schema); - - } - - /** - * Independent Column Mapping. - */ - public function columnMap(){ - return array( - 'groupe_id' => 'groupe_id', - 'profil_id' => 'profil_id', - 'est_lecture' => 'est_lecture', - 'est_analyse' => 'est_analyse', - 'est_ecriture' => 'est_ecriture', - 'est_export' => 'est_export', - 'est_association' => 'est_association' - ); - } -} - diff --git a/pilotage/app/plugins/SecurityPlugin.php b/pilotage/app/plugins/SecurityPlugin.php deleted file mode 100644 index 5355ba4e..00000000 --- a/pilotage/app/plugins/SecurityPlugin.php +++ /dev/null @@ -1,280 +0,0 @@ -getDI()->get("authentificationModule"); - if($authentificationModule == null){ - return; - } - - $controller = $dispatcher->getControllerName(); - $action = $dispatcher->getActionName(); - error_log("Controleur: {$controller}, Action: {$action}"); - - if($controller === "connexion" || $controller === "error"){ - $config = $this->getDI()->get("config"); - $this->getDI()->get("view")->setViewsDir($config->application->services->viewsDir); - // }else if($this->estAnonyme()){ - // error_log("2"); - // return $this->forwardToUnauthorizedPage(); - }else if(!$this->estAuthentifie()){ - return $this->forwardToLoginPage(); - } else if(!$this->session->get("info_utilisateur")->estAdmin && - !$this->session->get("info_utilisateur")->estPilote) { - $this->session->set("erreur", "Droits insuffisants"); - return $this->forwardToLoginPage(); - } - else { - - // Contrôle d'accès. - return $this->filtrerRoutes($controller, $action); - } - } - - private function filtrerRoutes($controller, $action) { - $info_utilisateur = $this->session->get('info_utilisateur'); - - if(!$info_utilisateur->estAdmin) { - // On est pilote ici - - switch($controller) { - // Menu Permissions - case "igo_utilisateur": - $this->forbidActions($action, array("all")); - break; - - case "utilisateur_et_profil": - $this->forbidActions($action, array("all")); - break; - - case "igo_permission": - $this->forbidActions($action, array()); - break; - - case "igo_profil": - $this->forbidActions($action, array()); - break; - - case "igo_utilisateur_profil": - $this->forbidActions($action, array("all")); - break; - - case "igo_service_profil": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - // Menu Classe d'entité - case "gestion_couche": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_classe_entite": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_geometrie": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_couche": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_attribut": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_groupe": - $this->forbidActions($action, array()); - break; - - case "igo_groupe_couche": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - // Menu Context - case "igo_contexte": - $this->forbidActions($action, array()); - break; - - case "igo_couche_contexte": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - // Menu Service - case "igo_service": - $this->forbidActions($action, array("all")); - break; - - // Menu Pilotage - case "igo_classe": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_source_entite": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_catalogue_csw": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_organisme_responsable": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_contact": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_classification": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_geometrie_type": - $this->forbidActions($action, array("new", - "edit", - "delete", - "create")); - break; - - case "igo_connexion": - $this->forbidActions($action, array("all")); - break; - - case "igo_connexion_type": - $this->forbidActions($action, array("all")); - break; - - // Menu Mapfile - case "mapfile": - $this->forbidActions($action, array("all")); - break; - - default: - $this->forbidActions($action, array()); - break; - } - } - } - - /* - * $action : action du controlleur - * $actions_interdites : array contenant les actions à filtrer. - */ - private function forbidActions($action, $actions_interdites) { - if(in_array("all", $actions_interdites)) { - $this->forwardToUnauthorizedPage(); - } - - if (in_array($action, $actions_interdites)) { - $this->forwardToUnauthorizedPage(); - } - - return; - } - - private function forwardToLoginPage(){ - $this->dispatcher->forward(array( - "controller" => "connexion", - "action" => "index" - )); - return; - } - - private function forwardToErrorPage(){ - $this->dispatcher->forward(array( - "controller" => "error", - "action" => "error404" - )); - return; - } - - private function forwardToUnauthorizedPage(){ - $this->dispatcher->forward(array( - "controller" => "error", - "action" => "error403" - )); - return; - } - private function forwardToRolePage(){ - $this->dispatcher->forward(array( - "controller" => "connexion", - "action" => "role" - )); - return; - } - - private function estAuthentifie(){ - return $this->session->has("info_utilisateur") - ? $this->session->get("info_utilisateur")->estAuthentifie - : false; - } - - private function estAnonyme(){ - return $this->session->get("info_utilisateur")->estAnonyme; - } - - private function estRoleSelectionneRequis(){ - return $this->getDi()->getConfig()->application->authentification->activerSelectionRole; - } - - private function estRoleSelectionne(){ - return !is_null($this->session->get("info_utilisateur")->profilActif); - } - - private function obtenirConfiguration($action, $dispatcher){ - if($action === "index"){ - $configuration = "defaut"; - }else { - $configuration = $dispatcher->getParam("configuration"); - } - return $configuration; - } - -} \ No newline at end of file diff --git a/pilotage/app/sql/couche_anonyme_publique.sql b/pilotage/app/sql/couche_anonyme_publique.sql deleted file mode 100644 index dca07cc3..00000000 --- a/pilotage/app/sql/couche_anonyme_publique.sql +++ /dev/null @@ -1,2 +0,0 @@ -update igo_couche set est_publique=true where id in( -select couche_id from igo_vue_permissions_pour_couches where profil_id IN(select id from igo_profil where libelle= 'Anonyme')) \ No newline at end of file diff --git a/pilotage/app/sql/creation_de_tables.sql b/pilotage/app/sql/creation_de_tables.sql deleted file mode 100644 index 2260c4a4..00000000 --- a/pilotage/app/sql/creation_de_tables.sql +++ /dev/null @@ -1,1227 +0,0 @@ --- Si ces fonction n'existent pas dans votre schema, commentez les lignes suivantes. -/* -DROP AGGREGATE IF EXISTS first(anyelement); -DROP AGGREGATE IF EXISTS last(anyelement); -DROP FUNCTION IF EXISTS first_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS last_agg(anyelement, anyelement); -*/ --- Si ces fonction n'existent pas dans votre schema, commentez les lignes suivantes. - -DROP TABLE IF EXISTS igo_classe cascade; -DROP TABLE IF EXISTS igo_connexion cascade; -DROP TABLE IF EXISTS igo_connexion_type cascade; -DROP TABLE IF EXISTS igo_contexte cascade; -DROP TABLE IF EXISTS igo_geometrie_type cascade; -DROP TABLE IF EXISTS igo_service cascade; -DROP TABLE IF EXISTS igo_service_profil cascade; -DROP TABLE IF EXISTS igo_valeur cascade; -DROP TABLE IF EXISTS igo_utilisateur cascade; -DROP TABLE IF EXISTS igo_utilisateur_profil cascade; -DROP TABLE IF EXISTS igo_classification cascade; -DROP TABLE IF EXISTS igo_classe_entite cascade; -DROP TABLE IF EXISTS igo_contact cascade; -DROP TABLE IF EXISTS igo_attribut cascade; -DROP TABLE IF EXISTS igo_groupe cascade; -DROP TABLE IF EXISTS igo_groupe_couche cascade; -- vérifier pour l'ordre -DROP TABLE IF EXISTS igo_groupe_groupe cascade; -DROP TABLE IF EXISTS igo_permission cascade; -DROP TABLE IF EXISTS igo_organisme_responsable cascade; -DROP TABLE IF EXISTS igo_profil cascade; -DROP TABLE IF EXISTS igo_source_entite cascade; -DROP TABLE IF EXISTS igo_liste_valeur cascade; -DROP TABLE IF EXISTS igo_couche_contexte cascade; -DROP TABLE IF EXISTS igo_couche cascade; -DROP TABLE IF EXISTS igo_geometrie cascade; -DROP TABLE IF EXISTS igo_catalogue_csw cascade; - -/* -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ - SELECT $1; -$_$; - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ - SELECT $2; -$_$; - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); -*/ - -CREATE TABLE igo_attribut ( - id integer NOT NULL, - geometrie_id integer, - colonne character varying(50) NOT NULL, - alias character varying(50), - description character varying(2000), - est_cle boolean, - est_nom boolean, - est_description boolean, - est_filtre boolean, - est_geometrie boolean, - est_inclu boolean, - liste_valeur_id integer, - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_attribut_geometrie_def_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_attribut_geometrie_def_id_seq OWNED BY igo_attribut.geometrie_id; - -CREATE SEQUENCE igo_attribut_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_attribut_id_seq OWNED BY igo_attribut.id; - -CREATE TABLE igo_catalogue_csw ( - id integer NOT NULL, - url character varying(500), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_catalogue_csw_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_catalogue_csw_id_seq OWNED BY igo_catalogue_csw.id; - -CREATE TABLE igo_classe ( - id integer NOT NULL, - couche_id integer, - mf_class_def character varying(2000), - date_modif timestamp without time zone, - mf_class_z_order integer -); - -CREATE TABLE igo_classe_entite ( - id integer NOT NULL, - nom character varying(200), - description character varying(2000), - source_entite_id integer, - classification_id integer, - organisme_responsable_id integer, - contact_id integer, - remarque character varying(2000), - catalogue_csw_id integer, - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_classe_entite_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_classe_entite_id_seq OWNED BY igo_classe_entite.id; - -CREATE SEQUENCE igo_classe_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_classe_id_seq OWNED BY igo_classe.id; - -CREATE TABLE igo_classification ( - id integer NOT NULL, - nom character varying(50), - description character varying(2000), - code_geonetwork character varying(50), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_classification_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_classification_id_seq OWNED BY igo_classification.id; - -CREATE TABLE igo_connexion ( - id integer NOT NULL, - nom character varying(50), - connexion character varying(2000), - date_modif timestamp without time zone, - connexion_type_id integer -); - -CREATE SEQUENCE igo_connexion_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_connexion_id_seq OWNED BY igo_connexion.id; - -CREATE TABLE igo_connexion_type ( - id integer NOT NULL, - nom character varying(50), - connexion_type character varying(50), - date_modif timestamp without time zone, - geometrie_type character varying(1) -); - -CREATE SEQUENCE igo_connexion_type_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_connexion_type_id_seq OWNED BY igo_connexion_type.id; - -CREATE TABLE igo_contact ( - id integer NOT NULL, - organisme_responsable_id integer, - prenom character varying(50), - nom character varying(50), - poste character varying(70), - no_telephone character varying(30), - courriel character varying(100), - est_membre_acrigeo boolean, - remarque character varying(2000), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_contact_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_contact_id_seq OWNED BY igo_contact.id; - -CREATE TABLE igo_contexte ( - id integer NOT NULL, - mode character(1), - "position" character varying(50), - zoom numeric(4,2), - code character varying(100), - nom character varying(100), - description character varying(2000), - mf_map_def character varying(2000), - date_modif timestamp without time zone, - json character varying(2000), - mf_map_projection character varying(200), - mf_map_meta_onlineresource character varying(1000) NOT NULL, - ind_ordre_arbre character varying(1), - profil_proprietaire_id integer -); - -CREATE SEQUENCE igo_contexte_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_contexte_id_seq OWNED BY igo_contexte.id; - -CREATE TABLE igo_couche ( - id integer NOT NULL, - type character(1), - description character varying(2000), - geometrie_id integer, --- groupe_id integer, - vue_validation character varying(250), - mf_layer_name character varying(150), - mf_layer_group character varying(300), - mf_layer_meta_name character varying(150), - mf_layer_filtre character varying(1000), - mf_layer_minscale bigint, - mf_layer_maxscale bigint, - mf_layer_labelminscale bigint, - mf_layer_labelmaxscale bigint, - mf_layer_def character varying(2000), - mf_layer_meta_def character varying(2000), - service_tuile character varying(500), - fiche_csw_id character varying(50), - mf_layer_meta_wfs_max_feature integer, - est_fond_de_carte boolean, - date_modif timestamp without time zone, - mf_layer_opacity integer, - mf_layer_meta_title character varying(150), - mf_layer_meta_group_title character varying(200), - mf_layer_labelitem character varying(50), - mf_layer_meta_z_order integer, - print_option_url character varying(200), - print_option_layer_name character varying(100), - max_zoom_level integer, - min_zoom_level integer -); - -CREATE TABLE igo_couche_contexte ( - contexte_id integer, - couche_id integer, - groupe_id integer, - arbre_id character varying(50), - est_visible boolean DEFAULT false, - est_active boolean DEFAULT false, - ind_fond_de_carte character(1), - mf_layer_meta_name character varying(150), - mf_layer_meta_title character varying(150), - mf_layer_meta_group_title character varying(200), - mf_layer_class_def character varying(500), - date_modif timestamp without time zone, - id integer NOT NULL, - est_exclu boolean DEFAULT false, - attribut_id integer, - mf_layer_meta_z_order integer, - mf_layer_filtre character varying(1000) -); - -CREATE SEQUENCE igo_couche_contexte_contexte_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_couche_contexte_contexte_id_seq OWNED BY igo_couche_contexte.contexte_id; - -CREATE SEQUENCE igo_couche_contexte_couche_def_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_couche_contexte_couche_def_id_seq OWNED BY igo_couche_contexte.couche_id; - -CREATE SEQUENCE igo_couche_contexte_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_couche_contexte_id_seq OWNED BY igo_couche_contexte.id; - -CREATE SEQUENCE igo_couche_geometrie_def_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_couche_geometrie_def_id_seq OWNED BY igo_couche.geometrie_id; - -CREATE SEQUENCE igo_couche_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_couche_id_seq OWNED BY igo_couche.id; - -CREATE TABLE igo_geometrie ( - id integer NOT NULL, - classe_entite_id integer, - geometrie_type_id integer NOT NULL, - vue_defaut character varying(250), - date_chargement timestamp without time zone, - connexion_id integer, - echelle_prod character varying(50), - remarque character varying(2000), - date_modif timestamp without time zone, - ind_inclusion character varying(1), - mf_layer_data character varying(500), - mf_layer_projection character varying(200), - mf_layer_meta_z_order integer -); - -CREATE SEQUENCE igo_geometrie_classe_entite_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_geometrie_classe_entite_id_seq OWNED BY igo_geometrie.classe_entite_id; - -CREATE SEQUENCE igo_geometrie_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_geometrie_id_seq OWNED BY igo_geometrie.id; - -CREATE TABLE igo_geometrie_type ( - id integer NOT NULL, - nom character varying(50), - layer_type character varying(50), - date_modif timestamp without time zone, - mf_layer_meta_z_order integer -); - -CREATE SEQUENCE igo_geometrie_type_id_seq - START WITH 1 - INCREMENT BY 1 - MINVALUE 0 - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_geometrie_type_id_seq OWNED BY igo_geometrie_type.id; - -CREATE TABLE igo_groupe ( - id integer NOT NULL, - nom character varying(150), - description character varying(200), - date_modif timestamp without time zone, - profil_proprietaire_id integer, - mf_layer_meta_z_order integer, - est_exclu_arbre boolean -); - -CREATE TABLE igo_groupe_couche -( - id integer NOT NULL , - groupe_id integer, - couche_id integer -); - -CREATE SEQUENCE igo_groupe_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_groupe_id_seq OWNED BY igo_groupe.id; - -drop sequence IF EXISTS igo_groupe_couche_id_seq; -CREATE SEQUENCE igo_groupe_couche_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_groupe_couche_id_seq OWNED BY igo_groupe_couche.id; - - -CREATE TABLE igo_groupe_groupe -( - id integer NOT NULL , - groupe_id integer, - parent_groupe_id integer -); - -drop sequence if exists igo_groupe_groupe_id_seq; -CREATE SEQUENCE igo_groupe_groupe_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_groupe_groupe_id_seq OWNED BY igo_groupe_groupe.id; - - -CREATE TABLE igo_liste_valeur ( - id integer NOT NULL, - description character varying(2000), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_liste_valeur_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_liste_valeur_id_seq OWNED BY igo_liste_valeur.id; - -CREATE TABLE igo_organisme_responsable ( - id integer NOT NULL, - acronyme character(10), - nom character varying(100), - url character varying(500), - contact_id integer, - remarque character varying(2000), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_organisme_responsable_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_organisme_responsable_id_seq OWNED BY igo_organisme_responsable.id; - -CREATE TABLE igo_permission ( - id integer NOT NULL, - profil_id integer, - couche_id integer, - est_lecture boolean DEFAULT false, - est_analyse boolean DEFAULT false, - est_ecriture boolean DEFAULT false, - est_export boolean DEFAULT false, - est_association boolean DEFAULT false, - date_modif timestamp without time zone, - groupe_id integer, - est_exclu boolean DEFAULT false, - attribut_id integer, - mf_layer_filtre character varying(200) -); - -CREATE SEQUENCE igo_permission_couche_def_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_permission_couche_def_id_seq OWNED BY igo_permission.couche_id; - -CREATE SEQUENCE igo_permission_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_permission_id_seq OWNED BY igo_permission.id; - -CREATE SEQUENCE igo_permission_profil_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_permission_profil_id_seq OWNED BY igo_permission.profil_id; - -CREATE TABLE igo_profil ( - id integer NOT NULL, - nom character varying(50) NOT NULL, - profil_proprietaire_id integer, - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_profil_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_profil_id_seq OWNED BY igo_profil.id; - -CREATE TABLE igo_service ( - id integer NOT NULL, - nom character varying(50), - description character varying(2000), - wsdl character varying(500), - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_service_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_service_id_seq OWNED BY igo_service.id; - -CREATE TABLE igo_service_profil ( - profil_id integer, - service_id integer, - date_modif timestamp without time zone, - id integer NOT NULL -); - -CREATE SEQUENCE igo_service_profil_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; -ALTER SEQUENCE igo_service_profil_id_seq OWNED BY igo_service_profil.id; - -CREATE TABLE igo_source_entite ( - id integer NOT NULL, - url character varying(500) NOT NULL, - organisme_responsable_id integer, - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_source_entite_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_source_entite_id_seq OWNED BY igo_source_entite.id; - -CREATE TABLE igo_utilisateur ( - id integer NOT NULL, - nom character varying(50), - est_admin boolean NOT NULL, - est_pilote boolean NOT NULL, - date_modif timestamp without time zone -); - -CREATE SEQUENCE igo_utilisateur_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_utilisateur_id_seq OWNED BY igo_utilisateur.id; - -CREATE TABLE igo_utilisateur_profil ( - profil_id integer NOT NULL, - utilisateur_id integer NOT NULL, - date_modif timestamp without time zone, - id integer NOT NULL -); - -CREATE SEQUENCE igo_utilisateur_profil_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_utilisateur_profil_id_seq OWNED BY igo_utilisateur_profil.id; - -CREATE TABLE igo_valeur ( - id integer NOT NULL, - description character varying(2000), - liste_valeur_id integer, - valeur character varying(200), - date_modif timestamp without time zone -); - -DROP SEQUENCE IF EXISTS igo_valeur_id_seq; -CREATE SEQUENCE igo_valeur_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE igo_valeur_id_seq OWNED BY igo_valeur.id; - -ALTER TABLE ONLY igo_attribut ALTER COLUMN id SET DEFAULT nextval('igo_attribut_id_seq'::regclass); - -ALTER TABLE ONLY igo_catalogue_csw ALTER COLUMN id SET DEFAULT nextval('igo_catalogue_csw_id_seq'::regclass); - -ALTER TABLE ONLY igo_classe ALTER COLUMN id SET DEFAULT nextval('igo_classe_id_seq'::regclass); - -ALTER TABLE ONLY igo_classe_entite ALTER COLUMN id SET DEFAULT nextval('igo_classe_entite_id_seq'::regclass); - -ALTER TABLE ONLY igo_classification ALTER COLUMN id SET DEFAULT nextval('igo_classification_id_seq'::regclass); - -ALTER TABLE ONLY igo_connexion ALTER COLUMN id SET DEFAULT nextval('igo_connexion_id_seq'::regclass); - -ALTER TABLE ONLY igo_connexion_type ALTER COLUMN id SET DEFAULT nextval('igo_connexion_type_id_seq'::regclass); - -ALTER TABLE ONLY igo_contact ALTER COLUMN id SET DEFAULT nextval('igo_contact_id_seq'::regclass); - -ALTER TABLE ONLY igo_contexte ALTER COLUMN id SET DEFAULT nextval('igo_contexte_id_seq'::regclass); - -ALTER TABLE ONLY igo_couche ALTER COLUMN id SET DEFAULT nextval('igo_couche_id_seq'::regclass); - -ALTER TABLE ONLY igo_couche_contexte ALTER COLUMN id SET DEFAULT nextval('igo_couche_contexte_id_seq'::regclass); - -ALTER TABLE ONLY igo_geometrie ALTER COLUMN id SET DEFAULT nextval('igo_geometrie_id_seq'::regclass); - -ALTER TABLE ONLY igo_geometrie_type ALTER COLUMN id SET DEFAULT nextval('igo_geometrie_type_id_seq'::regclass); - -ALTER TABLE ONLY igo_groupe ALTER COLUMN id SET DEFAULT nextval('igo_groupe_id_seq'::regclass); - -ALTER TABLE ONLY igo_groupe_couche ALTER COLUMN id SET DEFAULT nextval('igo_groupe_couche_id_seq'::regclass); - -ALTER TABLE ONLY igo_groupe_groupe ALTER COLUMN id SET DEFAULT nextval('igo_groupe_groupe_id_seq'::regclass); - -ALTER TABLE ONLY igo_liste_valeur ALTER COLUMN id SET DEFAULT nextval('igo_liste_valeur_id_seq'::regclass); - -ALTER TABLE ONLY igo_organisme_responsable ALTER COLUMN id SET DEFAULT nextval('igo_organisme_responsable_id_seq'::regclass); - -ALTER TABLE ONLY igo_permission ALTER COLUMN id SET DEFAULT nextval('igo_permission_id_seq'::regclass); - -ALTER TABLE ONLY igo_profil ALTER COLUMN id SET DEFAULT nextval('igo_profil_id_seq'::regclass); - -ALTER TABLE ONLY igo_service ALTER COLUMN id SET DEFAULT nextval('igo_service_id_seq'::regclass); - -ALTER TABLE ONLY igo_service_profil ALTER COLUMN id SET DEFAULT nextval('igo_service_profil_id_seq'::regclass); - -ALTER TABLE ONLY igo_source_entite ALTER COLUMN id SET DEFAULT nextval('igo_source_entite_id_seq'::regclass); - -ALTER TABLE ONLY igo_utilisateur ALTER COLUMN id SET DEFAULT nextval('igo_utilisateur_id_seq'::regclass); - -ALTER TABLE ONLY igo_utilisateur_profil ALTER COLUMN id SET DEFAULT nextval('igo_utilisateur_profil_id_seq'::regclass); - -ALTER TABLE ONLY igo_valeur ALTER COLUMN id SET DEFAULT nextval('igo_valeur_id_seq'::regclass); - -ALTER TABLE ONLY igo_connexion_type - ADD CONSTRAINT "PK_connexion_type" PRIMARY KEY (id); - -ALTER TABLE ONLY igo_attribut - ADD CONSTRAINT pk_attribut PRIMARY KEY (id); - -ALTER TABLE ONLY igo_source_entite - ADD CONSTRAINT pk_catalogue PRIMARY KEY (id); - -ALTER TABLE ONLY igo_catalogue_csw - ADD CONSTRAINT pk_catalogue_csw PRIMARY KEY (id); - -ALTER TABLE ONLY igo_classe - ADD CONSTRAINT pk_classe PRIMARY KEY (id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT pk_classe_entite PRIMARY KEY (id); - -ALTER TABLE ONLY igo_classification - ADD CONSTRAINT pk_classification PRIMARY KEY (id); - -ALTER TABLE ONLY igo_connexion - ADD CONSTRAINT pk_connexion PRIMARY KEY (id); - -ALTER TABLE ONLY igo_contact - ADD CONSTRAINT pk_contact PRIMARY KEY (id); - -ALTER TABLE ONLY igo_contexte - ADD CONSTRAINT pk_contexte PRIMARY KEY (id); - -ALTER TABLE ONLY igo_couche - ADD CONSTRAINT pk_couche PRIMARY KEY (id); - -ALTER TABLE ONLY igo_couche_contexte - ADD CONSTRAINT pk_couche_contexte PRIMARY KEY (id); - -ALTER TABLE ONLY igo_geometrie - ADD CONSTRAINT pk_geometrie PRIMARY KEY (id); - -ALTER TABLE ONLY igo_geometrie_type - ADD CONSTRAINT pk_geometrie_type PRIMARY KEY (id); - -ALTER TABLE ONLY igo_groupe - ADD CONSTRAINT pk_groupe PRIMARY KEY (id); - -ALTER TABLE ONLY igo_groupe_couche - ADD CONSTRAINT pk_groupe_couche PRIMARY KEY (id); - -ALTER TABLE ONLY igo_groupe_groupe - ADD CONSTRAINT pk_groupe_groupe PRIMARY KEY (id); - -ALTER TABLE ONLY igo_liste_valeur - ADD CONSTRAINT pk_liste_valeur PRIMARY KEY (id); - -ALTER TABLE ONLY igo_organisme_responsable - ADD CONSTRAINT pk_organisme_responsable PRIMARY KEY (id); - -ALTER TABLE ONLY igo_permission - ADD CONSTRAINT pk_permission PRIMARY KEY (id); - -ALTER TABLE ONLY igo_profil - ADD CONSTRAINT pk_profil PRIMARY KEY (id); - -ALTER TABLE ONLY igo_service - ADD CONSTRAINT pk_service_cartographique PRIMARY KEY (id); - -ALTER TABLE ONLY igo_service_profil - ADD CONSTRAINT pk_service_profil PRIMARY KEY (id); - -ALTER TABLE ONLY igo_utilisateur - ADD CONSTRAINT pk_utilisateur PRIMARY KEY (id); - -ALTER TABLE ONLY igo_utilisateur_profil - ADD CONSTRAINT pk_utilisateur_profil PRIMARY KEY (id); - -ALTER TABLE ONLY igo_valeur - ADD CONSTRAINT pk_valeur PRIMARY KEY (id); - -ALTER TABLE ONLY igo_contexte - ADD CONSTRAINT uq_contexte_code UNIQUE (code); - -ALTER TABLE ONLY igo_couche - ADD CONSTRAINT uq_couche_mf_layer_name UNIQUE (mf_layer_name); - - -CREATE INDEX igo_attribut_id_idx ON igo_attribut USING btree (geometrie_id); - -CREATE INDEX igo_couche_contexte_contexte_id_idx ON igo_couche_contexte USING btree (contexte_id); - -CREATE INDEX igo_couche_contexte_couche_id_contexte_id_est_exclu_idx ON igo_couche_contexte USING btree (couche_id, contexte_id, est_exclu); - -CREATE INDEX igo_couche_contexte_couche_id_idx ON igo_couche_contexte USING btree (couche_id); - -CREATE INDEX igo_couche_contexte_est_exclu_idx ON igo_couche_contexte USING btree (est_exclu); - -CREATE INDEX igo_couche_contexte_groupe_id_idx ON igo_couche_contexte USING btree (groupe_id); - -CREATE INDEX igo_permission_couche_id_idx ON igo_permission USING btree (couche_id); - -CREATE INDEX igo_permission_couche_id_profil_id_est_exclu_idx ON igo_permission USING btree (couche_id, profil_id, est_exclu); - -CREATE INDEX igo_permission_est_exclu_idx ON igo_permission USING btree (est_exclu); - -CREATE INDEX igo_permission_profil_id_idx ON igo_permission USING btree (profil_id); - -ALTER TABLE ONLY igo_connexion - ADD CONSTRAINT "FK_connexion_connexion_type" FOREIGN KEY (connexion_type_id) REFERENCES igo_connexion_type(id); - -ALTER TABLE ONLY igo_attribut - ADD CONSTRAINT fk_attribut_geometrie FOREIGN KEY (geometrie_id) REFERENCES igo_geometrie(id); - -ALTER TABLE ONLY igo_attribut - ADD CONSTRAINT fk_attribut_liste_valeur FOREIGN KEY (liste_valeur_id) REFERENCES igo_liste_valeur(id); - -ALTER TABLE ONLY igo_classe - ADD CONSTRAINT fk_classe_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT fk_classe_entite_catalogue_csw FOREIGN KEY (catalogue_csw_id) REFERENCES igo_catalogue_csw(id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT fk_classe_entite_classification FOREIGN KEY (classification_id) REFERENCES igo_classification(id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT fk_classe_entite_contact FOREIGN KEY (contact_id) REFERENCES igo_contact(id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT fk_classe_entite_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); - -ALTER TABLE ONLY igo_classe_entite - ADD CONSTRAINT fk_classe_entite_source_entite FOREIGN KEY (source_entite_id) REFERENCES igo_source_entite(id); - -ALTER TABLE ONLY igo_contact - ADD CONSTRAINT fk_contact_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); - -ALTER TABLE ONLY igo_contexte - ADD CONSTRAINT fk_contexte_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_couche_contexte - ADD CONSTRAINT fk_couche_contexte_contexte FOREIGN KEY (contexte_id) REFERENCES igo_contexte(id); - -ALTER TABLE ONLY igo_couche_contexte - ADD CONSTRAINT fk_couche_contexte_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); - -ALTER TABLE ONLY igo_couche_contexte - ADD CONSTRAINT fk_couche_contexte_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); - -ALTER TABLE ONLY igo_couche - ADD CONSTRAINT fk_couche_geometrie FOREIGN KEY (geometrie_id) REFERENCES igo_geometrie(id); - -ALTER TABLE ONLY igo_geometrie - ADD CONSTRAINT fk_geometrie_classe_entite FOREIGN KEY (classe_entite_id) REFERENCES igo_classe_entite(id); - -ALTER TABLE ONLY igo_geometrie - ADD CONSTRAINT fk_geometrie_connexion FOREIGN KEY (connexion_id) REFERENCES igo_connexion(id); - -ALTER TABLE ONLY igo_geometrie - ADD CONSTRAINT fk_geometrie_geometrie_type FOREIGN KEY (geometrie_type_id) REFERENCES igo_geometrie_type(id); - -ALTER TABLE ONLY igo_groupe - ADD CONSTRAINT fk_groupe_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_organisme_responsable - ADD CONSTRAINT fk_organisme_responsable_contact FOREIGN KEY (contact_id) REFERENCES igo_contact(id); - -ALTER TABLE ONLY igo_permission - ADD CONSTRAINT fk_permission_attribut FOREIGN KEY (attribut_id) REFERENCES igo_attribut(id); - -ALTER TABLE ONLY igo_permission - ADD CONSTRAINT fk_permission_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); - -ALTER TABLE ONLY igo_permission - ADD CONSTRAINT fk_permission_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); - -ALTER TABLE ONLY igo_permission - ADD CONSTRAINT fk_permission_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_profil - ADD CONSTRAINT fk_profil_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_service_profil - ADD CONSTRAINT fk_service_profil_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_service_profil - ADD CONSTRAINT fk_service_profil_service_cartographique FOREIGN KEY (service_id) REFERENCES igo_service(id); - -ALTER TABLE ONLY igo_source_entite - ADD CONSTRAINT fk_source_entite_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); - -ALTER TABLE ONLY igo_utilisateur_profil - ADD CONSTRAINT fk_utilisateur_profil_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); - -ALTER TABLE ONLY igo_utilisateur_profil - ADD CONSTRAINT fk_utilisateur_profil_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES igo_utilisateur(id); - -ALTER TABLE ONLY igo_valeur - ADD CONSTRAINT fk_valeur_liste_de_valeur FOREIGN KEY (liste_valeur_id) REFERENCES igo_liste_valeur(id); - - -ALTER TABLE ONLY igo_groupe_couche - ADD CONSTRAINT "FK_groupe_couche_groupe" FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); -ALTER TABLE ONLY igo_groupe_couche - ADD CONSTRAINT "FK_groupe_couche_couche" FOREIGN KEY (couche_id) REFERENCES igo_couche(id); - - - --- commit 7bbe036f1fc49cea17179874ed73422b861f70d0 du projet metadonnees par Francois Gourdeau -ALTER TABLE igo_couche ADD COLUMN est_commune BOOLEAN; -ALTER TABLE igo_couche ADD COLUMN est_publique BOOLEAN; -ALTER TABLE igo_connexion_type ADD COLUMN ind_vue BOOLEAN; -ALTER TABLE igo_connexion_type ADD COLUMN ind_data BOOLEAN; -ALTER TABLE igo_connexion_type ADD COLUMN ind_projection BOOLEAN; -ALTER TABLE igo_geometrie_type ADD COLUMN geometrie_type CHARACTER VARYING(1); -ALTER TABLE igo_classe ALTER COLUMN mf_class_def TYPE CHARACTER VARYING(5000); - --- merge request #22 du projet metadonnees -ALTER TABLE igo_couche RENAME COLUMN mf_layer_minscale TO mf_layer_minscale_denom; -ALTER TABLE igo_couche RENAME COLUMN mf_layer_maxscale TO mf_layer_maxscale_denom; -ALTER TABLE igo_couche RENAME COLUMN mf_layer_labelminscale TO mf_layer_labelminscale_denom; -ALTER TABLE igo_couche RENAME COLUMN mf_layer_labelmaxscale TO mf_layer_labelmaxscale_denom; - --- merge request #30 du projet metadonnees - -ALTER TABLE igo_geometrie ADD COLUMN acces CHARACTER VARYING(1); -ALTER TABLE igo_couche ADD COLUMN layer_a_order CHARACTER VARYING(1); -ALTER TABLE igo_couche_contexte ADD COLUMN layer_a_order CHARACTER VARYING(1); -ALTER TABLE igo_couche DROP COLUMN type; - - -ALTER TABLE igo_profil ADD COLUMN libelle character varying; -ALTER TABLE igo_profil ALTER COLUMN nom TYPE character varying(200); - -drop view if exists igo_vue_permission_profil; -drop view if exists igo_vue_contexte_couche_navigateur; -drop view if exists igo_vue_groupes_recursif; - --- Aussi inclus dans migration-0.3-vers-0.4.sql pour ceux qui sont une maj -ALTER TABLE igo_couche_contexte ALTER COLUMN layer_a_order TYPE integer USING 0; -ALTER TABLE igo_couche ALTER COLUMN layer_a_order TYPE integer USING 0; - - -CREATE VIEW igo_vue_groupes_recursif AS - WITH RECURSIVE s(id, nom, groupe_id, grp) AS ( - SELECT g.id, - g.nom, - gg_1.parent_groupe_id AS groupe_id, - g.id::text AS grp, - g.nom::character varying(500) AS nom_complet, - g.est_exclu_arbre - FROM igo_groupe g - LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id - UNION - SELECT igo_groupe.id, - igo_groupe.nom, - s_1.id AS groupe_id, - (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, - CASE igo_groupe.est_exclu_arbre - WHEN false THEN (((s_1.nom_complet::text || '/'::text) || igo_groupe.nom::character varying(500)::text))::character varying(500) - ELSE s_1.nom_complet - END AS nom_complet, - igo_groupe.est_exclu_arbre - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id - WHERE gg_1.groupe_id = igo_groupe.id - ) - SELECT s.id AS groupe_id, - s.nom, - s.groupe_id AS parent_groupe_id, - s.nom_complet, - s.est_exclu_arbre, - s.grp - FROM s - WHERE NOT (s.grp IN ( SELECT substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1) AS substr - FROM s s_1)) - ORDER BY s.grp; - -CREATE MATERIALIZED VIEW igo_vue_groupes_recursif_materialized AS - SELECT * FROM igo_vue_groupes_recursif -WITH DATA; - -CREATE OR REPLACE VIEW igo_vue_couche AS - SELECT c.id, - c.description, - c.geometrie_id, - c.vue_validation, - c.mf_layer_name, - c.mf_layer_group, - c.mf_layer_meta_name, - c.mf_layer_filtre, - c.mf_layer_minscale_denom, - c.mf_layer_maxscale_denom, - c.mf_layer_labelminscale_denom, - c.mf_layer_labelmaxscale_denom, - c.mf_layer_def, - c.mf_layer_meta_def, - c.service_tuile, - e.catalogue_csw_id, - c.fiche_csw_id, - c.mf_layer_meta_wfs_max_feature, - c.est_fond_de_carte, - c.mf_layer_opacity, - c.mf_layer_meta_title, - c.mf_layer_meta_group_title, - c.mf_layer_labelitem, - COALESCE(c.mf_layer_meta_z_order, g.mf_layer_meta_z_order, gt.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - c.print_option_url, - c.print_option_layer_name, - c.est_commune, - c.est_publique, - c.layer_a_order, - c.max_zoom_level, - c.min_zoom_level, - g.classe_entite_id, - g.geometrie_type_id, - g.vue_defaut, - g.date_chargement, - g.connexion_id, - g.echelle_prod, - g.remarque AS remarque_geometrie, - g.ind_inclusion, - g.mf_layer_data, - g.mf_layer_projection, - g.acces, - e.nom AS nom_classe_entite, - e.description AS description_classe_entite, - e.source_entite_id, - e.classification_id, - e.organisme_responsable_id, - e.contact_id, - e.remarque AS remarque_classe_entite, - x.nom AS nom_connexion, - x.connexion, - x.connexion_type_id, - t.nom AS nom_connexion_type, - t.connexion_type, - gt.nom AS nom_geometrie_type, - gt.layer_type, - gt.geometrie_type - FROM igo_couche c, - igo_classe_entite e, - igo_geometrie g - LEFT JOIN igo_connexion x ON g.connexion_id = x.id - LEFT JOIN igo_connexion_type t ON x.connexion_type_id = t.id - LEFT JOIN igo_geometrie_type gt ON g.geometrie_type_id = gt.id - WHERE c.geometrie_id = g.id AND g.classe_entite_id = e.id; - - - - ---ALTER TABLE igo_couche_contexte ADD COLUMN groupe_couche_id INTEGER; ---ALTER TABLE ONLY igo_couche_contexte --- ADD CONSTRAINT "FK_couche_contexte_groupe_couche" FOREIGN KEY (groupe_couche_id) REFERENCES igo_groupe_couche(id); - ---ALTER TABLE igo_permission ADD COLUMN groupe_couche_id INTEGER; ---ALTER TABLE ONLY igo_permission - -- ADD CONSTRAINT "FK_permission_groupe_couche" FOREIGN KEY (groupe_couche_id) REFERENCES igo_groupe_couche(id); - --- Vieille vue inutile -DROP VIEW IF EXISTS igo_vue_profils_pour_groupes; - - -DROP VIEW if exists igo_vue_permissions_pour_groupes; - -DROP VIEW IF EXISTS igo_vue_permissions_pour_couches; - -CREATE OR REPLACE VIEW igo_vue_permissions_pour_couches AS - SELECT igo_couche.id AS couche_id, - COALESCE(igo_permission.profil_id, 0) AS profil_id, - COALESCE(igo_couche.est_publique, false) OR COALESCE(igo_permission.est_lecture, false) OR COALESCE(igo_permission.est_association, false) AS est_lecture, - COALESCE(igo_permission.est_analyse, false) OR COALESCE(igo_permission.est_association, false) AS est_analyse, - COALESCE(igo_permission.est_ecriture, false) OR COALESCE(igo_permission.est_association, false) AS est_ecriture, - COALESCE(igo_permission.est_export, false) OR COALESCE(igo_permission.est_association, false) AS est_export, - COALESCE(igo_permission.est_association, false) OR COALESCE(igo_permission.est_association, false) AS est_association - FROM igo_couche - LEFT JOIN igo_permission ON igo_couche.id = igo_permission.couche_id; - -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_utilisateur_nom_unique UNIQUE (nom); -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_profil_nom_unique UNIQUE (nom); - - -ALTER TABLE igo_couche ADD COLUMN mf_layer_meta_attribution_title CHARACTER VARYING(5000); - - -DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif; - -CREATE VIEW igo_vue_contexte_groupes_recursif AS - WITH RECURSIVE s(id, nom, contexte_id, groupe_id, grp) AS ( - SELECT g.id, - g.nom, - cc.contexte_id, - gg_1.parent_groupe_id AS groupe_id, - g.id::text AS grp, - CASE - WHEN COALESCE(cc.est_visible, false) AND NOT g.est_exclu_arbre THEN COALESCE(cc.mf_layer_meta_group_title, g.nom)::character varying(500) - ELSE ''::character varying(500) - END AS nom_complet, - g.est_exclu_arbre - FROM igo_groupe g - LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id - LEFT JOIN igo_couche_contexte cc ON cc.arbre_id::text = g.id::text AND cc.couche_id IS NULL - UNION - SELECT igo_groupe.id, - igo_groupe.nom, - cc.contexte_id, - s_1.id AS groupe_id, - (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, - CASE - WHEN COALESCE(cc.est_visible, false) AND NOT s_1.est_exclu_arbre THEN (((s_1.nom_complet::text || '/'::text) || COALESCE(cc.mf_layer_meta_group_title, igo_groupe.nom)::character varying(500)::text))::character varying(500) - ELSE ''::character varying(500) - END AS nom_complet, - igo_groupe.est_exclu_arbre - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id - LEFT JOIN igo_couche_contexte cc ON s_1.contexte_id = cc.contexte_id AND cc.arbre_id::text = concat(s_1.grp, '_', gg_1.groupe_id) AND cc.couche_id IS NULL - WHERE gg_1.groupe_id = igo_groupe.id - ) - SELECT s.id AS groupe_id, - s.nom, - s.contexte_id, - s.groupe_id AS parent_groupe_id, - btrim(s.nom_complet::text, '/'::text) AS nom_complet, - s.est_exclu_arbre, - s.grp - FROM s - WHERE NOT (concat(s.contexte_id, s.grp) IN ( SELECT concat(s_1.contexte_id, substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1)) AS substr - FROM s s_1)) AND s.contexte_id IS NOT NULL AND NULLIF(s.nom_complet::text, ''::text) IS NOT NULL - ORDER BY s.grp; - -DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif_materialized; -CREATE MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized AS - SELECT * FROM igo_vue_contexte_groupes_recursif -WITH DATA; - --- -DROP VIEW IF EXISTS igo_vue_contexte_couche_navigateur; -CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS - WITH a AS ( - SELECT cc.contexte_id, - cc.couche_id, - cgr.groupe_id, - cc.est_visible, - cc.arbre_id, - cgr.parent_groupe_id, - cc.est_active, - igo_couche.est_fond_de_carte, - CASE - WHEN igo_couche.est_fond_de_carte THEN igo_couche.mf_layer_name::text - WHEN cgr.parent_groupe_id IS NULL THEN igo_couche.mf_layer_name::text - ELSE concat(igo_couche.mf_layer_name, '_', cgr.parent_groupe_id) - END AS mf_layer_name, - igo_couche.mf_layer_name AS mf_layer_name_igo, - COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - cc.mf_layer_meta_title AS mf_layer_meta_title2, - COALESCE(NULLIF(cc.mf_layer_meta_group_title::text, ''::text), igo_couche.mf_layer_meta_title::text) AS mf_layer_meta_title, - cgr.nom_complet AS mf_layer_meta_group_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_def, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.mf_layer_labelminscale_denom, - igo_couche.mf_layer_labelmaxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche.mf_layer_meta_attribution_title, - cc.layer_a_order, - cgr.nom_complet AS nom_groupe, - igo_couche.geometrie_id, - cc.ind_fond_de_carte, - cgr.est_exclu_arbre, - cgr.grp, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level - FROM igo_couche_contexte cc - JOIN igo_couche ON cc.couche_id = igo_couche.id - JOIN igo_vue_contexte_groupes_recursif cgr ON cgr.contexte_id = cc.contexte_id AND cgr.grp = cc.arbre_id::text - ORDER BY length(cc.arbre_id::text) - length(replace(cc.arbre_id::text, '_'::text, ''::text)) - ) - SELECT a.contexte_id, - a.couche_id, - a.groupe_id, - last(a.est_visible) AS est_visible, - last(a.est_active) AS est_active, - last(a.est_fond_de_carte) AS est_fond_de_carte, - last(a.mf_layer_name) AS mf_layer_name, - a.mf_layer_name_igo, - last(a.mf_layer_meta_name) AS mf_layer_meta_name, - last(a.mf_layer_meta_title) AS mf_layer_meta_title, - last(a.mf_layer_group) AS mf_layer_group, - last(a.mf_layer_meta_def) AS mf_layer_meta_def, - last(COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order)) AS mf_layer_meta_z_order, - last(a.mf_layer_minscale_denom) AS mf_layer_minscale_denom, - last(a.mf_layer_maxscale_denom) AS mf_layer_maxscale_denom, - last(a.mf_layer_labelminscale_denom) AS mf_layer_labelminscale_denom, - last(a.mf_layer_labelmaxscale_denom) AS mf_layer_labelmaxscale_denom, - last(a.print_option_url) AS print_option_url, - last(a.print_option_layer_name) AS print_option_layer_name, - last(a.fiche_csw_id) AS fiche_csw_id, - last(a.mf_layer_opacity) AS mf_layer_opacity, - last(a.mf_layer_meta_attribution_title) AS mf_layer_meta_attribution_title, - last(a.layer_a_order) AS layer_a_order, - last(a.mf_layer_meta_group_title) AS mf_layer_meta_group_title, - last(igo_connexion_type.connexion_type) AS connexion_type, - last(igo_catalogue_csw.url) AS catalogue_csw_url, - last(igo_connexion.connexion) AS connexion, - last(a.max_zoom_level) AS max_zoom_level, - last(a.min_zoom_level) AS min_zoom_level, - last(COALESCE(igo_connexion_type.ind_data, true)) AS ind_data - FROM a - JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id - JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id - LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id - LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id - LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id - LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id - WHERE a.est_visible OR a.est_active - GROUP BY a.couche_id, a.groupe_id, a.contexte_id, a.arbre_id, a.mf_layer_name_igo - ORDER BY last(a.layer_a_order); - - -alter table igo_contexte add column generer_onlineResource boolean; - -ALTER TABLE ONLY igo_groupe_groupe - ADD CONSTRAINT fk_groupe_groupe_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); - -ALTER TABLE ONLY igo_groupe_groupe - ADD CONSTRAINT fk_groupe_groupe_groupe_parent FOREIGN KEY (parent_groupe_id) REFERENCES igo_groupe(id); diff --git a/pilotage/app/sql/igo_migration_0.2_0.3.sql b/pilotage/app/sql/igo_migration_0.2_0.3.sql deleted file mode 100644 index d7f0f968..00000000 --- a/pilotage/app/sql/igo_migration_0.2_0.3.sql +++ /dev/null @@ -1,137 +0,0 @@ ---set search_path="igo"; - --- Effectuer les chantements à la structure de la base de données. -ALTER TABLE igo_contexte ALTER COLUMN mf_map_meta_onlineresource SET NOT NULL; -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_utilisateur_nom_unique UNIQUE (nom); -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_profil_nom_unique UNIQUE (nom); -ALTER TABLE igo_couche ADD COLUMN mf_layer_meta_attribution_title CHARACTER VARYING(5000); -ALTER TABLE igo_contexte ADD COLUMN generer_onlineResource BOOLEAN DEFAULT true; - -DROP VIEW igo_vue_contexte_couche_navigateur; -CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS - SELECT a.contexte_id, - a.id AS couche_id, - a.groupe_id, - a.est_visible, - a.est_active, - CASE a.est_fond_de_carte - WHEN a.ind_fond_de_carte = 'D'::bpchar THEN a.est_fond_de_carte - ELSE a.ind_fond_de_carte = 'O'::bpchar - END AS est_fond_de_carte, - a.mf_layer_name, - COALESCE(a.mf_layer_meta_name, a.mf_layer_meta_name2) AS mf_layer_meta_name, - COALESCE(a.mf_layer_meta_title, a.mf_layer_meta_title2) AS mf_layer_meta_title, - a.mf_layer_group, - COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - a.mf_layer_minscale_denom, - a.mf_layer_maxscale_denom, - a.print_option_url, - a.print_option_layer_name, - a.fiche_csw_id, - a.mf_layer_opacity, - a.mf_layer_meta_attribution_title, - COALESCE(a.layer_a_order, a.layer_a_order2) AS layer_a_order, - a.nom AS mf_layer_meta_group_title, - igo_connexion_type.connexion_type, - igo_catalogue_csw.url AS catalogue_csw_url, - igo_connexion.connexion, - a.max_zoom_level, - a.min_zoom_level - FROM ( SELECT igo_couche_contexte.contexte_id, - igo_couche.id, - igo_vue_groupes_recursif.groupe_id, - igo_couche_contexte.est_visible, - igo_couche_contexte.est_active, - igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, - igo_couche_contexte.mf_layer_meta_name AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - igo_couche_contexte.mf_layer_meta_title AS mf_layer_meta_title2, - igo_couche.mf_layer_meta_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche.mf_layer_meta_attribution_title, - igo_couche_contexte.layer_a_order AS layer_a_order2, - igo_couche.layer_a_order, - igo_vue_groupes_recursif.nom, - igo_couche.geometrie_id, - igo_couche_contexte.ind_fond_de_carte, - igo_vue_groupes_recursif.est_exclu_arbre, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level - FROM igo_couche_contexte - JOIN igo_couche ON igo_couche_contexte.couche_id = igo_couche.id - JOIN igo_groupe_couche ON igo_groupe_couche.id = igo_couche_contexte.groupe_couche_id AND igo_couche.id = igo_groupe_couche.couche_id - JOIN igo_vue_groupes_recursif ON igo_vue_groupes_recursif.groupe_id = igo_groupe_couche.groupe_id AND igo_vue_groupes_recursif.parent_groupe_id IS NULL - UNION - SELECT igo_couche_contexte.contexte_id, - igo_couche.id, - igo_vue_groupes_recursif.groupe_id, - igo_couche_contexte.est_visible, - igo_couche_contexte.est_active, - igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, - igo_couche_contexte.mf_layer_meta_name AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - igo_couche_contexte.mf_layer_meta_title AS mf_layer_meta_title2, - igo_couche.mf_layer_meta_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche.mf_layer_meta_attribution_title, - igo_couche_contexte.layer_a_order AS layer_a_order2, - igo_couche.layer_a_order, - CASE - WHEN igo_vue_groupes_recursif.parent_groupe_id IS NOT NULL THEN (igo_couche_contexte.mf_layer_meta_title::text || '/'::text) || igo_vue_groupes_recursif.nom - ELSE igo_vue_groupes_recursif.nom - END AS nom, - igo_couche.geometrie_id, - igo_couche_contexte.ind_fond_de_carte, - igo_vue_groupes_recursif.est_exclu_arbre, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level - FROM igo_couche_contexte - JOIN igo_vue_groupes_recursif ON igo_couche_contexte.couche_id IS NULL AND (igo_couche_contexte.groupe_id = igo_vue_groupes_recursif.parent_groupe_id OR igo_couche_contexte.groupe_id = igo_vue_groupes_recursif.groupe_id) - JOIN igo_groupe_couche ON igo_vue_groupes_recursif.groupe_id = igo_groupe_couche.groupe_id - JOIN igo_couche ON igo_groupe_couche.couche_id = igo_couche.id) a - JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id - JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id - LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id - LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id - LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id - LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id - WHERE NOT a.est_exclu_arbre; - --- Effectuer la migration des données d'attribution -update igo_couche -set - mf_layer_meta_attribution_title=s.wms_attribution_title, - mf_layer_meta_def=s.mf_layer_meta_def -from( - select - id, - substring(substring(mf_layer_meta_def,position('"wms_attribution_title"' in mf_layer_meta_def)+25),0,position('"' in substring(mf_layer_meta_def,position('"wms_attribution_title"' in mf_layer_meta_def)+25))) as wms_attribution_title, - replace(mf_layer_meta_def,'"wms_attribution_title" "' || substring(substring(mf_layer_meta_def,position('"wms_attribution_title"' in mf_layer_meta_def)+25),0,position('"' in substring(mf_layer_meta_def,position('"wms_attribution_title"' in mf_layer_meta_def)+25))) || '"','') as mf_layer_meta_def - from igo_couche - where mf_layer_meta_def like '%wms_attribution_title%' -) s -where s.id=igo_couche.id; - - --- Effectuer une modification a l'url de connexion Google_97d -update igo_connexion set connexion = 'http://maps.googleapis.com/maps/api/js?V=3.6&sensor=false' where id=2; - - -alter table igo_vue_contexte_couche_navigateur OWNER TO igo; -alter table igo_vue_permission_profil OWNER TO igo; diff --git a/pilotage/app/sql/igo_migration_0.3_0.4.sql b/pilotage/app/sql/igo_migration_0.3_0.4.sql deleted file mode 100644 index 54eb8d39..00000000 --- a/pilotage/app/sql/igo_migration_0.3_0.4.sql +++ /dev/null @@ -1,105 +0,0 @@ - -create or replace view igo_vue_contexte_couche_navigateur as -SELECT a.contexte_id, - a.id AS couche_id, - a.groupe_id, - a.est_visible, - a.est_active, - CASE a.est_fond_de_carte - WHEN a.ind_fond_de_carte = 'D'::bpchar THEN a.est_fond_de_carte - ELSE a.ind_fond_de_carte = 'O'::bpchar - END AS est_fond_de_carte, - a.mf_layer_name, - COALESCE(a.mf_layer_meta_name, a.mf_layer_meta_name2) AS mf_layer_meta_name, - COALESCE(a.mf_layer_meta_title, a.mf_layer_meta_title2) AS mf_layer_meta_title, - a.mf_layer_group, - COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - a.mf_layer_minscale_denom, - a.mf_layer_maxscale_denom, - a.print_option_url, - a.print_option_layer_name, - a.fiche_csw_id, - a.mf_layer_opacity, - COALESCE(a.layer_a_order, a.layer_a_order2) AS layer_a_order, - a.nom AS mf_layer_meta_group_title, - igo_connexion_type.connexion_type, - igo_catalogue_csw.url AS catalogue_csw_url, - igo_connexion.connexion, - a.max_zoom_level, - a.min_zoom_level, - a.mf_layer_meta_def - FROM ( ( SELECT igo_couche_contexte.contexte_id, - igo_couche.id, - igo_vue_groupes_recursif.groupe_id, - igo_couche_contexte.est_visible, - igo_couche_contexte.est_active, - igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, - igo_couche_contexte.mf_layer_meta_name AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - igo_couche_contexte.mf_layer_meta_title AS mf_layer_meta_title2, - igo_couche.mf_layer_meta_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche_contexte.layer_a_order AS layer_a_order2, - igo_couche.layer_a_order, - igo_vue_groupes_recursif.nom, - igo_couche.geometrie_id, - igo_couche_contexte.ind_fond_de_carte, - igo_vue_groupes_recursif.est_exclu_arbre, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level, - igo_couche.mf_layer_meta_def - FROM igo_couche_contexte - JOIN igo_couche ON igo_couche_contexte.couche_id = igo_couche.id - JOIN igo_groupe_couche ON igo_couche.id = igo_groupe_couche.couche_id - JOIN igo_vue_groupes_recursif ON igo_vue_groupes_recursif.groupe_id = igo_groupe_couche.groupe_id AND igo_vue_groupes_recursif.parent_groupe_id IS NULL - UNION - SELECT igo_couche_contexte.contexte_id, - igo_couche.id, - igo_vue_groupes_recursif.groupe_id, - igo_couche_contexte.est_visible, - igo_couche_contexte.est_active, - igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, - igo_couche_contexte.mf_layer_meta_name AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - igo_couche_contexte.mf_layer_meta_title AS mf_layer_meta_title2, - igo_couche.mf_layer_meta_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche_contexte.layer_a_order AS layer_a_order2, - igo_couche.layer_a_order, - CASE WHEN igo_vue_groupes_recursif.parent_groupe_id is not null THEN igo_couche_contexte.mf_layer_meta_title||'/'||igo_vue_groupes_recursif.nom - ELSE igo_vue_groupes_recursif.nom END as nom, - igo_couche.geometrie_id, - igo_couche_contexte.ind_fond_de_carte, - igo_vue_groupes_recursif.est_exclu_arbre, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level, - igo_couche.mf_layer_meta_def - FROM igo_couche_contexte - JOIN igo_vue_groupes_recursif ON igo_couche_contexte.couche_id IS NULL - AND ((igo_couche_contexte.groupe_id = igo_vue_groupes_recursif.parent_groupe_id) OR - (igo_couche_contexte.groupe_id = igo_vue_groupes_recursif.groupe_id)) - JOIN igo_groupe_couche ON igo_vue_groupes_recursif.groupe_id = igo_groupe_couche.groupe_id - JOIN igo_couche ON igo_groupe_couche.couche_id = igo_couche.id)) a - JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id - JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id - LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id - LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id - LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id - LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id - WHERE NOT a.est_exclu_arbre; \ No newline at end of file diff --git a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql deleted file mode 100644 index f1c3c8c3..00000000 --- a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql +++ /dev/null @@ -1,185 +0,0 @@ --- Pour les vues matérialisées -DROP VIEW IF EXISTS igo_vue_contexte_couche_navigateur; -DROP MATERIALIZED VIEW IF EXISTS igo_vue_contexte_groupes_recursif_materialized; -DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif; -DROP MATERIALIZED VIEW IF EXISTS igo_vue_groupes_recursif_materialized; -DROP VIEW IF EXISTS igo_vue_groupes_recursif; - -CREATE VIEW igo_vue_contexte_groupes_recursif AS - WITH RECURSIVE s(id, nom, contexte_id, groupe_id, grp) AS ( - SELECT g.id, - g.nom, - cc.contexte_id, - gg_1.parent_groupe_id AS groupe_id, - g.id::text AS grp, - CASE - WHEN COALESCE(cc.est_visible, false) AND NOT g.est_exclu_arbre THEN COALESCE(cc.mf_layer_meta_group_title, g.nom)::character varying(500) - ELSE ''::character varying(500) - END AS nom_complet, - g.est_exclu_arbre - FROM igo_groupe g - LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id - LEFT JOIN igo_couche_contexte cc ON cc.arbre_id::text = g.id::text AND cc.couche_id IS NULL - UNION - SELECT igo_groupe.id, - igo_groupe.nom, - cc.contexte_id, - s_1.id AS groupe_id, - (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, - CASE - WHEN COALESCE(cc.est_visible, false) AND NOT s_1.est_exclu_arbre THEN (((s_1.nom_complet::text || '/'::text) || COALESCE(cc.mf_layer_meta_group_title, igo_groupe.nom)::character varying(500)::text))::character varying(500) - ELSE ''::character varying(500) - END AS nom_complet, - igo_groupe.est_exclu_arbre - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id - LEFT JOIN igo_couche_contexte cc ON s_1.contexte_id = cc.contexte_id AND cc.arbre_id::text = concat(s_1.grp, '_', gg_1.groupe_id) AND cc.couche_id IS NULL - WHERE gg_1.groupe_id = igo_groupe.id - ) - SELECT s.id AS groupe_id, - s.nom, - s.contexte_id, - s.groupe_id AS parent_groupe_id, - btrim(s.nom_complet::text, '/'::text) AS nom_complet, - s.est_exclu_arbre, - s.grp - FROM s - WHERE NOT (concat(s.contexte_id, s.grp) IN ( SELECT concat(s_1.contexte_id, substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1)) AS substr - FROM s s_1)) AND s.contexte_id IS NOT NULL AND NULLIF(s.nom_complet::text, ''::text) IS NOT NULL - ORDER BY s.grp; - -CREATE MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized AS - SELECT * FROM igo_vue_contexte_groupes_recursif -WITH DATA; - -CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS - WITH a AS ( - SELECT cc.contexte_id, - cc.couche_id, - cgr.groupe_id, - cc.est_visible, - cc.arbre_id, - cgr.parent_groupe_id, - cc.est_active, - igo_couche.est_fond_de_carte, - CASE - WHEN igo_couche.est_fond_de_carte THEN igo_couche.mf_layer_name::text - WHEN cgr.parent_groupe_id IS NULL THEN igo_couche.mf_layer_name::text - ELSE concat(igo_couche.mf_layer_name, '_', cgr.parent_groupe_id) - END AS mf_layer_name, - igo_couche.mf_layer_name AS mf_layer_name_igo, - COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - cc.mf_layer_meta_title AS mf_layer_meta_title2, - COALESCE(NULLIF(cc.mf_layer_meta_group_title::text, ''::text), igo_couche.mf_layer_meta_title::text) AS mf_layer_meta_title, - cgr.nom_complet AS mf_layer_meta_group_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_def, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.mf_layer_labelminscale_denom, - igo_couche.mf_layer_labelmaxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche.mf_layer_meta_attribution_title, - cc.layer_a_order, - cgr.nom_complet AS nom_groupe, - igo_couche.geometrie_id, - cc.ind_fond_de_carte, - cgr.est_exclu_arbre, - cgr.grp, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level - FROM igo_couche_contexte cc - JOIN igo_couche ON cc.couche_id = igo_couche.id - JOIN igo_vue_contexte_groupes_recursif cgr ON cgr.contexte_id = cc.contexte_id AND cgr.grp = cc.arbre_id::text - ORDER BY length(cc.arbre_id::text) - length(replace(cc.arbre_id::text, '_'::text, ''::text)) - ) - SELECT a.contexte_id, - a.couche_id, - a.groupe_id, - last(a.est_visible) AS est_visible, - last(a.est_active) AS est_active, - last(a.est_fond_de_carte) AS est_fond_de_carte, - last(a.mf_layer_name) AS mf_layer_name, - a.mf_layer_name_igo, - last(a.mf_layer_meta_name) AS mf_layer_meta_name, - last(a.mf_layer_meta_title) AS mf_layer_meta_title, - last(a.mf_layer_group) AS mf_layer_group, - last(a.mf_layer_meta_def) AS mf_layer_meta_def, - last(COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order)) AS mf_layer_meta_z_order, - last(a.mf_layer_minscale_denom) AS mf_layer_minscale_denom, - last(a.mf_layer_maxscale_denom) AS mf_layer_maxscale_denom, - last(a.mf_layer_labelminscale_denom) AS mf_layer_labelminscale_denom, - last(a.mf_layer_labelmaxscale_denom) AS mf_layer_labelmaxscale_denom, - last(a.print_option_url) AS print_option_url, - last(a.print_option_layer_name) AS print_option_layer_name, - last(a.fiche_csw_id) AS fiche_csw_id, - last(a.mf_layer_opacity) AS mf_layer_opacity, - last(a.mf_layer_meta_attribution_title) AS mf_layer_meta_attribution_title, - last(a.layer_a_order) AS layer_a_order, - last(a.mf_layer_meta_group_title) AS mf_layer_meta_group_title, - last(igo_connexion_type.connexion_type) AS connexion_type, - last(igo_catalogue_csw.url) AS catalogue_csw_url, - last(igo_connexion.connexion) AS connexion, - last(a.max_zoom_level) AS max_zoom_level, - last(a.min_zoom_level) AS min_zoom_level, - last(COALESCE(igo_connexion_type.ind_data, true)) AS ind_data - FROM a - JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id - JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id - LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id - LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id - LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id - LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id - WHERE a.est_visible OR a.est_active - GROUP BY a.couche_id, a.groupe_id, a.contexte_id, a.arbre_id, a.mf_layer_name_igo - ORDER BY last(a.layer_a_order); - -CREATE VIEW igo_vue_groupes_recursif AS - WITH RECURSIVE s(id, nom, groupe_id, grp) AS ( - SELECT g.id, - g.nom, - gg_1.parent_groupe_id AS groupe_id, - g.id::text AS grp, - g.nom::character varying(500) AS nom_complet, - g.est_exclu_arbre - FROM igo_groupe g - LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id - UNION - SELECT igo_groupe.id, - igo_groupe.nom, - s_1.id AS groupe_id, - (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, - CASE igo_groupe.est_exclu_arbre - WHEN false THEN (((s_1.nom_complet::text || '/'::text) || igo_groupe.nom::character varying(500)::text))::character varying(500) - ELSE s_1.nom_complet - END AS nom_complet, - igo_groupe.est_exclu_arbre - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id - WHERE gg_1.groupe_id = igo_groupe.id - ) - SELECT s.id AS groupe_id, - s.nom, - s.groupe_id AS parent_groupe_id, - s.nom_complet, - s.est_exclu_arbre, - s.grp - FROM s - WHERE NOT (s.grp IN ( SELECT substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1) AS substr - FROM s s_1)) - ORDER BY s.grp; - -CREATE MATERIALIZED VIEW igo_vue_groupes_recursif_materialized AS - SELECT * FROM igo_vue_groupes_recursif -WITH DATA; - -ALTER SEQUENCE igo.igo_groupe_groupe_id_seq OWNED BY igo.igo_groupe_groupe.id; -ALTER SEQUENCE igo.igo_groupe_id_seq OWNED BY igo.igo_groupe.id; -ALTER TABLE ONLY igo.igo_groupe ALTER COLUMN id SET DEFAULT nextval('igo.igo_groupe_id_seq'::regclass); diff --git a/pilotage/app/sql/migration-0.3-vers-0.4.sql b/pilotage/app/sql/migration-0.3-vers-0.4.sql deleted file mode 100644 index 505606ba..00000000 --- a/pilotage/app/sql/migration-0.3-vers-0.4.sql +++ /dev/null @@ -1,412 +0,0 @@ -drop sequence igo_groupe_groupe_id_seq; -CREATE SEQUENCE igo_groupe_groupe_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -DROP TABLE IF EXISTS igo_groupe_groupe cascade; - - -CREATE TABLE igo_groupe_groupe -( - id integer NOT NULL DEFAULT nextval('igo_groupe_groupe_id_seq'::regclass), - groupe_id integer, - parent_groupe_id integer -); - -ALTER SEQUENCE igo_groupe_groupe_id_seq OWNED BY igo_groupe_groupe.id; - -CREATE INDEX igo_groupe_groupe_groupe_id_idx ON igo_groupe_groupe USING btree (groupe_id); - -delete from igo_groupe_groupe; -INSERT INTO igo_groupe_groupe -select nextval('igo_groupe_groupe_id_seq'::regclass) as id, groupe_id, parent_groupe_id from igo_vue_groupes_recursif where parent_groupe_id IS NOT NULL - --- Vieille vue inutile -DROP VIEW IF EXISTS igo_vue_profils_pour_groupes; -DROP VIEW igo_vue_permission_profil; - -DROP VIEW IF EXISTS igo_vue_contexte_couche_navigateur; -drop VIEW igo_vue_couche; -DROP VIEW IF EXISTS igo_vue_permissions_pour_couches; -DROP VIEW if exists igo_vue_permissions_pour_groupes; -drop VIEW igo_vue_groupes_recursif; - - -ALTER TABLE igo_couche_contexte ALTER COLUMN layer_a_order TYPE integer USING 0; -ALTER TABLE igo_couche ALTER COLUMN layer_a_order TYPE integer USING 0; - - - -CREATE OR REPLACE VIEW igo_vue_groupes_recursif AS - WITH RECURSIVE s(id, nom, groupe_id, grp) AS ( - SELECT g.id, - g.nom, - gg_1.parent_groupe_id AS groupe_id, - g.id::character varying(10)::text AS grp, - g.nom::character varying(500) AS nom_complet, - g.est_exclu_arbre - FROM igo_groupe g - LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id - UNION - SELECT igo_groupe.id, - igo_groupe.nom, - s_1.id AS groupe_id, - (s_1.grp::character varying(10)::text || ' '::text) || igo_groupe.id::character varying(10)::text AS grp, - CASE igo_groupe.est_exclu_arbre - WHEN false THEN (((s_1.nom_complet::text || '/'::text) || igo_groupe.nom::character varying(500)::text))::character varying(500) - ELSE s_1.nom_complet - END AS nom_complet, - igo_groupe.est_exclu_arbre - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id - WHERE gg_1.groupe_id = igo_groupe.id - ) - SELECT s.id AS groupe_id, - s.nom, - s.groupe_id AS parent_groupe_id, - s.nom_complet, - s.est_exclu_arbre, - s.grp - FROM s - ORDER BY s.grp; - - - -CREATE OR REPLACE VIEW igo_vue_couche AS - SELECT c.id, - c.description, - c.geometrie_id, - c.vue_validation, - c.mf_layer_name, - c.mf_layer_group, - c.mf_layer_meta_name, - c.mf_layer_filtre, - c.mf_layer_minscale_denom, - c.mf_layer_maxscale_denom, - c.mf_layer_labelminscale_denom, - c.mf_layer_labelmaxscale_denom, - c.mf_layer_def, - c.mf_layer_meta_def, - c.service_tuile, - e.catalogue_csw_id, - c.fiche_csw_id, - c.mf_layer_meta_wfs_max_feature, - c.est_fond_de_carte, - c.mf_layer_opacity, - c.mf_layer_meta_title, - c.mf_layer_meta_group_title, - c.mf_layer_labelitem, - COALESCE(c.mf_layer_meta_z_order, g.mf_layer_meta_z_order, gt.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - c.print_option_url, - c.print_option_layer_name, - c.est_commune, - c.est_publique, - c.layer_a_order, - c.max_zoom_level, - c.min_zoom_level, - g.classe_entite_id, - g.geometrie_type_id, - g.vue_defaut, - g.date_chargement, - g.connexion_id, - g.echelle_prod, - g.remarque AS remarque_geometrie, - g.ind_inclusion, - g.mf_layer_data, - g.mf_layer_projection, - g.acces, - e.nom AS nom_classe_entite, - e.description AS description_classe_entite, - e.source_entite_id, - e.classification_id, - e.organisme_responsable_id, - e.contact_id, - e.remarque AS remarque_classe_entite, - x.nom AS nom_connexion, - x.connexion, - x.connexion_type_id, - t.nom AS nom_connexion_type, - t.connexion_type, - gt.nom AS nom_geometrie_type, - gt.layer_type, - gt.geometrie_type - FROM igo_couche c, - igo_classe_entite e, - igo_geometrie g - LEFT JOIN igo_connexion x ON g.connexion_id = x.id - LEFT JOIN igo_connexion_type t ON x.connexion_type_id = t.id - LEFT JOIN igo_geometrie_type gt ON g.geometrie_type_id = gt.id - WHERE c.geometrie_id = g.id AND g.classe_entite_id = e.id; - - - - -CREATE OR REPLACE VIEW igo_vue_permissions_pour_groupes AS - WITH RECURSIVE permission_groupe(groupe_id, profil_id, est_lecture, est_analyse, est_ecriture, est_export, est_association) AS ( - SELECT igo_groupe.id AS groupe_id, - igo_permission.profil_id, - igo_permission.est_lecture, - igo_permission.est_analyse, - igo_permission.est_ecriture, - igo_permission.est_export, - igo_permission.est_association - FROM igo_groupe - JOIN igo_permission ON igo_groupe.id = igo_permission.groupe_id - UNION - SELECT igo_groupe.id AS groupe_id, - permission_groupe.profil_id, - permission_groupe.est_lecture OR igo_permission.est_lecture OR permission_groupe.est_association OR igo_permission.est_association AS est_lecture, - permission_groupe.est_analyse OR igo_permission.est_analyse OR permission_groupe.est_association OR igo_permission.est_association AS est_analyse, - permission_groupe.est_ecriture OR igo_permission.est_ecriture OR permission_groupe.est_association OR igo_permission.est_association AS est_ecriture, - permission_groupe.est_export OR igo_permission.est_export OR permission_groupe.est_association OR igo_permission.est_association AS est_export, - permission_groupe.est_association OR igo_permission.est_association OR permission_groupe.est_association OR igo_permission.est_association AS est_association - FROM igo_groupe, - igo_groupe_groupe gg_1 - JOIN permission_groupe ON permission_groupe.groupe_id = gg_1.parent_groupe_id - LEFT JOIN igo_permission ON gg_1.id = igo_permission.groupe_id - WHERE gg_1.groupe_id = igo_groupe.id - - - ) - SELECT permission_groupe.groupe_id, - permission_groupe.profil_id, - permission_groupe.est_lecture, - permission_groupe.est_analyse, - permission_groupe.est_ecriture, - permission_groupe.est_export, - permission_groupe.est_association - FROM permission_groupe; - - - -CREATE OR REPLACE VIEW igo_vue_permissions_pour_couches AS - SELECT igo_groupe_couche.couche_id, - igo_groupe_couche.groupe_id, - igo_vue_permissions_pour_groupes.profil_id, - igo_vue_permissions_pour_groupes.est_lecture OR igo_couche.est_publique OR igo_permission.est_lecture OR igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association AS est_lecture, - igo_vue_permissions_pour_groupes.est_analyse OR igo_permission.est_analyse OR igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association AS est_analyse, - igo_vue_permissions_pour_groupes.est_ecriture OR igo_permission.est_ecriture OR igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association AS est_ecriture, - igo_vue_permissions_pour_groupes.est_export OR igo_permission.est_export OR igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association AS est_export, - igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association OR igo_vue_permissions_pour_groupes.est_association OR igo_permission.est_association AS est_association - FROM igo_groupe_couche - JOIN igo_couche ON igo_groupe_couche.couche_id = igo_couche.id - LEFT JOIN igo_vue_permissions_pour_groupes ON igo_groupe_couche.groupe_id = igo_vue_permissions_pour_groupes.groupe_id - LEFT JOIN igo_permission ON igo_groupe_couche.id = igo_permission.groupe_couche_id; - --- - -CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS - WITH a AS ( - SELECT cc.contexte_id, - cc.couche_id, - igo_vue_groupes_recursif.groupe_id, - cc.est_visible, - cc.arbre_id, - igo_vue_groupes_recursif.parent_groupe_id, - cc.est_active, - igo_couche.est_fond_de_carte, - CASE - WHEN igo_couche.est_fond_de_carte THEN igo_couche.mf_layer_name::text - ELSE concat(igo_couche.mf_layer_name, '_', igo_vue_groupes_recursif.groupe_id) - END AS mf_layer_name, - COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, - igo_couche.mf_layer_meta_name, - cc.mf_layer_meta_title AS mf_layer_meta_title2, - COALESCE(NULLIF(cc.mf_layer_meta_group_title::text, ''::text), igo_couche.mf_layer_meta_title::text) AS mf_layer_meta_title, - cg2.mf_layer_meta_group_title, - igo_couche.mf_layer_group, - igo_couche.mf_layer_meta_def, - igo_couche.mf_layer_meta_z_order, - igo_couche.mf_layer_minscale_denom, - igo_couche.mf_layer_maxscale_denom, - igo_couche.print_option_url, - igo_couche.print_option_layer_name, - igo_couche.fiche_csw_id, - igo_couche.mf_layer_opacity, - igo_couche.mf_layer_meta_attribution_title, - cc.layer_a_order, - CASE - WHEN cg2.est_visible THEN - CASE - WHEN NULLIF(cg2.mf_layer_meta_group_title::text, ''::text) IS NOT NULL THEN concat(cg2.mf_layer_meta_group_title::text, substr(igo_vue_groupes_recursif.nom_complet::text, strpos(concat(igo_vue_groupes_recursif.nom_complet::text, '/'), '/'::text)))::character varying::text - ELSE igo_vue_groupes_recursif.nom_complet::text - END - ELSE regexp_replace(igo_vue_groupes_recursif.nom_complet::text, '^.*/'::text, ''::text) - END AS nom_groupe, - igo_couche.geometrie_id, - cc.ind_fond_de_carte, - igo_vue_groupes_recursif.est_exclu_arbre, - igo_vue_groupes_recursif.grp, - igo_couche.max_zoom_level, - igo_couche.min_zoom_level - FROM igo_couche_contexte cc - JOIN igo_groupe_couche ON igo_groupe_couche.couche_id = cc.couche_id - JOIN igo_couche_contexte ccg ON ccg.couche_id IS NULL AND ccg.groupe_id = igo_groupe_couche.groupe_id AND ccg.contexte_id = cc.contexte_id - JOIN igo_couche ON cc.couche_id = igo_couche.id - JOIN igo_vue_groupes_recursif ON igo_vue_groupes_recursif.groupe_id = ccg.groupe_id - JOIN igo_couche_contexte cg2 ON substr(concat(igo_vue_groupes_recursif.grp, ' '), 0, strpos(concat(igo_vue_groupes_recursif.grp, ' '), ' '::text))::integer = cg2.groupe_id AND cg2.contexte_id = cc.contexte_id AND cg2.couche_id IS NULL AND ccg.arbre_id::text = cc.arbre_id::text AND concat('_', cc.arbre_id, '_') ~~ concat('%_', igo_vue_groupes_recursif.parent_groupe_id, '_%') - ), c AS ( - SELECT a_1.contexte_id, - a_1.couche_id, - a_1.groupe_id, - a_1.est_visible, - a_1.arbre_id, - a_1.parent_groupe_id, - a_1.est_active, - a_1.est_fond_de_carte, - a_1.mf_layer_name, - a_1.mf_layer_meta_name2, - a_1.mf_layer_meta_name, - a_1.mf_layer_meta_title2, - a_1.mf_layer_meta_title, - a_1.mf_layer_meta_group_title, - a_1.mf_layer_group, - a_1.mf_layer_meta_def, - a_1.mf_layer_meta_z_order, - a_1.mf_layer_minscale_denom, - a_1.mf_layer_maxscale_denom, - a_1.print_option_url, - a_1.print_option_layer_name, - a_1.fiche_csw_id, - a_1.mf_layer_opacity, - a_1.mf_layer_meta_attribution_title, - a_1.layer_a_order, - a_1.nom_groupe, - a_1.geometrie_id, - a_1.ind_fond_de_carte, - a_1.est_exclu_arbre, - a_1.grp, - a_1.max_zoom_level, - a_1.min_zoom_level, - length(replace(a_1.nom_groupe, '/'::text, '//'::text)) - length(a_1.nom_groupe) AS ordre - FROM a a_1 - ORDER BY a_1.couche_id, length(replace(a_1.nom_groupe, '/'::text, '//'::text)) - length(a_1.nom_groupe), a_1.arbre_id - ), b AS ( - SELECT last(a_1.contexte_id) AS contexte_id, - last(a_1.couche_id) AS couche_id, - last(a_1.groupe_id) AS groupe_id, - last(a_1.geometrie_id) AS geometrie_id, - last(a_1.est_visible) AS est_visible, - last(a_1.est_active) AS est_active, - last( - CASE a_1.est_fond_de_carte - WHEN a_1.ind_fond_de_carte = 'D'::bpchar THEN a_1.est_fond_de_carte - ELSE a_1.ind_fond_de_carte = 'O'::bpchar - END) AS est_fond_de_carte, - a_1.mf_layer_name, - last(COALESCE(NULLIF(a_1.mf_layer_meta_name::text, ''::text), a_1.mf_layer_meta_name2::text)) AS mf_layer_meta_name, - last(COALESCE(NULLIF(a_1.mf_layer_meta_title, ''::text), a_1.mf_layer_meta_title2::text)) AS mf_layer_meta_title, - last(a_1.mf_layer_group) AS mf_layer_group, - last(a_1.mf_layer_meta_def) AS mf_layer_meta_def, - last(a_1.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - last(a_1.mf_layer_minscale_denom) AS mf_layer_minscale_denom, - last(a_1.mf_layer_maxscale_denom) AS mf_layer_maxscale_denom, - last(a_1.print_option_url) AS print_option_url, - last(a_1.print_option_layer_name) AS print_option_layer_name, - last(a_1.fiche_csw_id) AS fiche_csw_id, - last(a_1.mf_layer_opacity) AS mf_layer_opacity, - last(a_1.mf_layer_meta_attribution_title) AS mf_layer_meta_attribution_title, - last(a_1.layer_a_order) AS layer_a_order, - last(a_1.nom_groupe::character varying) AS mf_layer_meta_group_title, - last(a_1.max_zoom_level) AS max_zoom_level, - last(a_1.min_zoom_level) AS min_zoom_level - FROM c a_1 - GROUP BY a_1.contexte_id, a_1.mf_layer_name, a_1.arbre_id - ) - SELECT DISTINCT a.contexte_id, - a.couche_id, - a.groupe_id, - a.est_visible, - a.est_active, - a.est_fond_de_carte, - a.mf_layer_name, - a.mf_layer_meta_name, - a.mf_layer_meta_title, - a.mf_layer_group, - a.mf_layer_meta_def, - COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order) AS mf_layer_meta_z_order, - a.mf_layer_minscale_denom, - a.mf_layer_maxscale_denom, - a.print_option_url, - a.print_option_layer_name, - a.fiche_csw_id, - a.mf_layer_opacity, - a.mf_layer_meta_attribution_title, - a.layer_a_order, - a.mf_layer_meta_group_title, - igo_connexion_type.connexion_type, - igo_catalogue_csw.url AS catalogue_csw_url, - igo_connexion.connexion, - a.max_zoom_level, - a.min_zoom_level, - igo_connexion_type.ind_data - FROM b a - JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id - JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id - LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id - LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id - LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id - LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id - WHERE a.est_visible OR a.est_active - ORDER BY a.layer_a_order; - - -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_utilisateur_nom_unique UNIQUE (nom); -ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_profil_nom_unique UNIQUE (nom); - -ALTER TABLE igo_couche ADD COLUMN mf_layer_meta_attribution_title CHARACTER VARYING(5000); -ALTER TABLE igo_couche_contexte DROP COLUMN groupe_couohe_id; -ALTER TABLE igo_permission DROP COLUMN groupe_couohe_id; -ALTER TABLE igo_couche_contexte ADD COLUMN arbre_id CHARACTER VARYING(50); - -update igo_couche_contexte cc set groupe_id=gc.groupe_id FROM igo_groupe_couche gc WHERE gc.couche_id=cc.couche_id; - ---delete from igo_couche_contexte where couche_id is null; - --- Ajouter les groupes manquants -INSERT INTO igo_couche_contexte (contexte_id, - couche_id, - groupe_id, - est_visible, - est_active, - ind_fond_de_carte, - mf_layer_meta_name, - mf_layer_meta_title, - mf_layer_meta_group_title, - mf_layer_class_def, - date_modif, - est_exclu, - attribut_id, - mf_layer_meta_z_order, - mf_layer_filtre, - layer_a_order, - arbre_id) -select - contexte_id , - null as couche_id, - igo_couche_contexte.groupe_id , - bool_or(est_visible) as est_visible, - bool_or(est_active) as est_active, - last(ind_fond_de_carte) as ind_fond_de_carte , - last(igo_groupe.nom) as mf_layer_meta_name, - null as mf_layer_meta_title , - null as mf_layer_meta_group_title, - null as mf_layer_class_def, - last(igo_couche_contexte.date_modif) as date_modif , - null as est_exclu, - null as attribut_id , - null as mf_layer_meta_z_order , - null as mf_layer_filtre, - max(layer_a_order) as layer_a_order , - last(replace(igo_vue_groupes_recursif.grp,' ','_')) as arbre_id from igo_couche_contexte - JOIN igo_groupe ON igo_couche_contexte.groupe_id=igo_groupe.id - JOIN igo_vue_groupes_recursif ON igo_couche_contexte.groupe_id=igo_vue_groupes_recursif.groupe_id - group by contexte_id,igo_couche_contexte.groupe_id - --- Ajouter arbre_id -update igo_couche_contexte cc set arbre_id=replace(g.grp,' ','_') FROM igo_vue_groupes_recursif g WHERE g.groupe_id=cc.groupe_id; \ No newline at end of file diff --git a/pilotage/app/validators/IgoEntier.php b/pilotage/app/validators/IgoEntier.php deleted file mode 100644 index 63f53781..00000000 --- a/pilotage/app/validators/IgoEntier.php +++ /dev/null @@ -1,21 +0,0 @@ - $params['field'], - 'pattern' => '/^\d{0,}$/', - 'message' => $message - )); - } -} diff --git a/pilotage/app/validators/IgoStringLength.php b/pilotage/app/validators/IgoStringLength.php deleted file mode 100644 index 9df5f90c..00000000 --- a/pilotage/app/validators/IgoStringLength.php +++ /dev/null @@ -1,40 +0,0 @@ - $params['field'], - 'max' => $max, - 'min' => $min, - 'messageMaximum' => $messageMaximum, - 'messageMinimum' => $messageMinimum - )); - - } - -} diff --git a/pilotage/app/views/classe_entite_et_geometrie/do.phtml b/pilotage/app/views/classe_entite_et_geometrie/do.phtml deleted file mode 100644 index fb77dbb3..00000000 --- a/pilotage/app/views/classe_entite_et_geometrie/do.phtml +++ /dev/null @@ -1,4 +0,0 @@ -getContent(); ?> - -view->includeCTL("igo_classe_entite","search?id=".$id); ?> -view->includeFrame($baseUri."/igo_geometrie","search?classe_entite_id=".$id); ?> diff --git a/pilotage/app/views/commun/date_modification.phtml b/pilotage/app/views/commun/date_modification.phtml deleted file mode 100644 index 74683663..00000000 --- a/pilotage/app/views/commun/date_modification.phtml +++ /dev/null @@ -1,16 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "date_modif", - "class" => "form-control", - 'readonly' => 'readonly', - 'disabled' => 'disabled')); - ?> -
    -
    - \ No newline at end of file diff --git a/pilotage/app/views/commun/edit.phtml b/pilotage/app/views/commun/edit.phtml deleted file mode 100644 index b0e194f0..00000000 --- a/pilotage/app/views/commun/edit.phtml +++ /dev/null @@ -1,34 +0,0 @@ - - -getContent(); ?> - -tag->form($controller."/save/".$retour) ?> - -
    -
    - tag->linkTo(array($retour, "")); ?> -
    -
    - -
    -
    -

    -
    -
    -partial($controller . "/table") ?> -
    -
    - tag->submitButton(array("Enregistrer", "class" => "btn btn-primary")) ?> -
    -
    - -tag->hiddenField("id") ?> - - \ No newline at end of file diff --git a/pilotage/app/views/commun/index.phtml b/pilotage/app/views/commun/index.phtml deleted file mode 100644 index e867d90b..00000000 --- a/pilotage/app/views/commun/index.phtml +++ /dev/null @@ -1,53 +0,0 @@ - -getContent() ?> - -
    -
    - tag->linkTo(array($retour, "")); ?> -
    -
    - igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> -
    -
    - -tag->form(array($controller . "/search", "autocomplete" => "off")) ?> - -
    -
    -

    -
    -
    - -
    -
    -

    Recherche par ID

    -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "id", - "class"=>"form-control" - )); - ?> -
    -
    -
    -
    -

    ou par critères

    -
    -
    -partial($controller . "/table") ?> -
    -
    -
    -
    - tag->submitButton(array("Rechercher", "class" => "btn btn-primary")) ?> -
    -
    - - - diff --git a/pilotage/app/views/commun/new.phtml b/pilotage/app/views/commun/new.phtml deleted file mode 100644 index 7f896c21..00000000 --- a/pilotage/app/views/commun/new.phtml +++ /dev/null @@ -1,31 +0,0 @@ - - - -
    -
    - tag->linkTo(array($retour, "")); ?> -
    -
    - -getContent(); ?> - -partial("commun/titre", array( "titre" =>$titre)) ?> - -tag->form($controller . "/create/" . $retour) ?> - -partial($controller . "/table") ?> -
    -
    - tag->submitButton(array("Enregistrer", 'class' => 'btn btn-primary')) ?> -
    -
    - - - - diff --git a/pilotage/app/views/commun/search_entete.phtml b/pilotage/app/views/commun/search_entete.phtml deleted file mode 100644 index ca24a739..00000000 --- a/pilotage/app/views/commun/search_entete.phtml +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    - tag->linkTo(array($controller."/index"."/".$r_controller."/".$action."/".$parameters, "")); ?> -
    -
    - escaper->escapeHtml(str_replace("%","",$criteres)). "
    ".$this->tag->linkTo($controller."/searchAll", ""); - } - ?> -
    -
    - igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> -
    -
    \ No newline at end of file diff --git a/pilotage/app/views/commun/search_pagination.phtml b/pilotage/app/views/commun/search_pagination.phtml deleted file mode 100644 index ce4c9f34..00000000 --- a/pilotage/app/views/commun/search_pagination.phtml +++ /dev/null @@ -1,12 +0,0 @@ -total_pages > 1) { - $estPremierePage = $page->current == 1; - $estDernierePage = ($page->total_pages == $page->current); -?> -
      -
    • tag->linkTo($controller."/$action?page=1", "Premier") ?>
    • -
    • tag->linkTo($controller."/$action?page=" . $page->before, "Précédent") ?>
    • -
    • page current, " de ", $page->total_pages ?>
    • -
    • tag->linkTo($controller."/$action?page=" . ((!$estDernierePage)?$page->next:$page->current), "Suivant") ?>
    • -
    • tag->linkTo($controller."/$action?page=" . $page->last, "Dernier") ?>
    • -
    - \ No newline at end of file diff --git a/pilotage/app/views/commun/titre.phtml b/pilotage/app/views/commun/titre.phtml deleted file mode 100644 index 393c90f7..00000000 --- a/pilotage/app/views/commun/titre.phtml +++ /dev/null @@ -1,5 +0,0 @@ -
    -
    -

    -
    -
    \ No newline at end of file diff --git a/pilotage/app/views/contexte_et_couche/do.phtml b/pilotage/app/views/contexte_et_couche/do.phtml deleted file mode 100644 index f48a4f7e..00000000 --- a/pilotage/app/views/contexte_et_couche/do.phtml +++ /dev/null @@ -1,4 +0,0 @@ -getContent(); ?> - -view->includeCTL("igo_contexte","search?id=".$id); ?> -view->includeFrame($baseUri."/igo_couche_contexte","search?contexte_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/couche_et_classe/do.phtml b/pilotage/app/views/couche_et_classe/do.phtml deleted file mode 100644 index 418a1ff1..00000000 --- a/pilotage/app/views/couche_et_classe/do.phtml +++ /dev/null @@ -1,4 +0,0 @@ -getContent(); ?> - -view->includeCTL("igo_couche","search?id=".$id); ?> -view->includeFrame($baseUri."/igo_classe","search?couche_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/geometrie_et_attribut/do.phtml b/pilotage/app/views/geometrie_et_attribut/do.phtml deleted file mode 100644 index efb5b046..00000000 --- a/pilotage/app/views/geometrie_et_attribut/do.phtml +++ /dev/null @@ -1,6 +0,0 @@ - getContent(); ?> - -view->includeCTL("igo_classe_entite","search?id=".$classe_entite_id); ?> -view->includeCTL("igo_geometrie","search?id=".$id); ?> -view->includeFrame($baseUri."/igo_attribut","search?geometrie_id=".$id); ?> - diff --git a/pilotage/app/views/geometrie_et_couche/do.phtml b/pilotage/app/views/geometrie_et_couche/do.phtml deleted file mode 100644 index 05a8b1d7..00000000 --- a/pilotage/app/views/geometrie_et_couche/do.phtml +++ /dev/null @@ -1,5 +0,0 @@ -getContent(); ?> - -view->includeCTL("igo_classe_entite","search?id=".$classe_entite_id); ?> - -view->includeFrame($baseUri."/igo_couche","search?geometrie_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/creation.phtml b/pilotage/app/views/gestion_couche/creation.phtml deleted file mode 100644 index 29baf8d0..00000000 --- a/pilotage/app/views/gestion_couche/creation.phtml +++ /dev/null @@ -1,68 +0,0 @@ - - -partial("commun/new", array( "titre" =>"Création rapide d'une couche")) ?> diff --git a/pilotage/app/views/gestion_couche/edition.phtml b/pilotage/app/views/gestion_couche/edition.phtml deleted file mode 100644 index 068f8bad..00000000 --- a/pilotage/app/views/gestion_couche/edition.phtml +++ /dev/null @@ -1,77 +0,0 @@ - - -getContent(); ?> -
    -
    - -
    -
    -view->includeCTL("igo_classe_entite","edit?".$classe_entite_id); ?> -
    -
    -
    -
    - -
    -
    -view->includeCTL("igo_connexion","edit?".$connexion_id); ?> -
    -
    -
    -
    - -
    -
    -view->includeCTL("igo_geometrie","edit?".$geometrie_id,$r_controller); ?> -
    -
    -
    -
    -
    -

    - - Couche - -

    -
    -
    -
    -view->includeCTL("igo_couche","edit?".$id,$r_controller); ?>
    -
    -
    -
    \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/loadMapfile.phtml b/pilotage/app/views/gestion_couche/loadMapfile.phtml deleted file mode 100644 index 182bea00..00000000 --- a/pilotage/app/views/gestion_couche/loadMapfile.phtml +++ /dev/null @@ -1,24 +0,0 @@ -tag->form("gestion_couche/traiteMapfile") ?> - -partial("commun/titre", array("titre" =>"Charger une définition de LAYER")) ?> - -
    -
    - tag->textArea(array( - 'code', - 'cols' => 120, - 'rows' => 40, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    -
    tag->submitButton(array("Traiter", "class" => 'btn btn-primary')) ?>
    -
    -
    - tag->hiddenField("id") ?> - - - \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/mapfile.volt b/pilotage/app/views/gestion_couche/mapfile.volt deleted file mode 100644 index 3811b640..00000000 --- a/pilotage/app/views/gestion_couche/mapfile.volt +++ /dev/null @@ -1,90 +0,0 @@ -{{ content() }} -{% if preview%}
    {% endif %}
    -#DEBUG 5
    -MAP
    -    #INCLUDE "../include/ec/ec_map.map"
    -    #INCLUDE "../include/ec/ec_web.map"
    -    {{ mapfileInclude }}
    -    NAME "{{ couche['mf_layer_name'] }}"
    -    EXTENT -1100000 -23500 1100000 2253500
    -    WEB
    -        METADATA
    -           "wms_title"                  "{{ couche['mf_layer_meta_title']}}"
    -           "wms_name"                   "{{ couche['mf_layer_meta_name']}}"
    -           "wms_abstract"               ""
    -           "wms_description"            ""
    -           "wms_keywordlist"            ""
    -           "wms_onlineresource"         ""
    -        END
    -    END
    -    PROJECTION
    -                {% if 'proj=' in (couche['mf_layer_projection']| trim) %}{{couche['mf_layer_projection']}}{% else %}"init=epsg:{{couche['mf_layer_projection']}}"{% endif %}
    -
    -    END
    -
    -    LEGEND
    -        STATUS ON
    -        KEYSIZE 22 22
    -		LABEL
    -			TYPE TRUETYPE
    -			FONT "arial"
    -			COLOR 0 0 0
    -			SIZE 10
    -			POSITION CL
    -			OFFSET 0 0
    -			SHADOWSIZE 2 2
    -			ANTIALIAS TRUE
    -		END
    -    END
    -    LAYER
    -            #INCLUDE "../include/ec/ec_getfeature.map"
    -            NAME '{{ couche['mf_layer_name']}}'
    -            TYPE {{couche['layer_type']}}
    -
    -            GROUP "{{ couche['mf_layer_group']}}"
    -
    -           {% if couche['connexion_type'] is defined %} CONNECTIONTYPE {{couche['connexion_type']}}{% endif %}
    -
    -           {% if couche['connexion'] is defined %} CONNECTION "{{couche['connexion']}}"   
    -            PROCESSING "CLOSE_CONNECTION=DEFER"{% endif %}
    -
    -            {% if couche['mf_layer_data'] is defined and couche['mf_layer_data']<>""%}DATA "{{ couche['mf_layer_data']}}"{% endif %}
    -
    -            {% if couche['mf_layer_minscale_denom']|trim<>"" %}MINSCALE  {{ couche['mf_layer_minscale_denom']}}{% endif %}
    -
    -            {% if couche['mf_layer_maxscale_denom']|trim<>"" %}MAXSCALE  {{ couche['mf_layer_maxscale_denom']}}{% endif %}
    -
    -            {% if couche['mf_layer_labelminscale_denom']|trim<>"" %}LABELMINSCALE {{ couche['mf_layer_labelminscale_denom']}}{% endif %}
    -
    -            {% if couche['mf_layer_labelmaxscale_denom']|trim<>"" %}LABELMAXSCALE {{ couche['mf_layer_labelmaxscale_denom']}}{% endif %}
    -
    -            {% if couche['mf_layer_opacity']|trim<>"" %}OPACITY {{ couche['mf_layer_opacity']}}{% endif %}             
    -
    -            {% if couche['mf_layer_filter']|trim<>"" %}FILTER "{{ couche['mf_layer_filter']}}"{% endif %}
    -
    -            {% if couche['mf_layer_projection']|trim<>"" %}
    -
    -            PROJECTION
    -                    {% if 'proj=' in (couche['mf_layer_projection']| trim) %} {{couche['mf_layer_projection']}} {% else %}  "init=epsg:{{couche['mf_layer_projection']}}"   {% endif %}
    -
    -            END
    -            {% endif  %}
    -
    -            METADATA
    -                    #INCLUDE  "../include/ec/ec_meta_layer.map"   
    -                    "wms_group_title"      "{{ couche['mf_layer_meta_group_title']}}" 
    -                    "wms_name"             "{{ couche['mf_layer_name']}}"
    -                    "wms_title"            "{{ couche['mf_layer_meta_title']}}"                        
    -                    "z_order"              "{{ couche['mf_layer_meta_z_order']}}"                        
    -
    -                    {{ couche['mf_layer_meta_def']}}
    -
    -            END
    -
    -            {{ couche['mf_layer_def']}}
    -
    -            {{ couche['mf_layer_class_def']}}
    -
    -    END
    -END
    -{% if preview %}
    {% endif %} diff --git a/pilotage/app/views/gestion_couche/table.phtml b/pilotage/app/views/gestion_couche/table.phtml deleted file mode 100644 index c50c3ee9..00000000 --- a/pilotage/app/views/gestion_couche/table.phtml +++ /dev/null @@ -1,554 +0,0 @@ -CONNECTIONTYPE {type_connexion}END"); -?> -
    -

    Géométrie

    -
    - -
    -
    - -
    -
    - tag->select(array( - "classe_entite_id", - IgoClasseEntite::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    \"wms_name\" \"{nom_classe_entite}\"
    END
    END")); - ?> -
    -
    - tag->linkTo(array("igo_classe_entite/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, "Créer", 'class'=>'creer')); ?> - tag->linkTo(array("igo_classe_entite/edit" . "/" . $this->tag->getValue("classe_entite_id") . "/" . $r_controller . "/" . $action . "/" . $parameters, " Modifier")); ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "geometrie_type_id", - IgoGeometrieType::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    TYPE {type_geometrie}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "acces", - ($this->view->getActionName() == "index") ? - array("D" => "Distant", - "L" => "Local") : - array("D" => "Distant", - "L" => "Local"), - "class" => "form-control")); ?> -
    -
    - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_data", - "class" => "form-control", - "placeholder" => "Ex : Vigilance/Inondation-crue/Instruments de surveillance", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    DATA \"{chemin_acces_donnees}\"
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_projection", - "class" => "form-control", - "placeholder" => "Ex : init=epsg:32198", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    PROJECTION
    \"{projection}\"
    END
    END" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "id_ici", - IgoGroupe::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control")); - ?> -
    Reste à définir comment on gère l'inclusion des attributs -
    -
    -

    Connexion

    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_type_id_vertoriel", - "name" => "connexion_type_id", - IgoConnexionType::find(array("geometrie_type='V'", "order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => TOOLTIP_CONNECTION_TYPE)); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_type_id_raster", - "name" => "connexion_type_id", - IgoConnexionType::find(array("geometrie_type='R'", "order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => TOOLTIP_CONNECTION_TYPE)); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_type_id_chart", - "name" => "connexion_type_id", - IgoConnexionType::find(array("geometrie_type='C'", "order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => TOOLTIP_CONNECTION_TYPE)); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_type_id_query", - "name" => "connexion_type_id", - IgoConnexionType::find(array("geometrie_type='Q'", "order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => TOOLTIP_CONNECTION_TYPE)); - ?> -
    -
    -
    -

    Couche

    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_name", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    NAME \"{nom_code}\"
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_title", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    \"wms_title\" \"{titre}\"
    END
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_group", - "class" => "form-control", - "placeholder" => "Ex : chemin/vers/le/groupe/nom_du_groupe", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    GROUP \"{code_groupe}\"
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_group_title", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    \"wms_group_title\" \"{titre_groupe}\"
    END
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "fiche_csw_id", - "class" => "form-control", - "placeholder" => "Ex : 557940e9-5dfa-4a92-a140-8afd1618975d")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_minscale_denom", - "type" => "number", - "placeholder" => "Ex : 2", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    MINSCALE {min}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_maxscale_denom", - "type" => "number", - "placeholder" => "Ex : 8", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    MAXSCALE {max}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_opacity", - "type" => "number", - "placeholder" => "Ex : 80", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    CLASS
    STYLE
    OPACITY {opacite}
    END
    END
    END")); - ?> -
    -
    -
    -

    Classe

    -
    - -
    -
    - -
    -
    - tag->textArea(array( - 'mf_class_def', - "class" => "form-control", - 'cols' => 80, - 'rows' => 20, - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    CLASS
    {class_def}
    END
    END")); - ?> -
    -
    -
    -
    -
    -
    - tag->checkField(array('vue-avancee', "value" => '1')); ?> - -
    -
    -
    -

    Couche

    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelminscale_denom", - "type" => "number", - "placeholder" => "Ex : 2", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    LABELMINSCALE {min}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelmaxscale_denom", - "type" => "number", - "placeholder" => "Ex : 10", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    LABELMAXSCALE {max}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_wfs_max_feature", - "type" => "number", - "placeholder" => "Ex : 500", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    \"wfs_maxfeatures\" {max}
    END
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelitem", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    LABELITEM \"{nom_attribut_affichage}\"
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textArea(array( - 'mf_layer_def', - "class" => "form-control", - 'cols' => 50, - 'rows' => 10, - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    {layer_def}
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textArea(array( - 'mf_layer_meta_def', - "class" => "form-control", - 'cols' => 50, - 'rows' => 5, - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    {layer_meta_def}
    END
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_z_order", - "class" => "form-control", - "placeholder" => "Ex : 100", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    METADATA
    z_order {ordre}
    END
    END")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_filtre", - "class" => "form-control", - "placeholder" => "Ex : champ_un = \"toto\" AND champ_deux > 100", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "LAYER
    FILTER {filtre}
    END" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "groupe_id", - "class" => "form-control", - IgoGroupe::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true)); - ?> -
    -
    - tag->linkTo(array( - "igo_groupe/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, - "Créer")); - ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_fond_de_carte", "value" => 1)); ?> - -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "vue_validation", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "Description textuelle de la couche. Utilisée dans l'outil de gestion uniquement.")); - ?> -
    -
    -tag->hiddenField(array('connexion_type_id')); ?> -tag->hiddenField(array('connexion_id')); ?> -tag->hiddenField(array('mf_layer_filter')); ?> -tag->hiddenField(array('z_order')); ?> \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/traiteMapfile.phtml b/pilotage/app/views/gestion_couche/traiteMapfile.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/gestion_couche/traiteMapfile.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_attribut/edit.phtml b/pilotage/app/views/igo_attribut/edit.phtml deleted file mode 100644 index 5436a7ad..00000000 --- a/pilotage/app/views/igo_attribut/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/index.phtml b/pilotage/app/views/igo_attribut/index.phtml deleted file mode 100644 index 52c2ed24..00000000 --- a/pilotage/app/views/igo_attribut/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/new.phtml b/pilotage/app/views/igo_attribut/new.phtml deleted file mode 100644 index 043590ad..00000000 --- a/pilotage/app/views/igo_attribut/new.phtml +++ /dev/null @@ -1,2 +0,0 @@ - -partial("commun/new", array( "titre" =>"Créer un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/search.phtml b/pilotage/app/views/igo_attribut/search.phtml deleted file mode 100644 index 1f5e37ed..00000000 --- a/pilotage/app/views/igo_attribut/search.phtml +++ /dev/null @@ -1,54 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Attributs")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - - - - items as $igo_attribut) { ?> - - - - - - - - - - - - - - - - - - - - - -
    tag->linkTo("igo_attribut/search?order=id", "Attribut") ?>GéometrieColonneAliastag->linkTo("igo_attribut/search?order=description", "Description") ?>CléNomDescriptionFiltreGéométrieIncluListe de valeurtag->linkTo("igo_attribut/search?order=date_modif", "Date de modification") ?>
    id ?>IgoGeometrie){echo $igo_attribut->IgoGeometrie->IgoClasseEntite->nom.":".$igo_attribut->IgoGeometrie->IgoGeometrieType->nom;} ?>colonne ?>alias ?>description ?>tag->setDefault("est_cle", $igo_attribut->est_cle); - echo $this->tag->checkField(array("est_cle", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_nom", $igo_attribut->est_nom); - echo $this->tag->checkField(array("est_nom", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_description", $igo_attribut->est_description); - echo $this->tag->checkField(array("est_description", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_filtre", $igo_attribut->est_filtre); - echo $this->tag->checkField(array("est_filtre", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_geometrie", $igo_attribut->est_geometrie); - echo $this->tag->checkField(array("est_geometrie", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_inclu", $igo_attribut->est_inclu); - echo $this->tag->checkField(array("est_inclu", "value" => 1, "disabled" =>1)) ?>IgoListeValeur){echo $igo_attribut->ListeValeur->description;} ?>date_modif ?>tag->linkTo(array("igo_attribut/edit/" . $igo_attribut->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_attribut/delete/" . $igo_attribut->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation' => 'supprimer')); ?>
    -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_attribut/table.phtml b/pilotage/app/views/igo_attribut/table.phtml deleted file mode 100644 index aa02f476..00000000 --- a/pilotage/app/views/igo_attribut/table.phtml +++ /dev/null @@ -1,106 +0,0 @@ -
    -
    - -
    -
    - session->has("geometrie_id")) { - $this->tag->setDefault("geometrie_id", $this->session->get("geometrie_id")); - } - ?> - tag->select(array( - "geometrie_id", - IgoGeometrie::find(array("order" => "vue_defaut")), - "using" => array("id", "vue_defaut"), - "emptyText" => "Choisir...", - "useEmpty" => true - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("colonne", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("alias", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("description", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_cle", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_nom", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_description", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_filtre", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_geometrie", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_inclu", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "liste_valeur_id", - IgoListeValeur::find(array("order" => "description")), - "using" => array("id", "description"), - "emptyText" => "Choisir...", - "useEmpty" => true)) ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/edit.phtml b/pilotage/app/views/igo_catalogue_csw/edit.phtml deleted file mode 100644 index 806a8f45..00000000 --- a/pilotage/app/views/igo_catalogue_csw/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/index.phtml b/pilotage/app/views/igo_catalogue_csw/index.phtml deleted file mode 100644 index ee3c6571..00000000 --- a/pilotage/app/views/igo_catalogue_csw/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/new.phtml b/pilotage/app/views/igo_catalogue_csw/new.phtml deleted file mode 100644 index 0c980c22..00000000 --- a/pilotage/app/views/igo_catalogue_csw/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/search.phtml b/pilotage/app/views/igo_catalogue_csw/search.phtml deleted file mode 100644 index 175734d1..00000000 --- a/pilotage/app/views/igo_catalogue_csw/search.phtml +++ /dev/null @@ -1,41 +0,0 @@ - - -partial("commun/titre", array("titre" =>"Catalogues CSW")) ?> - -getContent(); ?> - -partial("commun/search_entete") ?> - - - - - - - - - - - - items as $igo_catalogue_csw) { ?> - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/table.phtml b/pilotage/app/views/igo_catalogue_csw/table.phtml deleted file mode 100644 index d8352f95..00000000 --- a/pilotage/app/views/igo_catalogue_csw/table.phtml +++ /dev/null @@ -1,13 +0,0 @@ -
    -
    - -
    -
    - tag->textField(array( - "url", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_classe/edit.phtml b/pilotage/app/views/igo_classe/edit.phtml deleted file mode 100644 index 22a8b039..00000000 --- a/pilotage/app/views/igo_classe/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une classe")) ?> diff --git a/pilotage/app/views/igo_classe/index.phtml b/pilotage/app/views/igo_classe/index.phtml deleted file mode 100644 index be254c4c..00000000 --- a/pilotage/app/views/igo_classe/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une classe")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe/new.phtml b/pilotage/app/views/igo_classe/new.phtml deleted file mode 100644 index dd3f4aa9..00000000 --- a/pilotage/app/views/igo_classe/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une classe")) ?> diff --git a/pilotage/app/views/igo_classe/search.phtml b/pilotage/app/views/igo_classe/search.phtml deleted file mode 100644 index 7cd6e5eb..00000000 --- a/pilotage/app/views/igo_classe/search.phtml +++ /dev/null @@ -1,41 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Classes")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - items as $igo_classe) { ?> - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe/table.phtml b/pilotage/app/views/igo_classe/table.phtml deleted file mode 100644 index 3fdb870b..00000000 --- a/pilotage/app/views/igo_classe/table.phtml +++ /dev/null @@ -1,33 +0,0 @@ - -
    -
    - -
    -
    - tag->select(array( - "couche_id", - IgoCouche::find(array("order" => "mf_layer_name")), - "using" => array("id", "mf_layer_name"), - "emptyText" => "Choisir...", - "useEmpty" => true)) - ?> -
    -
    -
    -
    - -
    -
    -tag->textArea(array('mf_class_def', 'cols' => 80, 'rows' => 20)) ?> -
    -
    -
    -
    - -
    -
    -tag->textField(array("mf_class_z_order", "size" => 10)) ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/edit.phtml b/pilotage/app/views/igo_classe_entite/edit.phtml deleted file mode 100644 index 04633edc..00000000 --- a/pilotage/app/views/igo_classe_entite/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/index.phtml b/pilotage/app/views/igo_classe_entite/index.phtml deleted file mode 100644 index 312275db..00000000 --- a/pilotage/app/views/igo_classe_entite/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/new.phtml b/pilotage/app/views/igo_classe_entite/new.phtml deleted file mode 100644 index b68a3e2a..00000000 --- a/pilotage/app/views/igo_classe_entite/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/search.phtml b/pilotage/app/views/igo_classe_entite/search.phtml deleted file mode 100644 index 49c73bd7..00000000 --- a/pilotage/app/views/igo_classe_entite/search.phtml +++ /dev/null @@ -1,60 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Classes entité")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - items as $igo_classe_entite) { ?> - - - - - - - - IgoCatalogueCsw) { ?> - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/table.phtml b/pilotage/app/views/igo_classe_entite/table.phtml deleted file mode 100644 index c35777d5..00000000 --- a/pilotage/app/views/igo_classe_entite/table.phtml +++ /dev/null @@ -1,125 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "source_entite_id", - IgoSourceEntite::find(array("order" => "url")), - "using" => array("id", "url"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "classification_id", - IgoClassification::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "organisme_responsable_id", - $organisme_desc, - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "contact_id", - IgoContact::find(array( - 'columns' => 'id, ' . new RawValue('CONCAT (nom, ", ", prenom) as nomPrenom'), - "order" => "nom")), - "using" => array("id", "nomPrenom"), - "useEmpty" => true, - 'emptyText' => 'Choisir...', - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "remarque", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "catalogue_csw_id", - IgoCatalogueCsw::find(array("order" => "url")), - "using" => array("id", "url"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classification/edit.phtml b/pilotage/app/views/igo_classification/edit.phtml deleted file mode 100644 index 881f1086..00000000 --- a/pilotage/app/views/igo_classification/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une classification")) ?> diff --git a/pilotage/app/views/igo_classification/index.phtml b/pilotage/app/views/igo_classification/index.phtml deleted file mode 100644 index 2e9010e3..00000000 --- a/pilotage/app/views/igo_classification/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une classification")) ?> diff --git a/pilotage/app/views/igo_classification/new.phtml b/pilotage/app/views/igo_classification/new.phtml deleted file mode 100644 index 774f5c27..00000000 --- a/pilotage/app/views/igo_classification/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une classification")) ?> diff --git a/pilotage/app/views/igo_classification/search.phtml b/pilotage/app/views/igo_classification/search.phtml deleted file mode 100644 index bf470031..00000000 --- a/pilotage/app/views/igo_classification/search.phtml +++ /dev/null @@ -1,41 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Classifications")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - items as $igo_classification) { ?> - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classification/table.phtml b/pilotage/app/views/igo_classification/table.phtml deleted file mode 100644 index 3afff009..00000000 --- a/pilotage/app/views/igo_classification/table.phtml +++ /dev/null @@ -1,35 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "code_geonetwork", - "class" => "form-control" - )); ?> -
    -
    -partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_connexion/edit.phtml b/pilotage/app/views/igo_connexion/edit.phtml deleted file mode 100644 index 6e315ffe..00000000 --- a/pilotage/app/views/igo_connexion/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/index.phtml b/pilotage/app/views/igo_connexion/index.phtml deleted file mode 100644 index 2995259c..00000000 --- a/pilotage/app/views/igo_connexion/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/new.phtml b/pilotage/app/views/igo_connexion/new.phtml deleted file mode 100644 index 666e2ce8..00000000 --- a/pilotage/app/views/igo_connexion/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/search.phtml b/pilotage/app/views/igo_connexion/search.phtml deleted file mode 100644 index 7d852dfc..00000000 --- a/pilotage/app/views/igo_connexion/search.phtml +++ /dev/null @@ -1,41 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Connexions")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - items as $igo_connexion) { ?> - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/table.phtml b/pilotage/app/views/igo_connexion/table.phtml deleted file mode 100644 index 22732751..00000000 --- a/pilotage/app/views/igo_connexion/table.phtml +++ /dev/null @@ -1,42 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textArea(array( - "connexion", - "cols" => 100, - "rows" => 20, - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_type_id", - IgoConnexionType::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_connexion_type/edit.phtml b/pilotage/app/views/igo_connexion_type/edit.phtml deleted file mode 100644 index 053324e0..00000000 --- a/pilotage/app/views/igo_connexion_type/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un type de connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml b/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml deleted file mode 100644 index a57a1619..00000000 --- a/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml b/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml deleted file mode 100644 index df1665a5..00000000 --- a/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/index.phtml b/pilotage/app/views/igo_connexion_type/index.phtml deleted file mode 100644 index f002e784..00000000 --- a/pilotage/app/views/igo_connexion_type/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un type de connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/new.phtml b/pilotage/app/views/igo_connexion_type/new.phtml deleted file mode 100644 index 0cb1f820..00000000 --- a/pilotage/app/views/igo_connexion_type/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un type de connexion")) ?> diff --git a/pilotage/app/views/igo_connexion_type/search.phtml b/pilotage/app/views/igo_connexion_type/search.phtml deleted file mode 100644 index f69a72fb..00000000 --- a/pilotage/app/views/igo_connexion_type/search.phtml +++ /dev/null @@ -1,41 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Types de connexion")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - items as $igo_connexion_type) { ?> - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/table.phtml b/pilotage/app/views/igo_connexion_type/table.phtml deleted file mode 100644 index f857ffab..00000000 --- a/pilotage/app/views/igo_connexion_type/table.phtml +++ /dev/null @@ -1,73 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "connexion_type", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "geometrie_type", - ($this->view->getActionName() == "index") ? - array( - "" => " ", - "C" => "Chart", - "Q" => "Query", - "R" => "Raster", - "V" => "Vectoriel") : - array( - "C" => "Chart", - "Q" => "Query", - "R" => "Raster", - "V" => "Vectoriel"), - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("ind_data", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("ind_vue", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("ind_projection", "value" => 1)) ?> -
    -
    -partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_contact/edit.phtml b/pilotage/app/views/igo_contact/edit.phtml deleted file mode 100644 index a57a1619..00000000 --- a/pilotage/app/views/igo_contact/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/index.phtml b/pilotage/app/views/igo_contact/index.phtml deleted file mode 100644 index df1665a5..00000000 --- a/pilotage/app/views/igo_contact/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/new.phtml b/pilotage/app/views/igo_contact/new.phtml deleted file mode 100644 index 10c9b99d..00000000 --- a/pilotage/app/views/igo_contact/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/search.phtml b/pilotage/app/views/igo_contact/search.phtml deleted file mode 100644 index ce41ed02..00000000 --- a/pilotage/app/views/igo_contact/search.phtml +++ /dev/null @@ -1,49 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Contacts")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - items as $igo_contact) { ?> - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/table.phtml b/pilotage/app/views/igo_contact/table.phtml deleted file mode 100644 index 2e758eb5..00000000 --- a/pilotage/app/views/igo_contact/table.phtml +++ /dev/null @@ -1,116 +0,0 @@ - -
    -
    - -
    -
    - tag->select(array( - "organisme_responsable_id", - IgoOrganismeResponsable::find(array("order" => "nom")), "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "prenom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "poste", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "no_telephone", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "courriel", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array( - "est_membre_acrigeo", - "value" => 1 - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "remarque", - "class" => "form-control" - )); - ?> -
    -
    - -
    -
    - -
    -
    - tag->textField(array( - "date_modif", - "class" => "form-control", - 'readonly' => 'readonly', - 'disabled' => 'disabled')); - ?> -
    -
    - \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/edit.phtml b/pilotage/app/views/igo_contexte/edit.phtml deleted file mode 100644 index 1e267e48..00000000 --- a/pilotage/app/views/igo_contexte/edit.phtml +++ /dev/null @@ -1,2 +0,0 @@ - -partial("commun/edit", array( "titre" =>"Modifier un contexte")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/index.phtml b/pilotage/app/views/igo_contexte/index.phtml deleted file mode 100644 index 445cd0a9..00000000 --- a/pilotage/app/views/igo_contexte/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un contexte")) ?> diff --git a/pilotage/app/views/igo_contexte/mapfile.volt b/pilotage/app/views/igo_contexte/mapfile.volt deleted file mode 100644 index 6ee55b01..00000000 --- a/pilotage/app/views/igo_contexte/mapfile.volt +++ /dev/null @@ -1,127 +0,0 @@ -{{ content() }} -{% if preview%}
    {% endif %}
    -MAP
    -    #DEBUG 5
    -    #INCLUDE "../include/ec/ec_map.map"  
    -    #INCLUDE "../include/ec/ec_web.map"
    -    {{ mapfileInclude }}
    -
    -    NAME "{{ contexte['code'] }}"
    -    EXTENT -1100000 -23500 1100000 2253500
    -    WEB
    -        METADATA
    -           "wms_title"                  "{{ contexte['code']}}"
    -           "wms_name"                   "{{ contexte['nom'] }}"
    -           "wms_abstract"               ""
    -           "wms_description"            "{{ contexte['description'] }}"
    -           "wms_keywordlist"            ""
    -            {% if contexte['generer_onlineresource'] == true %}
    -           "wms_onlineresource"         "{{ contexte['wms_onlineresource'] }}"
    -           {% endif %}
    -        END
    -    END
    -    PROJECTION
    -        {{contexte['mf_map_projection']}}
    -
    -    END
    -
    -    LEGEND
    -        STATUS ON
    -        KEYSIZE 22 22
    -		LABEL
    -			TYPE TRUETYPE
    -			FONT "arial"
    -			COLOR 0 0 0
    -			SIZE 10
    -			POSITION CL
    -			OFFSET 0 0
    -			SHADOWSIZE 2 2
    -			ANTIALIAS TRUE
    -		END
    -    END
    -    		{{ contexte['mf_map_def']}} 
    -
    -{% for couche in contexteCouches %}
    -    
    -    {% if couche.ind_data and (couche.est_visible or couche.est_active) %}
    -        LAYER
    -            NAME "{{couche.mf_layer_name}}"
    -            TYPE {{couche.IgoCouche.IgoGeometrie.IgoGeometrieType.layer_type}}
    -
    -            GROUP "{{couche.mf_layer_group}}"
    -
    -            {% if couche.connexion_type is defined %} CONNECTIONTYPE {{couche.connexion_type}}{% endif %}
    -
    -            {% if couche.connexion is defined %} CONNECTION "{{couche.connexion}}"   
    -            PROCESSING "CLOSE_CONNECTION=DEFER"{% endif %}
    -
    -            {% if couche.IgoCouche.IgoGeometrie.mf_layer_data is defined and couche.IgoCouche.IgoGeometrie.mf_layer_data<>""%}DATA "{{ couche.IgoCouche.IgoGeometrie.mf_layer_data}}"{% endif %}
    -
    -            {% if couche.mf_layer_minscale_denom|trim<>"" %}MINSCALE  {{ couche.mf_layer_minscale_denom}}{% endif %}
    -
    -            {% if couche.mf_layer_maxscale_denom|trim<>"" %}MAXSCALE  {{ couche.mf_layer_maxscale_denom}}{% endif %}
    -
    -            {% if couche.mf_layer_labelminscale_denom is defined and couche.mf_layer_labelminscale_denom|trim<>""  %}LABELMINSCALE {{ couche.mf_layer_labelminscale_denom}}{% endif %}
    -
    -            {% if couche.mf_layer_labelmaxscale_denom is defined and  couche.mf_layer_labelmaxscale_denom|trim<>"" %}LABELMAXSCALE {{ couche.mf_layer_labelmaxscale_denom}}{% endif %}
    -
    -            {% if couche.mf_layer_filter is defined and couche.mf_layer_filter|trim<>"" %}FILTER "{{ couche.mf_layer_filter}}"{% endif %}
    -
    -            {% if couche.IgoCouche.IgoGeometrie.mf_layer_projection is defined and couche.IgoCouche.IgoGeometrie.mf_layer_projection|trim<>"" %}
    -
    -            PROJECTION
    -                 {% if 'proj=' in (couche.IgoCouche.IgoGeometrie.mf_layer_projection | trim) %} {{couche.IgoCouche.IgoGeometrie.mf_layer_projection}} {% else %}  "init=epsg:{{couche.IgoCouche.IgoGeometrie.mf_layer_projection}}"   {% endif %}
    -            END
    -            {% endif  %}
    -
    -            METADATA
    -                "layer_name_igo" "{{ couche.mf_layer_name_igo}}"
    -                "wms_group_title"      "{{ couche.mf_layer_meta_group_title}}"
    -                "wms_name"             "{{ couche.mf_layer_meta_name}}"
    -                "wms_title"            "{{ couche.mf_layer_meta_title}}"
    -                "z_order"              "{{ couche.mf_layer_meta_z_order}}"
    -                "msp_classe_meta"      "{{ couche.fiche_csw_id}}"
    -                {% if couche.mf_layer_opacity|trim<>"" %}"OPACITY" "{{ couche.mf_layer_opacity}}"{% endif %}
    -
    -                {% if couche.IgoCouche.mf_layer_meta_wfs_max_feature is defined and couche.IgoCouche.mf_layer_meta_wfs_max_feature|trim<>"" %}
    -                "wfs_maxfeatures" "{{ couche.IgoCouche.mf_layer_meta_wfs_max_feature}}"
    -
    -                {% endif  %}
    -                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "E"%}
    -                "gml_include_items" "all"
    -                "gml_exclude_items" "{% set firsthit = true %}{% for attribut in couche.IgoCouche.IgoGeometrie.IgoAttribut%}{% if attribut.est_inclu == false%}{% if firsthit==false %},{% else %}{% set firsthit=false %}{% endif %}{{attribut.colonne}}{% endif %}{% endfor %}"
    -                {% endif %}
    -                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "I"%}
    -                "gml_exclude_items" "all"
    -                "gml_include_items" "{% set firsthit = true %}{% for attribut in couche.IgoCouche.IgoGeometrie.IgoAttribut%}{% if attribut.est_inclu == true%}{% if firsthit==false %},{% else %}{% set firsthit=false %}{% endif %}{{attribut.colonne}}{% endif %}{% endfor %}"
    -                {% endif %}
    -                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "T"%}
    -                "gml_include_items" "all"
    -                {% endif %}
    -
    -                {#{{ couche['include_items']}}#}
    -                {#{{ couche['exclude_items']}}#}
    -                {{ couche.IgoCouche.mf_layer_meta_def}}
    -
    -                {% if couche.IgoCouche.mf_layer_meta_attribution_title is defined and couche.IgoCouche.mf_layer_meta_attribution_title|trim<>"" %}
    -                "wms_attribution_title" "{{ couche.IgoCouche.mf_layer_meta_attribution_title }}"
    -                {% endif %}			
    -            END
    -
    -
    -            {{couche.IgoCouche.mf_layer_def}}
    -
    -            {% if couche.IgoCouche.mf_layer_labelitem|trim<>"" %}
    -            LABELITEM "{{ couche.IgoCouche.mf_layer_labelitem}}"
    -            {% endif  %}              
    -            {#{{ couche['mf_layer_class_def']}}#}
    -
    -            {% for classe in couchesClasses[couche.couche_id] %}
    -            {{classe.mf_class_def}}
    -            {% endfor %}
    -
    -        END
    -    {% endif %}
    -{% endfor  %}	
    -END
    -{% if preview %}
    {% endif %} diff --git a/pilotage/app/views/igo_contexte/new.phtml b/pilotage/app/views/igo_contexte/new.phtml deleted file mode 100644 index d11d8ca2..00000000 --- a/pilotage/app/views/igo_contexte/new.phtml +++ /dev/null @@ -1,2 +0,0 @@ - -partial("commun/new", array( "titre" =>"Créer un contexte")) ?> diff --git a/pilotage/app/views/igo_contexte/search.phtml b/pilotage/app/views/igo_contexte/search.phtml deleted file mode 100644 index 0b152e50..00000000 --- a/pilotage/app/views/igo_contexte/search.phtml +++ /dev/null @@ -1,65 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Contextes")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - - - items as $igo_contexte) { ?> - - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/table.phtml b/pilotage/app/views/igo_contexte/table.phtml deleted file mode 100644 index 3208aeee..00000000 --- a/pilotage/app/views/igo_contexte/table.phtml +++ /dev/null @@ -1,213 +0,0 @@ -session->get("info_utilisateur")->estAdmin; -?> - -
    -
    - -
    -
    - tag->textField(array("nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "profil_proprietaire_id", - IgoProfil::findAllProfils(), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("code", - "class" => "form-control", - "placeholder" => "Caractères acceptés : a-z et 0-9" - )); - ?> -
    -
    - -
    -
    - -
    -
    - tag->textField(array("description", - "class" => "form-control" - )); - ?> -
    -
    - - - -
    -
    - -
    -
    - tag->textField(array( - "zoom", - "type" => "number", - "class" => "form-control", - "placeholder" => "Ex : 12,34" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textArea(array( - "mf_map_def", - "class" => "form-control", - 'cols' => 80, - 'rows' => 5 - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_map_projection", - "type" => "number", - "class" => "form-control", - "placeholder" => "Ex : 32198" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_map_meta_onlineresource", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - Vous pouvez insérer automatiquement le Code du contexte en utilisant le mot clé {Code}. Par ex : /cgi-wms/mapserv.fcgi?map={Code}.map -
    -
    -
    -
    - -
    -
    - tag->checkField(array( - "generer_onlineresource", - "value" => true - )); - ?> -
    -
    -partial("commun/date_modification"); ?> -
    -
    - -
    -
    - tag->textField(array( - "json", - "class" => "form-control" - )); - ?> -
    -
    -view->getActionName()): -?> -
    -
    -

    Fonctionalitées avancées

    -
    -
    - -
    -
    -
    -
    - -
    -
    - tag->select(array( - "id_contexte_a_dupliquer", - $igoContextesQuilPossede, - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - Les groupes et les couches du contexte sélectionné seront automatiquement ajouté au nouveau contexte. -
    -
    - \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/associerContexte.phtml b/pilotage/app/views/igo_couche/associerContexte.phtml deleted file mode 100644 index dee1436c..00000000 --- a/pilotage/app/views/igo_couche/associerContexte.phtml +++ /dev/null @@ -1,5 +0,0 @@ - -getContent(); ?> -view->includeCTL("igo_contexte","search?id=".$id); ?> -view->includeCTL("igo_couche","associerContexteEdit?contexte_id=".$id."&page=".$page,$r_controller); ?> - diff --git a/pilotage/app/views/igo_couche/associerContexteEdit.phtml b/pilotage/app/views/igo_couche/associerContexteEdit.phtml deleted file mode 100644 index 8a4371e3..00000000 --- a/pilotage/app/views/igo_couche/associerContexteEdit.phtml +++ /dev/null @@ -1,59 +0,0 @@ - -partial("commun/titre", array("titre" =>"Associer des couches")) ?> -getContent(); ?> -tag->form() ?> - - - - - - - - - - - - - - - - - - items as $row) { ?> - - - - - - - - - - - - - - - - - - - - total_pages>1) { ?> - - - - - - -
    Id Assoc.TypeDescriptionInd. fond de carteFond de carteVisibleActivemf layer meta namemf layer meta titlemf layer meta group title
    id ?>type ?>description ?>tag->textField(array("ind_fond_de_carte_".$row->couche_id."_".$row->id,"value" => $row->ind_fond_de_carte, "size" => 1)) ?>tag->checkField(array("est_fond_de_carte_".$row->couche_id."_".$row->id, "value" => 1,"disabled" =>1, $row->est_fond_de_carte?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_visible_".$row->couche_id."_".$row->id, "value" => 1, $row->est_visible?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_active_".$row->couche_id."_".$row->id, "value" => 1, $row->est_active?"checked":"unchecked" => 1)) ?>tag->textField(array("mf_layer_meta_name_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_name,"value" => $row->mf_layer_meta_name,"size" => 10)) ?>tag->textField(array("mf_layer_meta_title_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_title, "size" => 10)) ?>tag->textField(array("mf_layer_meta_group_title_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_group_title, "size" => 10)) ?>tag->linkTo(array("igo_couche_contexte/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
    tag->submitButton("Sauver") ?>
    - - - - - - - - -
    tag->linkTo("igo_couche/associerContexte/".$contexte_id, "Premier") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->before, "Précédent") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->next, "Suivant") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->last, "Dernier") ?>current, "/", $page->total_pages ?>
    -
    diff --git a/pilotage/app/views/igo_couche/associerProfil.phtml b/pilotage/app/views/igo_couche/associerProfil.phtml deleted file mode 100644 index 7d60c4e1..00000000 --- a/pilotage/app/views/igo_couche/associerProfil.phtml +++ /dev/null @@ -1,7 +0,0 @@ - - -getContent(); ?> - -view->includeCTL("igo_profil","search?id=".$id); ?> -view->includeCTL("igo_couche","associerProfilEdit?profil_id=".$id,$r_controller); ?> - diff --git a/pilotage/app/views/igo_couche/associerProfilEdit.phtml b/pilotage/app/views/igo_couche/associerProfilEdit.phtml deleted file mode 100644 index b53b2b9c..00000000 --- a/pilotage/app/views/igo_couche/associerProfilEdit.phtml +++ /dev/null @@ -1,58 +0,0 @@ - - -getContent(); ?> - -tag->form() ?> - -partial("commun/titre", array("titre" =>"Associer des couches")) ?> - - - - - - - - - - - - - - - - items as $row) { ?> - - - - - - - - - - - - - - - - - - total_pages>1) { ?> - - - - - - -
    IdTypeDescriptionLectureAnalyseAnalyse(Sortie)ÉcritureExportation
    id ?>type ?>description ?>tag->checkField(array("est_lecture_".$row->id, "value" => 1, $row->est_lecture?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_analyse_".$row->id, "value" => 1, $row->est_analyse?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_analyse_out_".$row->id, "value" => 1, $row->est_analyse_out?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_ecriture_".$row->id, "value" => 1, $row->est_ecriture?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_exportation_".$row->id, "value" => 1, $row->est_exportation?"checked":"unchecked" => 1)) ?>tag->linkTo(array("igo_permission/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
    tag->submitButton("Sauver") ?>
    - - - - - - - - -
    tag->linkTo("igo_couche/search", "Premier") ?>tag->linkTo("igo_couche/search?page=" . $page->before, "Précédent") ?>tag->linkTo("igo_couche/search?page=" . $page->next, "Suivant") ?>tag->linkTo("igo_couche/search?page=" . $page->last, "Dernier") ?>current, "/", $page->total_pages ?>
    -
    diff --git a/pilotage/app/views/igo_couche/edit.phtml b/pilotage/app/views/igo_couche/edit.phtml deleted file mode 100644 index a911c7c4..00000000 --- a/pilotage/app/views/igo_couche/edit.phtml +++ /dev/null @@ -1,2 +0,0 @@ - -partial("commun/edit", array( "titre" =>"Modifier une couche")) ?> diff --git a/pilotage/app/views/igo_couche/fiche.phtml b/pilotage/app/views/igo_couche/fiche.phtml deleted file mode 100644 index 7a7ec77d..00000000 --- a/pilotage/app/views/igo_couche/fiche.phtml +++ /dev/null @@ -1,12 +0,0 @@ -getContent(); ?> - - - - -
    tag->linkTo(array($retour, "")); ?>
    -tag->stylesheetLink("csw/fiche.css");?> -
    -
    - -
    -
    diff --git a/pilotage/app/views/igo_couche/fiche_csw.phtml b/pilotage/app/views/igo_couche/fiche_csw.phtml deleted file mode 100644 index 7a7ec77d..00000000 --- a/pilotage/app/views/igo_couche/fiche_csw.phtml +++ /dev/null @@ -1,12 +0,0 @@ -getContent(); ?> - - - - -
    tag->linkTo(array($retour, "")); ?>
    -tag->stylesheetLink("csw/fiche.css");?> -
    -
    - -
    -
    diff --git a/pilotage/app/views/igo_couche/index.phtml b/pilotage/app/views/igo_couche/index.phtml deleted file mode 100644 index 2dfd57af..00000000 --- a/pilotage/app/views/igo_couche/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/new.phtml b/pilotage/app/views/igo_couche/new.phtml deleted file mode 100644 index e43890fe..00000000 --- a/pilotage/app/views/igo_couche/new.phtml +++ /dev/null @@ -1,2 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une couche")) ?> - diff --git a/pilotage/app/views/igo_couche/search.phtml b/pilotage/app/views/igo_couche/search.phtml deleted file mode 100644 index e16917b8..00000000 --- a/pilotage/app/views/igo_couche/search.phtml +++ /dev/null @@ -1,70 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Couches")) ?> - -
    -
    - tag->linkTo(array($controller."/index"."/".$r_controller."/".$action."/".$parameters, "")); ?> -
    -
    - escaper->escapeHtml(str_replace("%","",$criteres)). "
    ".$this->tag->linkTo($controller."/searchAll", ""); - } - ?> -
    -
    - igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> - -
    -
    - - - - - - - - - - - - - - - - - items as $row) { ?> - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/table.phtml b/pilotage/app/views/igo_couche/table.phtml deleted file mode 100644 index ddf0fcb1..00000000 --- a/pilotage/app/views/igo_couche/table.phtml +++ /dev/null @@ -1,440 +0,0 @@ - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_title", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_name", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control" - )); - ?> -
    -
    - -
    -
    - -
    -
    - tag->textField(array( - "fiche_csw_id", - "class" => "form-control" - )); - ?> -
    -
    - tag->linkTo(array("igo_couche/fiche" . "/" . $this->tag->getValue("id") . "/" . - $r_controller . "/" . $action . "/" . $parameters, - "Consulter")); - - ?> -
    -
    - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_group_title", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_group", - "class" => "form-control", - "data-toggle" => "tooltip", - "data-placement" => "right", - "title" => "Paramètre Group du mapfile" - )); - ?> -
    -
    - -
    -
    - -
    -
    - tag->select(array( - "geometrie_id", - $geometrie_desc, - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    - -
    - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "layer_a_order", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - - - -
    -
    - tag->textField(array( - "mf_layer_meta_z_order", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_minscale_denom", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_maxscale_denom", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelminscale_denom", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelmaxscale_denom", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - 0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, - 6=>6, 7=>7, 8=>8, 9=>9, 10=>10, 11=>11, - 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, - 17=>17, 18=>18, 19=>19, 20=>20); - - echo $this->tag->select(array( - "max_zoom_level", - $zoomLevel, - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->select(array( - "min_zoom_level", - $zoomLevel, - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_opacity", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    -
    -
    -
    -
    -
     
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_commune", "value" => 1)) ?> -
    -
    - - -
    -
    - -
    -
    - tag->checkField(array("est_publique", "value" => 1)) ?> -
    -
    - - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_name", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_filtre", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_labelitem", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textArea(array( - 'mf_layer_meta_def', - 'cols' => 50, - 'rows' => 5, - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textArea(array( - 'mf_layer_def', - 'cols' => 50, - 'rows' => 10, - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "service_tuile", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_wfs_max_feature", - "type" => "number", - "class" => "form-control" - )); - ?> -
    -
    - - -
    -
    - -
    -
    - tag->checkField(array("est_fond_de_carte", "value" => 1)) ?> - -
    -
    - - -
    -
    - -
    -
    - tag->textArea(array( - 'mf_layer_meta_attribution_title', - 'cols' => 50, - 'rows' => 5, - "class" => "form-control" - )); - ?> -
    -
    - -partial("commun/date_modification"); ?> -tag->hiddenField(array('acces')) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml b/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml deleted file mode 100644 index 4d2928f1..00000000 --- a/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml +++ /dev/null @@ -1,5 +0,0 @@ - -getContent(); ?> -view->includeCTL("igo_contexte","search?id=".$id); ?> -view->includeCTL("igo_couche_contexte","arbreCouchesEdit?contexte_id=".$id); ?> - diff --git a/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml b/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml deleted file mode 100644 index 3e58a43e..00000000 --- a/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - -getContent(); ?> - -tag->form(array("/igo_couche_contexte/arbreCouches/" . $contexte_id, 'id'=>'formArbo')); ?> - - -partial("commun/titre", array("titre" =>"Associer des groupes et des couches à un contexte")); ?> - -
    -
      -
    • Ouvrir
    • -
    • Fermer
    • -
    • Commun
    • -
    • tag->submitButton(array("Enregistrer", "class"=>"btn btn-primary", "id" =>"enregistrer")); ?>
    • -
    -
    - -
    -
    -
    - - -
    -
    -

    Légende

    -
      -
    • Visible
    • -
    • Actif
    • -
    • Coché
    • -
    • Partiel
    • -
    • Complet
    • -
    • Partiel grisé
    • -
    • Complet grisé
    • -
    • Exclu
    • -
    -
    -
    \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/edit.phtml b/pilotage/app/views/igo_couche_contexte/edit.phtml deleted file mode 100644 index 61c823ac..00000000 --- a/pilotage/app/views/igo_couche_contexte/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une association au contexte")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/editw.phtml b/pilotage/app/views/igo_couche_contexte/editw.phtml deleted file mode 100644 index 57eab744..00000000 --- a/pilotage/app/views/igo_couche_contexte/editw.phtml +++ /dev/null @@ -1,27 +0,0 @@ -tag->stylesheetLink("css/bootstrap.css"); ?> -getContent(); ?> -flash->output() ?> -tag->form($controller."/save/".$retour) ?> - - - - - - - - -
    Fermer
    - -partial("commun/titre", array("titre" =>"Modifier une association contexte/couche")) ?> - - - partial($controller."/table") ?> - - - - - -
    tag->hiddenField("id") ?>tag->submitButton("Sauver") ?>
    - - - diff --git a/pilotage/app/views/igo_couche_contexte/index.phtml b/pilotage/app/views/igo_couche_contexte/index.phtml deleted file mode 100644 index 69bb27bd..00000000 --- a/pilotage/app/views/igo_couche_contexte/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une association contexte/couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/new.phtml b/pilotage/app/views/igo_couche_contexte/new.phtml deleted file mode 100644 index 793c5d3b..00000000 --- a/pilotage/app/views/igo_couche_contexte/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une association contexte/couche")) ?> diff --git a/pilotage/app/views/igo_couche_contexte/search.phtml b/pilotage/app/views/igo_couche_contexte/search.phtml deleted file mode 100644 index d4bc1899..00000000 --- a/pilotage/app/views/igo_couche_contexte/search.phtml +++ /dev/null @@ -1,56 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Associations contextes/couches")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - - - items as $igo_couche_contexte) { ?> - - - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/table.phtml b/pilotage/app/views/igo_couche_contexte/table.phtml deleted file mode 100644 index 24710f04..00000000 --- a/pilotage/app/views/igo_couche_contexte/table.phtml +++ /dev/null @@ -1,166 +0,0 @@ - -
    -
    - -
    -
    - tag->select(array( - "contexte_id", - IgoContexte::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    -
    -
    - view->estGroupeDeCouche ? 'checked': ''; ?>>
    - view->estGroupeDeCouche ? 'checked': ''; ?>> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "groupe_couche_id", - $this->modelsManager->executeQuery('SELECT mf_layer_name, couche_id AS groupe_couche_id FROM IgoGroupeCouche AS gc INNER JOIN IgoCouche AS c ON c.id = gc.couche_id ORDER BY mf_layer_name'), - "using" => array("groupe_couche_id", "mf_layer_name"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "groupe_id", - IgoGroupe::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_visible", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_active", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "ind_fond_de_carte", - array( - "D" => "Défaut de la couche", - "O" => "Oui", - "N" => "Non"), - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_name", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_title", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_group_title", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "layer_a_order", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_z_order", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_class_def", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/edit.phtml b/pilotage/app/views/igo_geometrie/edit.phtml deleted file mode 100644 index 8b5589b3..00000000 --- a/pilotage/app/views/igo_geometrie/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/index.phtml b/pilotage/app/views/igo_geometrie/index.phtml deleted file mode 100644 index 72de58d6..00000000 --- a/pilotage/app/views/igo_geometrie/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/new.phtml b/pilotage/app/views/igo_geometrie/new.phtml deleted file mode 100644 index 4d14c3f5..00000000 --- a/pilotage/app/views/igo_geometrie/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une géométrie")) ?> diff --git a/pilotage/app/views/igo_geometrie/search.phtml b/pilotage/app/views/igo_geometrie/search.phtml deleted file mode 100644 index bc8b7519..00000000 --- a/pilotage/app/views/igo_geometrie/search.phtml +++ /dev/null @@ -1,45 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Géométries")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - items as $igo_geometrie) { ?> - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/table.phtml b/pilotage/app/views/igo_geometrie/table.phtml deleted file mode 100644 index 7311f5e2..00000000 --- a/pilotage/app/views/igo_geometrie/table.phtml +++ /dev/null @@ -1,183 +0,0 @@ - - -
    -
    - -
    -
    - tag->select(array( - "classe_entite_id", - IgoClasseEntite::find(array("order" => "nom")), "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control")); - ?> - -
    -
    -
    -
    - -
    -
    - tag->select(array( - "geometrie_type_id", - IgoGeometrieType::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control")); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "acces", - ($this->view->getActionName() == "index") ? - array( - "D" => "Distant", - "L" => "Local") : - array( - "D" => "Distant", - "L" => "Local"), - "class" => "form-control")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "vue_defaut", - "class" => "form-control")); ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "ind_inclusion", - ($this->view->getActionName() == "index") ? - array( - "" => " ", - "T" => "Tous", - "E" => "Liste d'exclusion", - "I" => "Liste d'inclusion") : - array( - "T" => "Tous", - "E" => "Liste d'exclusion", - "I" => "Liste d'inclusion"), - "class" => "form-control")); - ?> - -
    -
    -
    -
    - -
    -
    -
    - tag->textField(array("date_chargement", "class" => "form-control")) ?> -
    - -
    -
    -
    -
    - -
    -
    - tag->select(array( - "connexion_id", - IgoConnexion::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control")) - ?> -
    -
    - igo_tag->linkIfAdmin(array("igo_connexion/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, "Créer")); ?> -
    -
    - igo_tag->linkIfAdmin(array( - '', - " Modifier", - 'id'=>'editer-connexion_id', - 'data-suivilien-href' => $this->config->uri->pilotage."/igo_connexion/edit" . "/{valeur}/" . $r_controller . "/" . $action . "/" . $parameters, - 'target' => '_blank' - )); ?> -
    - -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_data", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "echelle_prod", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_projection", - "class" => "form-control" - )); ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("remarque", - "class" => "form-control" - )); ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/edit.phtml b/pilotage/app/views/igo_geometrie_type/edit.phtml deleted file mode 100644 index 4fa27c72..00000000 --- a/pilotage/app/views/igo_geometrie_type/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un type de géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/index.phtml b/pilotage/app/views/igo_geometrie_type/index.phtml deleted file mode 100644 index b55c3c85..00000000 --- a/pilotage/app/views/igo_geometrie_type/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un type de géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/new.phtml b/pilotage/app/views/igo_geometrie_type/new.phtml deleted file mode 100644 index 163fa305..00000000 --- a/pilotage/app/views/igo_geometrie_type/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un type de géométrie")) ?> diff --git a/pilotage/app/views/igo_geometrie_type/search.phtml b/pilotage/app/views/igo_geometrie_type/search.phtml deleted file mode 100644 index 474a6166..00000000 --- a/pilotage/app/views/igo_geometrie_type/search.phtml +++ /dev/null @@ -1,43 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Types de géométrie")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - items as $igo_geometrie_type) { ?> - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/table.phtml b/pilotage/app/views/igo_geometrie_type/table.phtml deleted file mode 100644 index 52ef9910..00000000 --- a/pilotage/app/views/igo_geometrie_type/table.phtml +++ /dev/null @@ -1,63 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "layer_type", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "geometrie_type", - ($this->view->getActionName() == "index") ? - array( - "" => " ", - "C" => "Chart", - "Q" => "Query", - "R" => "Raster", - "V" => "Vectoriel") : - array( - "C" => "Chart", - "Q" => "Query", - "R" => "Raster", - "V" => "Vectoriel"), - "class" => "form-control", - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_meta_z_order", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_groupe/associerContexte.phtml b/pilotage/app/views/igo_groupe/associerContexte.phtml deleted file mode 100644 index 9d1d0d97..00000000 --- a/pilotage/app/views/igo_groupe/associerContexte.phtml +++ /dev/null @@ -1,7 +0,0 @@ - - -getContent(); ?> - -view->includeCTL("igo_contexte","search?id=".$id); ?> -view->includeCTL("igo_groupe","associerContexteEdit?contexte_id=".$id,$r_controller); ?> - diff --git a/pilotage/app/views/igo_groupe/associerContexteEdit.phtml b/pilotage/app/views/igo_groupe/associerContexteEdit.phtml deleted file mode 100644 index 15982c0d..00000000 --- a/pilotage/app/views/igo_groupe/associerContexteEdit.phtml +++ /dev/null @@ -1,56 +0,0 @@ - - -getContent(); ?> - - -tag->form() ?> - -partial("commun/titre", array("titre" =>"Associer des groupes de couches")) ?> - - - - - - - - - - - - - - - items as $row) { ?> - - - - - - - - - - - - - - - - total_pages>1) { ?> - - - - - - -
    Id groupeTypeNomInd. fond de carteVisibleActive
    groupe_id ?>nom ?>description ?>tag->textField(array("ind_fond_de_carte_".$row->groupe_id."_".$row->id,"value" => $row->ind_fond_de_carte, "size" => 1)) ?>tag->checkField(array("est_visible_".$row->groupe_id."_".$row->id, "value" => 1, $row->est_visible?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_active_".$row->groupe_id."_".$row->id, "value" => 1, $row->est_active?"checked":"unchecked" => 1)) ?>tag->linkTo(array("igo_couche_contexte/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
    tag->submitButton("Sauver") ?>
    - - - - - - - - -
    tag->linkTo("igo_couche/search", "Premier") ?>tag->linkTo("igo_couche/search?page=" . $page->before, "Précédent") ?>tag->linkTo("igo_couche/search?page=" . $page->next, "Suivant") ?>tag->linkTo("igo_couche/search?page=" . $page->last, "Dernier") ?>current, "/", $page->total_pages ?>
    -
    diff --git a/pilotage/app/views/igo_groupe/edit.phtml b/pilotage/app/views/igo_groupe/edit.phtml deleted file mode 100644 index c48887d6..00000000 --- a/pilotage/app/views/igo_groupe/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/index.phtml b/pilotage/app/views/igo_groupe/index.phtml deleted file mode 100644 index a7a2a625..00000000 --- a/pilotage/app/views/igo_groupe/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/new.phtml b/pilotage/app/views/igo_groupe/new.phtml deleted file mode 100644 index b3f41651..00000000 --- a/pilotage/app/views/igo_groupe/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/search.phtml b/pilotage/app/views/igo_groupe/search.phtml deleted file mode 100644 index 51286559..00000000 --- a/pilotage/app/views/igo_groupe/search.phtml +++ /dev/null @@ -1,55 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Groupes de couche")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - items as $igo_groupe) { ?> - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/table.phtml b/pilotage/app/views/igo_groupe/table.phtml deleted file mode 100644 index 3cf8f79a..00000000 --- a/pilotage/app/views/igo_groupe/table.phtml +++ /dev/null @@ -1,124 +0,0 @@ -session->get("info_utilisateur")->estAdmin; -?> - - - - - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control" - )) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_exclu_arbre", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "profil_proprietaire_id", - $estAdmin ? IgoProfil::find(array("order" => "libelle")) : IgoProfil::findAllProfils(), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    - -
    -
    - -
    -
    - 'groupe_parent', - 'listeDe' => $this->view->groupesPasParentsDeGroupe, - 'listeA' => $this->view->groupesParentsDeGroupe - )); - ?> -
    -
    - - -
    -
    - -
    -
    - view->estGroupeDeCouche ? 'checked': ''; ?>>
    - view->estGroupeDeCouche ? 'checked': ''; ?>> -
    -
    -
    -
    - -
    -
    - - 'couche_enfant', - 'listeDe' => $this->view->couchesPasEnfantDeGroupe, - 'listeA' => $this->view->couchesEnfantDeGroupe - )); - - ?> -
    -
    -
    -
    - -
    -
    - 'groupe_enfant', - 'listeDe' => $this->view->groupesPasEnfantsDeGroupe, - 'listeA' => $this->view->groupesEnfantsDeGroupe - )); - - - ?> -
    -
    -partial("commun/date_modification"); ?> - \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/edit.phtml b/pilotage/app/views/igo_groupe_couche/edit.phtml deleted file mode 100644 index 6de58322..00000000 --- a/pilotage/app/views/igo_groupe_couche/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/index.phtml b/pilotage/app/views/igo_groupe_couche/index.phtml deleted file mode 100644 index 33173d26..00000000 --- a/pilotage/app/views/igo_groupe_couche/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/new.phtml b/pilotage/app/views/igo_groupe_couche/new.phtml deleted file mode 100644 index 086c2f7f..00000000 --- a/pilotage/app/views/igo_groupe_couche/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/search.phtml b/pilotage/app/views/igo_groupe_couche/search.phtml deleted file mode 100644 index 2b93a43f..00000000 --- a/pilotage/app/views/igo_groupe_couche/search.phtml +++ /dev/null @@ -1,31 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Association groupes et couches")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - items as $igo_groupe_couche) { ?> - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/table.phtml b/pilotage/app/views/igo_groupe_couche/table.phtml deleted file mode 100644 index 2aa9929d..00000000 --- a/pilotage/app/views/igo_groupe_couche/table.phtml +++ /dev/null @@ -1,36 +0,0 @@ - -
    -
    - -
    -
    - tag->select(array( - "groupe_id", - IgoGroupe::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "couche_id", - IgoCouche::find(array("order" => "mf_layer_meta_title")), - "using" => array("id", "mf_layer_meta_title"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/edit.phtml b/pilotage/app/views/igo_liste_valeur/edit.phtml deleted file mode 100644 index e34b98c6..00000000 --- a/pilotage/app/views/igo_liste_valeur/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/index.phtml b/pilotage/app/views/igo_liste_valeur/index.phtml deleted file mode 100644 index 7c761522..00000000 --- a/pilotage/app/views/igo_liste_valeur/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/new.phtml b/pilotage/app/views/igo_liste_valeur/new.phtml deleted file mode 100644 index f8814f7a..00000000 --- a/pilotage/app/views/igo_liste_valeur/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/search.phtml b/pilotage/app/views/igo_liste_valeur/search.phtml deleted file mode 100644 index ddd39e19..00000000 --- a/pilotage/app/views/igo_liste_valeur/search.phtml +++ /dev/null @@ -1,26 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Liste de valeurs")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - items as $igo_liste_valeur) { ?> - - - - - - - - - -
    tag->linkTo("igo_liste_valeur/search?order=id", "Liste de valeur") ?>tag->linkTo("igo_liste_valeur/search?order=description", "Description") ?>tag->linkTo("igo_liste_valeur/search?order=date_modif", "Date de modification") ?>
    id ?>description ?>date_modif ?>tag->linkTo(array("igo_liste_valeur/edit/" . $igo_liste_valeur->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_liste_valeur/delete/" . $igo_liste_valeur->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation'=>'supprimer')); ?>
    -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/table.phtml b/pilotage/app/views/igo_liste_valeur/table.phtml deleted file mode 100644 index 89a38275..00000000 --- a/pilotage/app/views/igo_liste_valeur/table.phtml +++ /dev/null @@ -1,10 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array("description", "size" => 30)); ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/edit.phtml b/pilotage/app/views/igo_organisme_responsable/edit.phtml deleted file mode 100644 index 2701fe84..00000000 --- a/pilotage/app/views/igo_organisme_responsable/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/index.phtml b/pilotage/app/views/igo_organisme_responsable/index.phtml deleted file mode 100644 index 341cdb56..00000000 --- a/pilotage/app/views/igo_organisme_responsable/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/new.phtml b/pilotage/app/views/igo_organisme_responsable/new.phtml deleted file mode 100644 index 21cfa182..00000000 --- a/pilotage/app/views/igo_organisme_responsable/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/search.phtml b/pilotage/app/views/igo_organisme_responsable/search.phtml deleted file mode 100644 index 01fb01d3..00000000 --- a/pilotage/app/views/igo_organisme_responsable/search.phtml +++ /dev/null @@ -1,45 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Organismes responsables")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - items as $igo_organisme_responsable) { ?> - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/table.phtml b/pilotage/app/views/igo_organisme_responsable/table.phtml deleted file mode 100644 index e5469f20..00000000 --- a/pilotage/app/views/igo_organisme_responsable/table.phtml +++ /dev/null @@ -1,65 +0,0 @@ -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "acronyme", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "url", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "contact_id", - $contact_desc, - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control")); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "remarque", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/arbreCouches.phtml b/pilotage/app/views/igo_permission/arbreCouches.phtml deleted file mode 100644 index 80af2a5e..00000000 --- a/pilotage/app/views/igo_permission/arbreCouches.phtml +++ /dev/null @@ -1,4 +0,0 @@ - -getContent(); ?> -view->includeCTL("igo_profil","search?id=".$id); ?> -view->includeCTL("igo_permission","arbreCouchesEdit?profil_id=".$id,$r_controller); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml b/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml deleted file mode 100644 index 8f444689..00000000 --- a/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - -getContent(); ?> - -tag->form(array("/igo_permission/arbreCouches/" . $profil_id, 'id' => 'formArbo')); ?> - - -partial("commun/titre", array("titre" => "Donner des permissions à des groupes et des couches")) ?> - -
    -
    - -
      -
    • Ouvrir
    • -
    • Fermer
    • -
    • tag->submitButton(array("Enregistrer", "class" => "btn btn-primary", "id" => "enregistrer")); ?>
    • -
    -
    -
    - - -
    -
    -
    - - -
    -
    -

    Légende

    -
      -
    • Lecture
    • -
    • Analyse
    • -
    • Écriture
    • -
    • Export
    • -
    • Association
    • -
    • Coché
    • -
    • Partiel
    • -
    • Complet
    • -
    -
    -
    diff --git a/pilotage/app/views/igo_permission/edit.phtml b/pilotage/app/views/igo_permission/edit.phtml deleted file mode 100644 index 6cddc2cf..00000000 --- a/pilotage/app/views/igo_permission/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/editw.phtml b/pilotage/app/views/igo_permission/editw.phtml deleted file mode 100644 index 7fde090d..00000000 --- a/pilotage/app/views/igo_permission/editw.phtml +++ /dev/null @@ -1,28 +0,0 @@ - -tag->stylesheetLink("css/bootstrap.css"); ?> -getContent(); ?> -flash->output() ?> -tag->form($controller."/save/".$retour) ?> - - - - - - - - -
    Fermer
    - -partial("commun/titre", array("titre" =>"Modifier une association profil/couche")) ?> - - - partial($controller."/table") ?> - - - - - -
    tag->hiddenField("id") ?>tag->submitButton("Sauver") ?>
    - - - diff --git a/pilotage/app/views/igo_permission/index.phtml b/pilotage/app/views/igo_permission/index.phtml deleted file mode 100644 index 94f6661b..00000000 --- a/pilotage/app/views/igo_permission/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/new.phtml b/pilotage/app/views/igo_permission/new.phtml deleted file mode 100644 index fa7011e4..00000000 --- a/pilotage/app/views/igo_permission/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/search.phtml b/pilotage/app/views/igo_permission/search.phtml deleted file mode 100644 index cf29c0af..00000000 --- a/pilotage/app/views/igo_permission/search.phtml +++ /dev/null @@ -1,96 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Permissions sur les couches")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - - - - items as $igo_permission) { - ?> - - - - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/table.phtml b/pilotage/app/views/igo_permission/table.phtml deleted file mode 100644 index 793345e0..00000000 --- a/pilotage/app/views/igo_permission/table.phtml +++ /dev/null @@ -1,117 +0,0 @@ -session->get("info_utilisateur")->estAdmin; -?> - - -
    -
    - -
    -
    - tag->select(array( - "profil_id", - $estAdmin ? IgoProfil::find(array("order" => "libelle")) : IgoProfil::findProfilsByProfilsProprietaires(), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    -
    -
    - tag->getValue('groupe_id') ? 'checked': ''; ?>>
    - tag->getValue('groupe_id') ? 'checked': ''; ?>> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "groupe_couche_id", - $estAdmin ? IgoCouche::find() : IgoCouche::findEstAssociable(), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "groupe_id", - $estAdmin ? IgoGroupe::find() : IgoGroupe::findEstAssociable(), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_lecture", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_analyse", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_ecriture", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_export", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->checkField(array("est_association", "value" => 1)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "mf_layer_filtre", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/edit.phtml b/pilotage/app/views/igo_profil/edit.phtml deleted file mode 100644 index f85219ec..00000000 --- a/pilotage/app/views/igo_profil/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/index.phtml b/pilotage/app/views/igo_profil/index.phtml deleted file mode 100644 index 784fd833..00000000 --- a/pilotage/app/views/igo_profil/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/new.phtml b/pilotage/app/views/igo_profil/new.phtml deleted file mode 100644 index f2d8fe45..00000000 --- a/pilotage/app/views/igo_profil/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/search.phtml b/pilotage/app/views/igo_profil/search.phtml deleted file mode 100644 index 66161c4a..00000000 --- a/pilotage/app/views/igo_profil/search.phtml +++ /dev/null @@ -1,44 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Profils")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - -items as $igo_profil) { ?> - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/table.phtml b/pilotage/app/views/igo_profil/table.phtml deleted file mode 100644 index bd660ac0..00000000 --- a/pilotage/app/views/igo_profil/table.phtml +++ /dev/null @@ -1,46 +0,0 @@ -session->get("info_utilisateur")->estAdmin; -?> - -
    -
    - -
    -
    - tag->textField(array( - "libelle", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "profil_proprietaire_id", - IgoProfil::findAllProfils(), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/edit.phtml b/pilotage/app/views/igo_service/edit.phtml deleted file mode 100644 index d1296bbd..00000000 --- a/pilotage/app/views/igo_service/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/index.phtml b/pilotage/app/views/igo_service/index.phtml deleted file mode 100644 index acf08902..00000000 --- a/pilotage/app/views/igo_service/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/new.phtml b/pilotage/app/views/igo_service/new.phtml deleted file mode 100644 index 260c4ece..00000000 --- a/pilotage/app/views/igo_service/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/search.phtml b/pilotage/app/views/igo_service/search.phtml deleted file mode 100644 index 90237efe..00000000 --- a/pilotage/app/views/igo_service/search.phtml +++ /dev/null @@ -1,32 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Services")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - items as $igo_service) { ?> - - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/table.phtml b/pilotage/app/views/igo_service/table.phtml deleted file mode 100644 index 2c3c17c1..00000000 --- a/pilotage/app/views/igo_service/table.phtml +++ /dev/null @@ -1,37 +0,0 @@ -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "description", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array( - "wsdl", - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/edit.phtml b/pilotage/app/views/igo_service_profil/edit.phtml deleted file mode 100644 index a1e8dff6..00000000 --- a/pilotage/app/views/igo_service_profil/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une permission sur un service")) ?> diff --git a/pilotage/app/views/igo_service_profil/index.phtml b/pilotage/app/views/igo_service_profil/index.phtml deleted file mode 100644 index bcc59f97..00000000 --- a/pilotage/app/views/igo_service_profil/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une permission sur un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/new.phtml b/pilotage/app/views/igo_service_profil/new.phtml deleted file mode 100644 index 81f5a6bf..00000000 --- a/pilotage/app/views/igo_service_profil/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une permission sur un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/search.phtml b/pilotage/app/views/igo_service_profil/search.phtml deleted file mode 100644 index 55ac67a6..00000000 --- a/pilotage/app/views/igo_service_profil/search.phtml +++ /dev/null @@ -1,28 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Permissions sur les services")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - items as $igo_service_profil) { ?> - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/table.phtml b/pilotage/app/views/igo_service_profil/table.phtml deleted file mode 100644 index fdc86b84..00000000 --- a/pilotage/app/views/igo_service_profil/table.phtml +++ /dev/null @@ -1,41 +0,0 @@ - -
    -
    - -
    -
    - session->has("profil_id")) { - $this->tag->setDefault("profil_id", $this->session->get("profil_id")); - } - ?> - tag->select(array( - "profil_id", - IgoProfil::find(array("order" => "libelle")), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "service_id", - IgoService::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/edit.phtml b/pilotage/app/views/igo_source_entite/edit.phtml deleted file mode 100644 index efe4477f..00000000 --- a/pilotage/app/views/igo_source_entite/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/index.phtml b/pilotage/app/views/igo_source_entite/index.phtml deleted file mode 100644 index a7eeb849..00000000 --- a/pilotage/app/views/igo_source_entite/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/new.phtml b/pilotage/app/views/igo_source_entite/new.phtml deleted file mode 100644 index e1f641b3..00000000 --- a/pilotage/app/views/igo_source_entite/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/search.phtml b/pilotage/app/views/igo_source_entite/search.phtml deleted file mode 100644 index 7d06854e..00000000 --- a/pilotage/app/views/igo_source_entite/search.phtml +++ /dev/null @@ -1,39 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Sources entitée")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - items as $igo_source_entite) { ?> - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/table.phtml b/pilotage/app/views/igo_source_entite/table.phtml deleted file mode 100644 index f2d58ad1..00000000 --- a/pilotage/app/views/igo_source_entite/table.phtml +++ /dev/null @@ -1,30 +0,0 @@ -
    -
    - -
    -
    - tag->textField(array( - "url", - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "organisme_responsable_id", - IgoOrganismeResponsable::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "class" => "form-control", - "useEmpty" => true - )); - ?> -
    -
    - -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/edit.phtml b/pilotage/app/views/igo_utilisateur/edit.phtml deleted file mode 100644 index a1064977..00000000 --- a/pilotage/app/views/igo_utilisateur/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/index.phtml b/pilotage/app/views/igo_utilisateur/index.phtml deleted file mode 100644 index e43749d4..00000000 --- a/pilotage/app/views/igo_utilisateur/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/new.phtml b/pilotage/app/views/igo_utilisateur/new.phtml deleted file mode 100644 index cd1b23db..00000000 --- a/pilotage/app/views/igo_utilisateur/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/search.phtml b/pilotage/app/views/igo_utilisateur/search.phtml deleted file mode 100644 index 2d19c8ea..00000000 --- a/pilotage/app/views/igo_utilisateur/search.phtml +++ /dev/null @@ -1,54 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Utilisateurs")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - items as $igo_utilisateur) { ?> - - - - - - - - - - - -partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/table.phtml b/pilotage/app/views/igo_utilisateur/table.phtml deleted file mode 100644 index b8fb4ea9..00000000 --- a/pilotage/app/views/igo_utilisateur/table.phtml +++ /dev/null @@ -1,33 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array( - "nom", - "class" => "form-control" - )); - ?> -
    -
    - -
    -
    - -
    -
    - tag->checkField(array("est_admin", "value" => 1)) ?> -
    -
    - -
    -
    - -
    -
    - tag->checkField(array("est_pilote", "value" => 1)) ?> -
    -
    - -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/edit.phtml b/pilotage/app/views/igo_utilisateur_profil/edit.phtml deleted file mode 100644 index bf245d88..00000000 --- a/pilotage/app/views/igo_utilisateur_profil/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un lien utilisateur/profil")) ?> diff --git a/pilotage/app/views/igo_utilisateur_profil/index.phtml b/pilotage/app/views/igo_utilisateur_profil/index.phtml deleted file mode 100644 index a5badbce..00000000 --- a/pilotage/app/views/igo_utilisateur_profil/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un lien utilisateur/profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/new.phtml b/pilotage/app/views/igo_utilisateur_profil/new.phtml deleted file mode 100644 index a372045a..00000000 --- a/pilotage/app/views/igo_utilisateur_profil/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un lien utilisateur/profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/search.phtml b/pilotage/app/views/igo_utilisateur_profil/search.phtml deleted file mode 100644 index c4aed466..00000000 --- a/pilotage/app/views/igo_utilisateur_profil/search.phtml +++ /dev/null @@ -1,39 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Association utilisateur/profil")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - items as $igo_utilisateur_profil) { ?> - - - - - - - - - - -partial("commun/search_pagination") ?> diff --git a/pilotage/app/views/igo_utilisateur_profil/table.phtml b/pilotage/app/views/igo_utilisateur_profil/table.phtml deleted file mode 100644 index 4b22e898..00000000 --- a/pilotage/app/views/igo_utilisateur_profil/table.phtml +++ /dev/null @@ -1,34 +0,0 @@ - -
    -
    - -
    -
    - tag->select(array( - "profil_id", - IgoProfil::find(array("order" => "libelle")), - "using" => array("id", "libelle"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -
    -
    - -
    -
    - tag->select(array( - "utilisateur_id", - IgoUtilisateur::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/edit.phtml b/pilotage/app/views/igo_valeur/edit.phtml deleted file mode 100644 index 60666e52..00000000 --- a/pilotage/app/views/igo_valeur/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier une valeur")) ?> diff --git a/pilotage/app/views/igo_valeur/index.phtml b/pilotage/app/views/igo_valeur/index.phtml deleted file mode 100644 index 8d047de7..00000000 --- a/pilotage/app/views/igo_valeur/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher une valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/new.phtml b/pilotage/app/views/igo_valeur/new.phtml deleted file mode 100644 index 1329728a..00000000 --- a/pilotage/app/views/igo_valeur/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer une valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/search.phtml b/pilotage/app/views/igo_valeur/search.phtml deleted file mode 100644 index f1267537..00000000 --- a/pilotage/app/views/igo_valeur/search.phtml +++ /dev/null @@ -1,30 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Valeurs")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - items as $igo_valeur) { ?> - - - - - - - - - - - -
    tag->linkTo("igo_valeur/search?order=id", "Valeur") ?>tag->linkTo("igo_valeur/search?order=description", "Description") ?>Liste de valeurValeurtag->linkTo("igo_valeur/search?order=date_modif", "Date de modification") ?>
    id ?>description ?>liste_valeur_id ?>valeur ?>date_modif ?>tag->linkTo(array("igo_valeur/edit/" . $igo_valeur->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_valeur/delete/" . $igo_valeur->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation'=>'supprimer')); ?>
    -partial("commun/search_pagination") ?> diff --git a/pilotage/app/views/igo_valeur/table.phtml b/pilotage/app/views/igo_valeur/table.phtml deleted file mode 100644 index 7cd5da8d..00000000 --- a/pilotage/app/views/igo_valeur/table.phtml +++ /dev/null @@ -1,26 +0,0 @@ - -
    -
    - -
    -
    - tag->textField(array("description", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->select(array("liste_valeur_id", IgoListeValeur::find(array("order" => "description")), "using" => array("id", "nom"), "emptyText" => "Choisir...", "useEmpty" => true)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("valeur", "size" => 30)) ?> -
    -
    -partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_vue_couche/edit.phtml b/pilotage/app/views/igo_vue_couche/edit.phtml deleted file mode 100644 index fe782cf8..00000000 --- a/pilotage/app/views/igo_vue_couche/edit.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/edit", array( "titre" =>"Modifier un igo_vue_couche")) ?> diff --git a/pilotage/app/views/igo_vue_couche/index.phtml b/pilotage/app/views/igo_vue_couche/index.phtml deleted file mode 100644 index a7f89338..00000000 --- a/pilotage/app/views/igo_vue_couche/index.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/index", array( "titre" =>"Rechercher un igo_vue_couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_vue_couche/new.phtml b/pilotage/app/views/igo_vue_couche/new.phtml deleted file mode 100644 index 73a85047..00000000 --- a/pilotage/app/views/igo_vue_couche/new.phtml +++ /dev/null @@ -1 +0,0 @@ -partial("commun/new", array( "titre" =>"Créer un igo_vue_couche")) ?> diff --git a/pilotage/app/views/igo_vue_couche/search.phtml b/pilotage/app/views/igo_vue_couche/search.phtml deleted file mode 100644 index 8d484418..00000000 --- a/pilotage/app/views/igo_vue_couche/search.phtml +++ /dev/null @@ -1,52 +0,0 @@ - -getContent(); ?> -partial("commun/titre", array("titre" =>"Lister une couche")) ?> -partial("commun/search_entete") ?> - - - - - - - - - - - - - - - - - - items as $igo_vue_couche) { ?> - - - - - - - - - - - - - - - -partial("commun/search_pagination") ?> - - - - - diff --git a/pilotage/app/views/igo_vue_couche/table.phtml b/pilotage/app/views/igo_vue_couche/table.phtml deleted file mode 100644 index b2f68daa..00000000 --- a/pilotage/app/views/igo_vue_couche/table.phtml +++ /dev/null @@ -1,456 +0,0 @@ -
    -
    - -
    -
    - tag->textField(array("id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("description", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("geometrie_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("vue_validation", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_name", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_group", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_name", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_filtre", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_minscale_denom", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_maxscale_denom", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_labelminscale_denom", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_labelmaxscale_denom", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_def", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_def", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("service_tuile", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("catalogue_csw_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("fiche_csw_id", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_wfs_max_feature", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("est_fond_de_carte", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_opacity", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_title", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_group_title", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_labelitem", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_meta_z_order", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("print_option_url", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("print_option_layer_name", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("est_commune", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("est_publique", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("layer_a_order", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("max_zoom_level", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("min_zoom_level", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("classe_entite_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("geometrie_type_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("vue_defaut", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("date_chargement", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("connexion_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("echelle_prod", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("remarque_geometrie", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("ind_inclusion", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_data", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("mf_layer_projection", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("acces", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("nom_classe_entite", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("description_classe_entite", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("source_entite_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("classification_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("organisme_responsable_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("contact_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("remarque_classe_entite", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("nom_connexion", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("connexion", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("connexion_type_id", "type" => "number")) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("nom_connexion_type", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("connexion_type", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("nom_geometrie_type", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("layer_type", "size" => 30)) ?> -
    -
    -
    -
    - -
    -
    - tag->textField(array("geometrie_type", "size" => 30)) ?> -
    -
    diff --git a/pilotage/app/views/index.volt b/pilotage/app/views/index.volt deleted file mode 100644 index 9c7aff73..00000000 --- a/pilotage/app/views/index.volt +++ /dev/null @@ -1,46 +0,0 @@ - - - - - {{ javascript_include("js/jquery-1.11.0.js") }} - {{ javascript_include("/igo/librairie/jquery-ui/jquery-ui.min.js", false) }} - {{ javascript_include("js/bootstrap.js") }} - {{ javascript_include("js/moment.js") }} - {{ javascript_include("js/bootstrap-datetimepicker.js") }} - {{ javascript_include("js/bootstrap-datetimepicker.fr.js") }} - - {{ javascript_include("js/main.js") }} - - {{ stylesheet_link("css/bootstrap.css") }} - {{ stylesheet_link("css/bootstrap-theme.min.css") }} - {{ stylesheet_link("css/bootstrap.override.css") }} - - {{ stylesheet_link("css/main.css") }} - {{ stylesheet_link("css/mapfile.css") }} - {{ stylesheet_link("css/arborescence/tree.css") }} - {{ stylesheet_link("css/datepicker.css") }} - - IGO - Gestion des métadonnées - - -
    -
    - - {{ image("img/banniere_geo.jpg") }} - {% include "menu/menu.volt" %} - -
    - flash->output(); ?> - {{ content() }} -
    - - - diff --git a/pilotage/app/views/index/index.volt b/pilotage/app/views/index/index.volt deleted file mode 100644 index dbd54686..00000000 --- a/pilotage/app/views/index/index.volt +++ /dev/null @@ -1,6 +0,0 @@ -
    -

    IGO - Infrastructure géomatique ouverte

    - -

    Gestion des métadonnées

    - -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/catalogue.phtml b/pilotage/app/views/layouts/catalogue.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/catalogue.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/classe_entite.phtml b/pilotage/app/views/layouts/classe_entite.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/classe_entite.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/contexte.phtml b/pilotage/app/views/layouts/contexte.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/contexte.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/geometrie_def.phtml b/pilotage/app/views/layouts/geometrie_def.phtml deleted file mode 100644 index 74e7c85c..00000000 --- a/pilotage/app/views/layouts/geometrie_def.phtml +++ /dev/null @@ -1,3 +0,0 @@ -
    - getContent(); ?> -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_attribut.phtml b/pilotage/app/views/layouts/igo_attribut.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_attribut.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_catalogue_csw.phtml b/pilotage/app/views/layouts/igo_catalogue_csw.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_catalogue_csw.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classe.phtml b/pilotage/app/views/layouts/igo_classe.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_classe.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classe_entite.phtml b/pilotage/app/views/layouts/igo_classe_entite.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_classe_entite.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classification.phtml b/pilotage/app/views/layouts/igo_classification.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_classification.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_connexion.phtml b/pilotage/app/views/layouts/igo_connexion.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_connexion.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_contact.phtml b/pilotage/app/views/layouts/igo_contact.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_contact.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_contexte.phtml b/pilotage/app/views/layouts/igo_contexte.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_contexte.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche.phtml b/pilotage/app/views/layouts/igo_couche.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_couche.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche_contexte.phtml b/pilotage/app/views/layouts/igo_couche_contexte.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_couche_contexte.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche_def.phtml b/pilotage/app/views/layouts/igo_couche_def.phtml deleted file mode 100644 index 74e7c85c..00000000 --- a/pilotage/app/views/layouts/igo_couche_def.phtml +++ /dev/null @@ -1,3 +0,0 @@ -
    - getContent(); ?> -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_geometrie.phtml b/pilotage/app/views/layouts/igo_geometrie.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_geometrie.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_geometrie_type.phtml b/pilotage/app/views/layouts/igo_geometrie_type.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_geometrie_type.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_groupe_couche.phtml b/pilotage/app/views/layouts/igo_groupe_couche.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_groupe_couche.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_liste_valeur.phtml b/pilotage/app/views/layouts/igo_liste_valeur.phtml deleted file mode 100644 index 74e7c85c..00000000 --- a/pilotage/app/views/layouts/igo_liste_valeur.phtml +++ /dev/null @@ -1,3 +0,0 @@ -
    - getContent(); ?> -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_organisme_responsable.phtml b/pilotage/app/views/layouts/igo_organisme_responsable.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_organisme_responsable.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_permission.phtml b/pilotage/app/views/layouts/igo_permission.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_permission.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_profil.phtml b/pilotage/app/views/layouts/igo_profil.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_profil.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_service.phtml b/pilotage/app/views/layouts/igo_service.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_service.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_service_profil.phtml b/pilotage/app/views/layouts/igo_service_profil.phtml deleted file mode 100644 index 74e7c85c..00000000 --- a/pilotage/app/views/layouts/igo_service_profil.phtml +++ /dev/null @@ -1,3 +0,0 @@ -
    - getContent(); ?> -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_source_entite.phtml b/pilotage/app/views/layouts/igo_source_entite.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_source_entite.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_utilisateur.phtml b/pilotage/app/views/layouts/igo_utilisateur.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_utilisateur.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_utilisateur_profil.phtml b/pilotage/app/views/layouts/igo_utilisateur_profil.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/igo_utilisateur_profil.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_valeur.phtml b/pilotage/app/views/layouts/igo_valeur.phtml deleted file mode 100644 index c5f10691..00000000 --- a/pilotage/app/views/layouts/igo_valeur.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> diff --git a/pilotage/app/views/layouts/liste_valeur.phtml b/pilotage/app/views/layouts/liste_valeur.phtml deleted file mode 100644 index 74e7c85c..00000000 --- a/pilotage/app/views/layouts/liste_valeur.phtml +++ /dev/null @@ -1,3 +0,0 @@ -
    - getContent(); ?> -
    \ No newline at end of file diff --git a/pilotage/app/views/layouts/organisme_responsable.phtml b/pilotage/app/views/layouts/organisme_responsable.phtml deleted file mode 100644 index af3ecbe8..00000000 --- a/pilotage/app/views/layouts/organisme_responsable.phtml +++ /dev/null @@ -1 +0,0 @@ -getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/mapfile/cree.phtml b/pilotage/app/views/mapfile/cree.phtml deleted file mode 100644 index 0a906a81..00000000 --- a/pilotage/app/views/mapfile/cree.phtml +++ /dev/null @@ -1,33 +0,0 @@ -getContent(); ?> - -tag->form("mapfile/genere") ?> - -partial("commun/titre", array("titre" =>"Générer un mapfile")) ?> - -
    -
    - -
    -
    - tag->select(array( - "contexte_id", - IgoContexte::find(array("order" => "nom")), - "using" => array("id", "nom"), - "emptyText" => "Choisir...", - "useEmpty" => true, - "class" => "form-control" - )); - ?> -
    -
    - -
    - -
    - tag->submitButton(array("Générer", "class"=>'btn btn-primary')) ?> -
    -
    - -tag->hiddenField("id") ?> - - diff --git a/pilotage/app/views/mapfile/display.volt b/pilotage/app/views/mapfile/display.volt deleted file mode 100644 index 7f6eb5bb..00000000 --- a/pilotage/app/views/mapfile/display.volt +++ /dev/null @@ -1,117 +0,0 @@ -
    -
    -
    - Précédent - -
    - - {% if nLayers == 1 %} -

    {{nLayers}} nouvelle couche a été trouvée.

    - {% else %} -

    {{nLayers}} couches ont été trouvées.

    - {% endif %} - -

    {{nNotDistinctLayers}} couches sont en double.

    - -
    - - - - - - - - - - {% for layer in layers %} - {% if !layer['distinct'] %} - - {% else %} - - {% endif %} - - - - - - - - {% endfor %} - - -
    Nom - Exclure -
    - {{layer['name']}} - - -
    -

    - : {{layer['name']}} -

    - -

    - : {{layer['group']}} -

    - -

    - : {{layer['minscaledenom']}} -

    - -

    - : {{layer['maxscaledenom']}} -

    - -

    - : {{layer['labelminscaledenom']}} -

    - -

    - : {{layer['labelmaxscaledenom']}} -

    - -

    - : {{layer['type']}} -

    - -

    - : {{layer['projection']}} -

    - -

    - : {{layer['connection']}} -

    - -

    - : {{layer['connectiontype']}} -

    - -

    - : {{layer['data']}} -

    - -

    - : {{layer['filter']}} -

    - -

    - -

    {{layer['layer_def']}}
    -

    - -

    - -

    {{layer['meta_def']}}
    -

    - -

    - - {% for class in layer['classes'] %} -

    {{class}}
    - {% endfor %} -

    -
    - - - -{{ javascript_include("js/mapfileRetro.js") }} \ No newline at end of file diff --git a/pilotage/app/views/mapfile/load.volt b/pilotage/app/views/mapfile/load.volt deleted file mode 100644 index 606765a9..00000000 --- a/pilotage/app/views/mapfile/load.volt +++ /dev/null @@ -1,119 +0,0 @@ -partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 2 de 4")) ?> - -
    -
    -
    - Précédent - -
    - - {% if nLayers == 1 %} -

    {{nLayers}} nouvelle couche a été trouvée.

    - {% else %} -

    {{nLayers}} couches ont été trouvées.

    - {% endif %} - -

    {{nNotDistinctLayers}} couches sont en double.

    - - - - - - - - - - - - {% for layer in layers %} - {% if !layer['distinct'] %} - - {% else %} - - {% endif %} - - - - - - - - {% endfor %} - - -
    Nom - Exclure -
    - {{layer['name']}} - - -
    -

    - : {{layer['name']}} -

    - -

    - : {{layer['group']}} -

    - -

    - : {{layer['minscaledenom']}} -

    - -

    - : {{layer['maxscaledenom']}} -

    - -

    - : {{layer['labelminscaledenom']}} -

    - -

    - : {{layer['labelmaxscaledenom']}} -

    - -

    - : {{layer['type']}} -

    - -

    - : {{layer['projection']}} -

    - -

    - : {{layer['connection']}} -

    - -

    - : {{layer['connectiontype']}} -

    - -

    - : {{layer['data']}} -

    - -

    - : {{layer['filter']}} -

    - -

    - -

    {{layer['layer_def']}}
    -

    - -

    - -

    {{layer['meta_def']}}
    -

    - -

    - - {% for class in layer['classes'] %} -

    {{class}}
    - {% endfor %} -

    -
    -
    -
    - -{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/process.volt b/pilotage/app/views/mapfile/process.volt deleted file mode 100644 index 8fdf4b62..00000000 --- a/pilotage/app/views/mapfile/process.volt +++ /dev/null @@ -1,62 +0,0 @@ -partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 4 de 4")) ?> - -
    -
    -
    - Précédent - -
    - -

    Contexte

    - -
    - -
    - - -
    -
    - - -
    -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    - - - -{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/retro.volt b/pilotage/app/views/mapfile/retro.volt deleted file mode 100644 index 2b715842..00000000 --- a/pilotage/app/views/mapfile/retro.volt +++ /dev/null @@ -1,17 +0,0 @@ -partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 1 de 4")) ?> - -
    -
    -
    - Précédent - -
    - -
    - -
    - -
    -
    -
    -
    \ No newline at end of file diff --git a/pilotage/app/views/mapfile/select.volt b/pilotage/app/views/mapfile/select.volt deleted file mode 100644 index fc2a27c5..00000000 --- a/pilotage/app/views/mapfile/select.volt +++ /dev/null @@ -1,164 +0,0 @@ -partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 3 de 4")) ?> - -
    -
    -
    - Précédent - -
    - - {% if nNewLayers == 1 %} -

    {{nNewLayers}} nouvelle couche a été trouvée.

    - {% else %} -

    {{nNewLayers}} nouvelles couches ont été trouvées.

    - {% endif %} - - {% if nExistingLayers == 1 %} -

    {{nExistingLayers}} nouvelle couche existe déjà dans la base de données.

    - {% else %} -

    {{nExistingLayers}} couches existent déjà dans la base de données.

    - {% endif %} - - - - - - - - - - - - - - - {% for layer in layers %} - {% if layer['exists'] %} - - {% else %} - - {% endif %} - - - - - - - - - - - {% endfor %} - - -
    NomGroupe - Insérer / Remplacer - - Conserver - - Ignorer -
    - {{layer['name']}} - - - - {% if !layer['exists'] %} - - {% else %} - - {% endif %} - - {% if layer['exists'] %} - - {% else %} - - {% endif %} - - -
    -

    - : {{layer['name']}} -

    - -

    - : {{layer['group']}} -

    - -

    - : {{layer['minscaledenom']}} -

    - -

    - : {{layer['maxscaledenom']}} -

    - -

    - : {{layer['labelminscaledenom']}} -

    - -

    - : {{layer['labelmaxscaledenom']}} -

    - -

    - : {{layer['type']}} -

    - -

    - : {{layer['projection']}} -

    - -

    - : {{layer['connection']}} -

    - -

    - : {{layer['connectiontype']}} -

    - -

    - : {{layer['data']}} -

    - -

    - : {{layer['filter']}} -

    - -

    - -

    {{layer['layer_def']}}
    -

    - -

    - -

    {{layer['meta_def']}}
    -

    - -

    - - {% for class in layer['classes'] %} -

    {{class}}
    - {% endfor %} -

    -
    -
    -
    - -{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/validate.volt b/pilotage/app/views/mapfile/validate.volt deleted file mode 100644 index 98abbc64..00000000 --- a/pilotage/app/views/mapfile/validate.volt +++ /dev/null @@ -1,135 +0,0 @@ -
    -
    -
    - Précédent - -
    - - {% if nNewLayers == 1 %} -

    {{nNewLayers}} nouvelle couche a été trouvée.

    - {% else %} -

    {{nNewLayers}} nouvelles couches ont été trouvées.

    - {% endif %} - - {% if nExistingLayers == 1 %} -

    {{nExistingLayers}} nouvelle couche existe déjà.

    - {% else %} -

    {{nExistingLayers}} couches existent déjà.

    - {% endif %} - - - - - - - - - - - - - {% for layer in layers %} - {% if layer['exists'] %} - - {% else %} - - {% endif %} - - - - - - - - - {% endfor %} - - -
    Nom - Insérer / Remplacer - - Ignorer -
    - {{layer['name']}} - - {% if !layer['exists'] %} - - {% else %} - - {% endif %} - - {% if layer['exists'] %} - - {% else %} - - {% endif %} -
    -

    - : {{layer['name']}} -

    - -

    - : {{layer['group']}} -

    - -

    - : {{layer['minscaledenom']}} -

    - -

    - : {{layer['maxscaledenom']}} -

    - -

    - : {{layer['labelminscaledenom']}} -

    - -

    - : {{layer['labelmaxscaledenom']}} -

    - -

    - : {{layer['type']}} -

    - -

    - : {{layer['projection']}} -

    - -

    - : {{layer['connection']}} -

    - -

    - : {{layer['connectiontype']}} -

    - -

    - : {{layer['data']}} -

    - -

    - : {{layer['filter']}} -

    - -

    - -

    {{layer['layer_def']}}
    -

    - -

    - -

    {{layer['meta_def']}}
    -

    - -

    - - {% for class in layer['classes'] %} -

    {{class}}
    - {% endfor %} -

    -
    -
    -
    - -{{ javascript_include("js/mapfileRetro.js") }} \ No newline at end of file diff --git a/pilotage/app/views/menu/info.volt b/pilotage/app/views/menu/info.volt deleted file mode 100644 index d3b25309..00000000 --- a/pilotage/app/views/menu/info.volt +++ /dev/null @@ -1,33 +0,0 @@ - -(.*).*$%ms','$1',$pinfo); -echo '
    ' . $pinfo . '
    ' ; - - -?> \ No newline at end of file diff --git a/pilotage/app/views/menu/menu.volt b/pilotage/app/views/menu/menu.volt deleted file mode 100644 index 13a4d7a6..00000000 --- a/pilotage/app/views/menu/menu.volt +++ /dev/null @@ -1,90 +0,0 @@ - - diff --git a/pilotage/app/views/profil_et_permission/do.phtml b/pilotage/app/views/profil_et_permission/do.phtml deleted file mode 100644 index a053b602..00000000 --- a/pilotage/app/views/profil_et_permission/do.phtml +++ /dev/null @@ -1,5 +0,0 @@ -getContent(); ?> - -view->includeCTL("igo_profil","search?id=".$id); ?> - -view->includeFrame($baseUri."/igo_permission","search?profil_id=".$id); ?> diff --git a/pilotage/app/views/profil_et_utilisateur/do.phtml b/pilotage/app/views/profil_et_utilisateur/do.phtml deleted file mode 100644 index 8ea07b99..00000000 --- a/pilotage/app/views/profil_et_utilisateur/do.phtml +++ /dev/null @@ -1,6 +0,0 @@ - getContent(); ?> - -view->includeCTL("igo_profil","search?id=".$id); ?> -view->includeFrame($baseUri."/igo_utilisateur_profil","search?profil_id=".$id); ?> - - diff --git a/pilotage/app/views/utilisateur_et_profil/do.phtml b/pilotage/app/views/utilisateur_et_profil/do.phtml deleted file mode 100644 index 7ac9758e..00000000 --- a/pilotage/app/views/utilisateur_et_profil/do.phtml +++ /dev/null @@ -1,5 +0,0 @@ - getContent(); ?> - -view->includeCTL("igo_utilisateur","search?id=".$id); ?> - -view->includeCTL("igo_utilisateur_profil","search?utilisateur_id=".$id,$r_controller); ?> \ No newline at end of file diff --git a/pilotage/index.html b/pilotage/index.html deleted file mode 100644 index bc0b4f14..00000000 --- a/pilotage/index.html +++ /dev/null @@ -1 +0,0 @@ -

    Mod-Rewrite is not enabled

    Please enable rewrite module on your web server to continue \ No newline at end of file diff --git a/pilotage/public/.htaccess b/pilotage/public/.htaccess deleted file mode 100644 index fcf1d37e..00000000 --- a/pilotage/public/.htaccess +++ /dev/null @@ -1,8 +0,0 @@ -AddDefaultCharset UTF-8 - - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] - \ No newline at end of file diff --git a/pilotage/public/css/ZeroClipboard.css b/pilotage/public/css/ZeroClipboard.css deleted file mode 100644 index cadf5c46..00000000 --- a/pilotage/public/css/ZeroClipboard.css +++ /dev/null @@ -1,5 +0,0 @@ -body { font-family:arial,sans-serif; font-size:9pt; } - -.my_clip_button { width:150px; text-align:center; border:1px solid black; background-color:#ccc; margin:10px; padding:10px; cursor:default; font-size:9pt; } -.my_clip_button.hover { background-color:#eee; } -.my_clip_button.active { background-color:#aaa; } \ No newline at end of file diff --git a/pilotage/public/css/arborescence/img/check-complet-gris.png b/pilotage/public/css/arborescence/img/check-complet-gris.png deleted file mode 100644 index 1e09f1af192e1f75dfa42aae7cfd333fa638e4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)6Oa`0mJkI}Ea{HEjtmSN`?>!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%_IkQFhG+z@ov@p$*+IZneQW%q z`e)8ehsvTj0yhL+h;sSBcv0f0+lG*wVxdcG)ME3t8b3d<;k(KC;?U67yH0JFXiJ>6 z>`399=RYm_d@tYm!gH9xN#Oo>$zAKBr=_YVHV7Oky}K>9d(j4+*K5>0g#?-``hu^Q zPD^#y>{1eFy0I;GTI#H2?wUN#0*CIa=4mh0tNJmw?Acp v#N7XAlmDGT@x->=%O+oI|68=Eay;ZTEA`wsIYFWs=n)1_S3j3^P6!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%4tlychG+z@onXz?93bGTzE!(W zHnK_jBvXu!mbGq+#tn@OU8Nt5KRT0?Z*=AQIn7$`IX!sq%<6=S?^|@dLqlKhI%RI+ zd$~0Bk;S>sHM5p2%Y3Kx*g{CLE-DgKFlv@JCbP0l+XkKk^gaR diff --git a/pilotage/public/css/arborescence/img/check-disabled.png b/pilotage/public/css/arborescence/img/check-disabled.png deleted file mode 100644 index 0d6c03595361044c22cd19ffd4809671eda7bb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~uBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpoCP3 zYeY$Kep*R+Vo@qXKw@TIiJqTph(ejMo~fRpq5EeibD*kAo-U3d8o{{}_Hwlt2(%P0 z?SHU(KI2wF>4Rz$ysV>L1Kx;yWEU0Xv(d@l!^&UmH}TDznw)7i-)i6Q;#1!}d0FPJ zb(=To{N7jpKl8TP7XikE$Y}?)vt}Lpyk}ePMfL-iOlo6IeJ4M*m{WXuQvh>9q0IW% zyL7ncezy6&@BbgIE~S!5DwYZ%hYdV5KYB^Dxo{|6XlIZSNK0a7*_JE(aMwGFK5-5; z4yG=}%O0#LT=By}Z;C1rt33 zJ=4@yqg0@p^`0({AsWF`Cv4WzyE9dujDj=RjS^sbDKH30@jAcuzcVCEyU`| z5k6b*PxowD_HJ62J@5H-c>zTZ_t4PKHs!J9_l!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%j(WN{hG+zrUf9dkY#`D4u;iQ9 z9)JBMlV|feiN^4}&{6uqd^PH*Yk}zXeQRBPvd&L=Vk5Bcz0vvN(9qMHIyOtRCC*yb z@z~=0=R%p;%XY4oY-{9FXi|7^sdTQI&S|Fr#+K)mxwpk!3tc!Ssc?!q>{u6ly>wct z^(~f(K|zcyk1bLomu2o+7+cV>sDo?4g2fi@vn(9{MlUVO; z{owKSp0IFhV#V(x-)rAGunN51<#+kY_rIUjZGsr%-bw}>`o`oO3iJ?zr>mdKI;Vst E06$rHh5!Hn diff --git a/pilotage/public/css/arborescence/img/check-partiel.png b/pilotage/public/css/arborescence/img/check-partiel.png deleted file mode 100644 index b7589dce02d7e7be09a4172b0cf22c612628bd3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmV-I0lof-P)H;LN@>a0MkiCK~yMH zb&xv>gFqBTC$%ea9a(}KaY?D{v=E|TqoB2j;0K~Hij80^wmH#Y;>6rSoH>X0n0p$> zu_%gZn#55QMNw5%gkhMbY2Wu%Ro(XKx(b%707*qoM6N<$g6Ca+IsgCw diff --git a/pilotage/public/css/arborescence/img/check.png b/pilotage/public/css/arborescence/img/check.png deleted file mode 100644 index da6150c7e971003dbd69e7293aef21297abf4746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)H;LN@>a0V_#FK~yMH zZIHW)gFqOCXKUZYw~!46KEIE)|ZGDflWY&MNA=zkc+p7myNPTSX)WE zXOm*r-JD|h=Re<^`Db3bu1nLj?|br06h+ZAO>F!Fpp*EH>651`d*wcT#xI7S}cayp$* zJcK4J00halZNJ@x{htCBev#a6x9jzapMC!)G+_bw0o)TdGZ-2eap07*qoM6N<$ Eg61Hv1poj5 diff --git a/pilotage/public/css/arborescence/img/legende-coche.png b/pilotage/public/css/arborescence/img/legende-coche.png deleted file mode 100644 index b243267f0e97cf6fb117448457cf12fd9629dc18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)H;LN@>a0eMM8K~y+T zwUj%H!ax*-cYm5Fv9+_Xu}LWi`U|uZwDnJ@h2R503r!Ie!FQs>Hx{C)EsuLH?7|Y+ zS=VgfkYVP`$GLZsc?a<3>qDTQ@)ai4`kC$_@Or(X*XyC#Z2l;ET-W_zd~ca2A&ukl z7^l<8qvP?2)oLa4^w6sWHX02a4hLK=7mp0XKq{5OU@*XbzX!caV6|GsdcF3f8xDtv z$KwcvLWsp;FijKmDuI2?(^xK-;-U9fz<$4vWHKp`NF;)AI4omb*TK>^o6U2;(P$*8 zn1~=M8jYgU=?Ls;Aj@GNGnouDO_PMBQb~IHXCOE7FmkyZ^7;H1=xJcRUPrgv#e6=O zKJhfC)2WO<#Wi~9RUQhVXMyWMa;pXE>3?RF2vHG1e(0$;s- e{{Q-VHQ^nqs*qSo9@G#30000H;LN@>a0Rc%wK~y+T z-IP0ug)kU}XV&Ht+=vTsF;;e32tKe;&{{-L1m9vK*jt{Ve6duQcEXxo@(aVq_`?DaaLV{IQVcRzJeUGl|q^#>I7_v%X z7>3}4X_{b~CJe)nLKzvdN}=a@7={6LT|?J(XqqM^&vU_$RSI3#MccM0%krr(O;f>; zRSF%)LDMuSisGp-NfN=3{YOIXk!{z+qI+72Ye)Js||9nFBfbVP9h37J+c3yq;#!u_c zHeSz33LH(RCn)~Dbzz}%lWSl?q}Z0+?q!*LGoMEqq)c_X|NWqNTcX4L@5>*ypU`UU zd%WPa)s)mujjko0mqS1bZf^^`Zu-flJ#*HjBZWE=o4gjLMy^=J6*-M_W}<}uL*p{P zwl~L}BB#f5pa1tT{LpIIw6~8{vxSScS!|GzE>q;rPPsSBnJ-78tspl1$Y-0EwvwAp z#oqfa`+8T>EVZ7;8ob#lKzsMkv-@wqukP&!MkD7r*UC5~xPc+S;OXk;vd$@?2>_(_ BlaK%a diff --git a/pilotage/public/css/arborescence/img/uncheck.png b/pilotage/public/css/arborescence/img/uncheck.png deleted file mode 100644 index 751e143d93aef78189bb2315295062c66b1a3833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)6Oa`0mJkI}Ea{HEjtmSN`?>!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%dOcknLo|ZVPT0uDq$t38eU|;h z`wJBWg}i<+aanK$C~j1^6u0i{(N9zEtxQOFGK+aO=k~U@zy0uSuO8Wq1WK# zaBRlC-`R{JOhH~(qr&wa6%{m7&;8uTz{SX^8058`HGt!v(WNNs=Se*`KC-k0aIBb; xw03XZfxjgUhr%xw$|Uz(yY-lxXQ99zMhDHpV4ePpi-8Vf@O1TaS?83{1OQD$Sl$2t diff --git a/pilotage/public/css/arborescence/tree.css b/pilotage/public/css/arborescence/tree.css deleted file mode 100644 index de326e7f..00000000 --- a/pilotage/public/css/arborescence/tree.css +++ /dev/null @@ -1,255 +0,0 @@ -/* -Inspiré de https://github.com/grokys/css-treeview -Couleurs des .wrap-* provenant de http://colorbrewer2.org/?type=qualitative&scheme=Paired&n=12 -*/ -/* - Created on : 2014-03-10 14:00:00 - Author : Nicolas Brisebois-Tétreault -*/ - -body.wait *, body.wait{ - cursor: wait !important; -} - -/* Don't display bullets. */ -.css-treeview { - list-style: none; - line-height: 2em; -} -/* Align the label and provide a pointer cursor. */ -.css-treeview label { - display: inline; - vertical-align: middle; - font-weight:normal; -} -/* Highlight selected nodes. -.css-treeview label.selected { - background-color: #08C; - color: white; - padding: 2px; -}*/ -/* Hide child nodes of an unchecked expander. */ -.css-treeview input.expander ~ ul { - display: none; -} -/* Show child nodes of a checked expander. */ -.css-treeview input.expander:checked ~ ul { - display: block; -} -/* Hide the expander checkbox. */ -.css-treeview input.expander { - position: absolute; - opacity: 0; -} -/* Don't change the cursor for disabled expanders. */ -.css-treeview input.expander:disabled { - cursor: default -} -/* Remove the margin from actual checkboxes. */ -.css-treeview input.check { - margin: 0; -} - -/* Before a disabled node's expander span, add a blank 20px padding */ -.css-treeview input.expander:disabled + span.expander::before { - content: ''; - padding-right: 20px; -} -/* Before an unexpanded node's expander span, display the '>' expand icon */ -.css-treeview input.expander:enabled + span.expander::before { - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAHtJREFUSEvtlEsKwCAMRHP/S6fYUhDsfETSQnEhrvIcM5NEZsbKWSpuD9cB4mTr70EFDeBAJEBBLACD2AAEeQ+AHLEUMDslQGWBAlRxbZSd17eCa9TrFso3LtxbSN29uqEHM8WwiQjy1Bc5jWq5UhtV8R9z4KaP5mAWcgD5xILE2Y3q1wAAAABJRU5ErkJggg=='); - background-position: 0 0; - content: ''; - padding-right: 20px; -} -/* Before an expanded node's expander span, display the 'V' expanded icon */ -.css-treeview input.expander:checked:enabled + span.expander::before { - background-position: 1px 16px; -} -.wrap { - padding: 2px; - margin: 0; - width: 20px; - height: 20px; -} -.css-treeview .wrap input { - margin: 3px 3px 3px 4px; -} - -.legende{ - width:20px; - height:20px; - background-repeat:no-repeat; - background-position: 5px 3px; -} - -.legende li{ - background-color:#eee; -} - -.wrap-visible, -.legende-visible{ - background-color: #a6cee3; -} -.wrap-active, -.legende-active { - background-color: #b2df8a; -} -.wrap-lecture, -.legende-lecture{ - background-color: #1f78b4; -} -.wrap-analyse, -.legende-analyse { - background-color: #b15928; -} - -.wrap-ecriture, -.legende-ecriture{ - background-color: #4daf4a; -} -.wrap-export, -.legende-export{ - background-color: #984ea3; -} -.wrap-association, -.legende-association{ - background-color: #fb9a99; -} -.legende-coche{ - background-image: url('img/check.png'); -} - -.legende-partiel{ - background-image: url('img/check-partiel.png'); -} -.legende-partiel-gris{ - background-image: url('img/check-partiel-gris.png'); -} -.legende-complet{ - background-image: url('img/check-complet.png'); -} -.legende-complet-gris{ - background-image: url('img/check-complet-gris.png'); -} -.legende-exclu{ - background-image: url('img/check-exclu.png'); -} - -input.exclu{ - margin-right:10px; -} -.lien-couche, -.lien-groupe{ - margin-left:10px; -} - -.conteneur-legende{ - text-align: left; - padding-bottom:2em; - background-color:#eee; -} -.conteneur-legende ul{ - list-style-type: none; - padding:0; - margin:0; -} -.conteneur-legende li{ - padding:5px 0; - -} -.conteneur-legende span.legende{ - margin-right:5px; - padding: 2px 10px; -} -.conteneur-legende span.glyphicon{ - cursor:help; -} - -/* - Cache les cases à cocher et les remplaces par des images - :not(#foo) > La personalisation ne fonctionne pas sur les vieux navigateurs -*/ -:not(#foo) > input.check { - opacity: 0;/* Cacher la cch, qui demeure clicable */ - display:none; - width: 18px; -} - -:not(#foo) > input.check + label { - margin: 0; - clear: none; - margin:0 0 0 5px; - padding: 5px 0 4px 16px;/* Laisser de l'espace pour l'image*/ - cursor: pointer; - background: url('img/uncheck.png') left center no-repeat; -} - -:not(#foo) > input.check:checked + label { - background-image: url('img/check.png'); -} - -:not(#foo) > input.check:checked:disabled + label { - background-image: url('img/check-disabled.png'); - cursor:no-drop; -} - -:not(#foo) > input.check-complet + label{ - - background-image: url('img/check-complet.png'); -} - -:not(#foo) > input.check-complet-gris + label{ - - background-image: url('img/check-complet-gris.png'); -} - -:not(#foo) > input.check-partiel + label{ - background-image: url('img/check-partiel.png'); -} - -:not(#foo) > input.check-partiel-gris + label{ - background-image: url('img/check-partiel-gris.png'); -} - - -:not(#foo) > input.check-exclu + label{ - background-image: url('img/check-exclu.png'); -} - -.css-treeview .action{ - cursor:pointer; - margin:0 5px; - padding:0 5px; -} - -.css-treeview .action-deplacer{ - font-weight:bold; - font-size:16px; -} - -.afficher{ - display:visible; -} - -.masquer{ - display:none; -} - - .ui-state-highlight { - height: 1.5em; - line-height: 1.2em; - display: visible; - border-style: dotted; - border-color:grey; - width:200px; - } - - .exclu .libelle{ - text-decoration:line-through; - } - - :not(#foo) > .exclu .check.visible + label { - background-image: url('img/check-exclu.png'); - } - \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-listTree.css b/pilotage/public/css/bootstrap-listTree.css deleted file mode 100644 index 1cc367ce..00000000 --- a/pilotage/public/css/bootstrap-listTree.css +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2012 Clay Walker - * Licensed under GPLv2 ONLY - */ -.listTree { - margin-bottom: 18px; -} - -.listTree i { - float: right; - margin-right: 15px; -} - -.listTree ul { - margin: 0; -} - -.listTree li { - list-style-type: none; - cursor: pointer; -} - -.listTree > ul > li { - background-color: #eee; - border-width: 1px 1px 0 1px; - border-style: solid; - border-color: #ddd; -} - -.listTree > ul > li:first-child { - border-width: 1px 1px 0 1px; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -.listTree > ul > li:last-child { - border-width: 1px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -.listTree > ul > li:last-child > ul > li:last-child { - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -.listTree span { - display: inline-block; - width: 100%; - padding: 5px; -} - -.listTree > ul > li > span { - font-weight: bold; -} - -.listTree > ul > li > ul > li { - background-color: #fff; - border-width: 1px 0 0 0; - border-style: solid; - border-color: #ddd; - padding-left: 10px; -} - -.listTree > ul > li > ul > li:first-child { - border-width: 1px 0 0 0; -} - -.listTree > ul > li > ul > li:last-child { - border-width: 1px 0 0 0; -} - -.listTree input[type="checkbox"] { - margin-top: 0; -} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-theme.css b/pilotage/public/css/bootstrap-theme.css deleted file mode 100644 index df2d3d96..00000000 --- a/pilotage/public/css/bootstrap-theme.css +++ /dev/null @@ -1,397 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn:active, -.btn.active { - background-image: none; -} - -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} - -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} - -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - background-repeat: repeat-x; - border-color: #2b669a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} - -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - background-repeat: repeat-x; - border-color: #3e8f3e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} - -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} - -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - background-repeat: repeat-x; - border-color: #e38d13; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} - -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - background-repeat: repeat-x; - border-color: #b92c28; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} - -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - background-repeat: repeat-x; - border-color: #28a4c9; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} - -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} - -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.navbar-default { - background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); - background-repeat: repeat-x; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); -} - -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} - -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - background-repeat: repeat-x; - border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); -} - -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - background-repeat: repeat-x; - border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); -} - -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - background-repeat: repeat-x; - border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); -} - -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - background-repeat: repeat-x; - border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); -} - -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); -} - -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - background-repeat: repeat-x; - border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); -} - -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); -} - -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); -} - -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); -} - -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); -} - -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - background-repeat: repeat-x; - border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-theme.min.css b/pilotage/public/css/bootstrap-theme.min.css deleted file mode 100644 index c7b6d39b..00000000 --- a/pilotage/public/css/bootstrap-theme.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.css b/pilotage/public/css/bootstrap.css deleted file mode 100644 index 377dff30..00000000 --- a/pilotage/public/css/bootstrap.css +++ /dev/null @@ -1,7118 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden], -template { - display: none; -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a { - background: transparent; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - outline: 0; -} - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -mark { - color: #000; - background: #ff0; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -button, -input, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: 100%; -} - -button, -input { - line-height: normal; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; - box-sizing: border-box; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 2cm .5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -a { - color: #428bca; - text-decoration: none; -} - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} - -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - height: auto; - max-width: 100%; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -h1 small, -h2 small, -h3 small, -h1 .small, -h2 .small, -h3 .small { - font-size: 65%; -} - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; -} - -h4 small, -h5 small, -h6 small, -h4 .small, -h5 .small, -h6 .small { - font-size: 75%; -} - -h1, -.h1 { - font-size: 36px; -} - -h2, -.h2 { - font-size: 30px; -} - -h3, -.h3 { - font-size: 24px; -} - -h4, -.h4 { - font-size: 18px; -} - -h5, -.h5 { - font-size: 14px; -} - -h6, -.h6 { - font-size: 12px; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; -} - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small, -.small { - font-size: 85%; -} - -cite { - font-style: normal; -} - -.text-muted { - color: #999999; -} - -.text-primary { - color: #428bca; -} - -.text-primary:hover { - color: #3071a9; -} - -.text-warning { - color: #8a6d3b; -} - -.text-warning:hover { - color: #66512c; -} - -.text-danger { - color: #a94442; -} - -.text-danger:hover { - color: #843534; -} - -.text-success { - color: #3c763d; -} - -.text-success:hover { - color: #2b542c; -} - -.text-info { - color: #31708f; -} - -.text-info:hover { - color: #245269; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -.list-inline > li:first-child { - padding-left: 0; -} - -dl { - margin-top: 0; - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.428571429; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -blockquote small, -blockquote .small { - display: block; - line-height: 1.428571429; - color: #999999; -} - -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small, -blockquote.pull-right .small { - text-align: right; -} - -blockquote.pull-right small:before, -blockquote.pull-right .small:before { - content: ''; -} - -blockquote.pull-right small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} - -blockquote:before, -blockquote:after { - content: ""; -} - -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -@media (min-width: 768px) { - .container { - width: 750px; - } -} - -@media (min-width: 992px) { - .container { - width: 970px; - } -} - -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} - -.row { - margin-right: -15px; - margin-left: -15px; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.col-xs-1, -.col-sm-1, -.col-md-1, -.col-lg-1, -.col-xs-2, -.col-sm-2, -.col-md-2, -.col-lg-2, -.col-xs-3, -.col-sm-3, -.col-md-3, -.col-lg-3, -.col-xs-4, -.col-sm-4, -.col-md-4, -.col-lg-4, -.col-xs-5, -.col-sm-5, -.col-md-5, -.col-lg-5, -.col-xs-6, -.col-sm-6, -.col-md-6, -.col-lg-6, -.col-xs-7, -.col-sm-7, -.col-md-7, -.col-lg-7, -.col-xs-8, -.col-sm-8, -.col-md-8, -.col-lg-8, -.col-xs-9, -.col-sm-9, -.col-md-9, -.col-lg-9, -.col-xs-10, -.col-sm-10, -.col-md-10, -.col-lg-10, -.col-xs-11, -.col-sm-11, -.col-md-11, -.col-lg-11, -.col-xs-12, -.col-sm-12, -.col-md-12, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12 { - float: left; -} - -.col-xs-12 { - width: 100%; -} - -.col-xs-11 { - width: 91.66666666666666%; -} - -.col-xs-10 { - width: 83.33333333333334%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-8 { - width: 66.66666666666666%; -} - -.col-xs-7 { - width: 58.333333333333336%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-5 { - width: 41.66666666666667%; -} - -.col-xs-4 { - width: 33.33333333333333%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-2 { - width: 16.666666666666664%; -} - -.col-xs-1 { - width: 8.333333333333332%; -} - -.col-xs-pull-12 { - right: 100%; -} - -.col-xs-pull-11 { - right: 91.66666666666666%; -} - -.col-xs-pull-10 { - right: 83.33333333333334%; -} - -.col-xs-pull-9 { - right: 75%; -} - -.col-xs-pull-8 { - right: 66.66666666666666%; -} - -.col-xs-pull-7 { - right: 58.333333333333336%; -} - -.col-xs-pull-6 { - right: 50%; -} - -.col-xs-pull-5 { - right: 41.66666666666667%; -} - -.col-xs-pull-4 { - right: 33.33333333333333%; -} - -.col-xs-pull-3 { - right: 25%; -} - -.col-xs-pull-2 { - right: 16.666666666666664%; -} - -.col-xs-pull-1 { - right: 8.333333333333332%; -} - -.col-xs-pull-0 { - right: 0; -} - -.col-xs-push-12 { - left: 100%; -} - -.col-xs-push-11 { - left: 91.66666666666666%; -} - -.col-xs-push-10 { - left: 83.33333333333334%; -} - -.col-xs-push-9 { - left: 75%; -} - -.col-xs-push-8 { - left: 66.66666666666666%; -} - -.col-xs-push-7 { - left: 58.333333333333336%; -} - -.col-xs-push-6 { - left: 50%; -} - -.col-xs-push-5 { - left: 41.66666666666667%; -} - -.col-xs-push-4 { - left: 33.33333333333333%; -} - -.col-xs-push-3 { - left: 25%; -} - -.col-xs-push-2 { - left: 16.666666666666664%; -} - -.col-xs-push-1 { - left: 8.333333333333332%; -} - -.col-xs-push-0 { - left: 0; -} - -.col-xs-offset-12 { - margin-left: 100%; -} - -.col-xs-offset-11 { - margin-left: 91.66666666666666%; -} - -.col-xs-offset-10 { - margin-left: 83.33333333333334%; -} - -.col-xs-offset-9 { - margin-left: 75%; -} - -.col-xs-offset-8 { - margin-left: 66.66666666666666%; -} - -.col-xs-offset-7 { - margin-left: 58.333333333333336%; -} - -.col-xs-offset-6 { - margin-left: 50%; -} - -.col-xs-offset-5 { - margin-left: 41.66666666666667%; -} - -.col-xs-offset-4 { - margin-left: 33.33333333333333%; -} - -.col-xs-offset-3 { - margin-left: 25%; -} - -.col-xs-offset-2 { - margin-left: 16.666666666666664%; -} - -.col-xs-offset-1 { - margin-left: 8.333333333333332%; -} - -.col-xs-offset-0 { - margin-left: 0; -} - -@media (min-width: 768px) { - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11, - .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 992px) { - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11, - .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-0 { - margin-left: 0; - } -} - -@media (min-width: 1200px) { - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11, - .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} - -table { - max-width: 100%; - background-color: transparent; -} - -th { - text-align: left; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} - -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} - -.table > tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; -} - -.table > thead > tr > .active, -.table > tbody > tr > .active, -.table > tfoot > tr > .active, -.table > thead > .active > td, -.table > tbody > .active > td, -.table > tfoot > .active > td, -.table > thead > .active > th, -.table > tbody > .active > th, -.table > tfoot > .active > th { - background-color: #f5f5f5; -} - -.table-hover > tbody > tr > .active:hover, -.table-hover > tbody > .active:hover > td, -.table-hover > tbody > .active:hover > th { - background-color: #e8e8e8; -} - -.table > thead > tr > .success, -.table > tbody > tr > .success, -.table > tfoot > tr > .success, -.table > thead > .success > td, -.table > tbody > .success > td, -.table > tfoot > .success > td, -.table > thead > .success > th, -.table > tbody > .success > th, -.table > tfoot > .success > th { - background-color: #dff0d8; -} - -.table-hover > tbody > tr > .success:hover, -.table-hover > tbody > .success:hover > td, -.table-hover > tbody > .success:hover > th { - background-color: #d0e9c6; -} - -.table > thead > tr > .danger, -.table > tbody > tr > .danger, -.table > tfoot > tr > .danger, -.table > thead > .danger > td, -.table > tbody > .danger > td, -.table > tfoot > .danger > td, -.table > thead > .danger > th, -.table > tbody > .danger > th, -.table > tfoot > .danger > th { - background-color: #f2dede; -} - -.table-hover > tbody > tr > .danger:hover, -.table-hover > tbody > .danger:hover > td, -.table-hover > tbody > .danger:hover > th { - background-color: #ebcccc; -} - -.table > thead > tr > .warning, -.table > tbody > tr > .warning, -.table > tfoot > tr > .warning, -.table > thead > .warning > td, -.table > tbody > .warning > td, -.table > tfoot > .warning > td, -.table > thead > .warning > th, -.table > tbody > .warning > th, -.table > tfoot > .warning > th { - background-color: #fcf8e3; -} - -.table-hover > tbody > tr > .warning:hover, -.table-hover > tbody > .warning:hover > td, -.table-hover > tbody > .warning:hover > th { - background-color: #faf2cc; -} - -@media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - -ms-overflow-style: -ms-autohiding-scrollbar; - -webkit-overflow-scrolling: touch; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; -} - -input[type="file"] { - display: block; -} - -select[multiple], -select[size] { - height: auto; -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; -} - -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - background-image: none; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-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-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} - -.form-control:-moz-placeholder { - color: #999999; -} - -.form-control::-moz-placeholder { - color: #999999; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #999999; -} - -.form-control::-webkit-input-placeholder { - color: #999999; -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; -} - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm { - height: 30px; - line-height: 30px; -} - -textarea.input-sm { - height: auto; -} - -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-lg { - height: 46px; - line-height: 46px; -} - -textarea.input-lg { - height: auto; -} - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} - -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; -} - -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} - -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; -} - -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} - -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; -} - -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} - -.form-control-static { - margin-bottom: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline select.form-control { - width: auto; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-control-static { - padding-top: 7px; -} - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; -} - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; -} - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default .badge { - color: #ffffff; - background-color: #fff; -} - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; -} - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; -} - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; -} - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; -} - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; -} - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; - -moz-osx-font-smoothing: grayscale; -} - -.glyphicon:empty { - width: 1em; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-lock:before { - content: "\e033"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-bookmark:before { - content: "\e044"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-camera:before { - content: "\e046"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-fire:before { - content: "\e104"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-calendar:before { - content: "\e109"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-bell:before { - content: "\e123"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-wrench:before { - content: "\e136"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-briefcase:before { - content: "\e139"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-paperclip:before { - content: "\e142"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-pushpin:before { - content: "\e146"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999999; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar .btn-group { - float: left; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - border-collapse: separate; - table-layout: fixed; -} - -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} - -.btn-group-justified > .btn-group .btn { - width: 100%; -} - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0; -} - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} - -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { - height: auto; -} - -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} - -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { - height: auto; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; -} - -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} - -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - white-space: nowrap; -} - -.input-group-btn:first-child > .btn { - margin-right: -1px; -} - -.input-group-btn:last-child > .btn { - margin-left: -1px; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -4px; -} - -.input-group-btn > .btn:hover, -.input-group-btn > .btn:active { - z-index: 2; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav > li { - position: relative; - display: block; -} - -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li.disabled > a { - color: #999999; -} - -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} - -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #428bca; -} - -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #dddddd; -} - -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} - -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; -} - -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} - -.nav-tabs.nav-justified > li { - float: none; -} - -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.nav-pills > li { - float: left; -} - -.nav-pills > li > a { - border-radius: 4px; -} - -.nav-pills > li + li { - margin-left: 2px; -} - -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #428bca; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified { - width: 100%; -} - -.nav-justified > li { - float: none; -} - -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} - -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} - -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs-justified { - border-bottom: 0; -} - -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} - -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; -} - -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse.in { - overflow-y: auto; -} - -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} - -.container > .navbar-header, -.container > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} - -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -@media (min-width: 768px) { - .navbar > .container .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} - -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} - -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} - -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} - -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} - -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} - -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} - -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - } - .navbar-form select.form-control { - width: auto; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} - -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} - -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} - -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} - -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} - -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} - -.navbar-default .navbar-brand { - color: #777777; -} - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} - -.navbar-default .navbar-text { - color: #777777; -} - -.navbar-default .navbar-nav > li > a { - color: #777777; -} - -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; -} - -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} - -.navbar-default .navbar-toggle { - border-color: #dddddd; -} - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #dddddd; -} - -.navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; -} - -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} - -.navbar-default .navbar-link { - color: #777777; -} - -.navbar-default .navbar-link:hover { - color: #333333; -} - -.navbar-inverse { - background-color: #222222; - border-color: #080808; -} - -.navbar-inverse .navbar-brand { - color: #999999; -} - -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} - -.navbar-inverse .navbar-toggle { - border-color: #333333; -} - -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333333; -} - -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; -} - -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; - background-color: #080808; -} - -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - padding: 0 5px; - color: #cccccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - background-color: #eeeeee; -} - -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} - -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} - -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} - -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} - -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label:empty { - display: none; -} - -.btn .label { - position: relative; - top: -1px; -} - -.label-default { - background-color: #999999; -} - -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} - -.label-primary { - background-color: #428bca; -} - -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; - border-radius: 10px; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #ffffff; -} - -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1, -.jumbotron .h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -.jumbotron .container { - max-width: 100%; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.thumbnail > img, -.thumbnail a > img { - display: block; - height: auto; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} - -.thumbnail .caption { - padding: 9px; - color: #333333; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert h4 { - margin-top: 0; - color: inherit; -} - -.alert .alert-link { - font-weight: bold; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable { - padding-right: 35px; -} - -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success hr { - border-top-color: #c9e2b3; -} - -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info hr { - border-top-color: #a6e1ec; -} - -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.alert-warning hr { - border-top-color: #f7e1b5; -} - -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.alert-danger hr { - border-top-color: #e4b9c0; -} - -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #ffffff; - text-align: center; - background-color: #428bca; - -webkit-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-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - 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: 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-size: 40px 40px; -} - -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} - -.progress-striped .progress-bar-success { - 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: 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); -} - -.progress-bar-info { - background-color: #5bc0de; -} - -.progress-striped .progress-bar-info { - 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: 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); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} - -.progress-striped .progress-bar-warning { - 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: 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); -} - -.progress-bar-danger { - background-color: #d9534f; -} - -.progress-striped .progress-bar-danger { - 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: 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); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 20px; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.list-group-item > .badge { - float: right; -} - -.list-group-item > .badge + .badge { - margin-right: 5px; -} - -a.list-group-item { - color: #555555; -} - -a.list-group-item .list-group-item-heading { - color: #333333; -} - -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -a.list-group-item.active, -a.list-group-item.active:hover, -a.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -a.list-group-item.active .list-group-item-heading, -a.list-group-item.active:hover .list-group-item-heading, -a.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} - -a.list-group-item.active .list-group-item-text, -a.list-group-item.active:hover .list-group-item-text, -a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel > .list-group { - margin-bottom: 0; -} - -.panel > .list-group .list-group-item { - border-width: 1px 0; -} - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.panel > .table, -.panel > .table-responsive > .table { - margin-bottom: 0; -} - -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #dddddd; -} - -.panel > .table > tbody:first-child th, -.panel > .table > tbody:first-child td { - border-top: 0; -} - -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} - -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} - -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} - -.panel > .table-bordered > thead > tr:last-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-bordered > thead > tr:last-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; -} - -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} - -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} - -.panel-title > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} - -.panel-group .panel + .panel { - margin-top: 5px; -} - -.panel-group .panel-heading { - border-bottom: 0; -} - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; -} - -.panel-group .panel-footer { - border-top: 0; -} - -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} - -.panel-default { - border-color: #dddddd; -} - -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #dddddd; -} - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; -} - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; -} - -.panel-primary { - border-color: #428bca; -} - -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} - -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} - -.panel-success { - border-color: #d6e9c6; -} - -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} - -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-warning { - border-color: #faebcc; -} - -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; -} - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; -} - -.panel-danger { - border-color: #ebccd1; -} - -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; -} - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; -} - -.panel-info { - border-color: #bce8f1; -} - -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-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); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - display: none; - overflow: auto; - overflow-y: scroll; -} - -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-dialog { - position: relative; - z-index: 1050; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} - -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.428571429; -} - -.modal-body { - position: relative; - padding: 20px; -} - -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -@media screen and (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; - content: " "; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; - content: " "; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; - content: " "; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; - content: " "; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - outline: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} - -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; -} - -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} - -.carousel-control .icon-prev:before { - content: '\2039'; -} - -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #ffffff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #ffffff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .glyphicons-chevron-left, - .carousel-control .glyphicons-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -.visible-xs, -tr.visible-xs, -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - table.visible-xs.visible-sm { - display: table; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - table.visible-xs.visible-md { - display: table; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - table.visible-xs.visible-lg { - display: table; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm, -tr.visible-sm, -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - table.visible-sm.visible-xs { - display: table; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - table.visible-sm.visible-md { - display: table; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - table.visible-sm.visible-lg { - display: table; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md, -tr.visible-md, -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - table.visible-md.visible-xs { - display: table; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - table.visible-md.visible-sm { - display: table; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - table.visible-md.visible-lg { - display: table; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } -} - -.visible-lg, -tr.visible-lg, -th.visible-lg, -td.visible-lg { - display: none !important; -} - -@media (max-width: 767px) { - .visible-lg.visible-xs { - display: block !important; - } - table.visible-lg.visible-xs { - display: table; - } - tr.visible-lg.visible-xs { - display: table-row !important; - } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { - display: block !important; - } - table.visible-lg.visible-sm { - display: table; - } - tr.visible-lg.visible-sm { - display: table-row !important; - } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { - display: block !important; - } - table.visible-lg.visible-md { - display: table; - } - tr.visible-lg.visible-md { - display: table-row !important; - } - th.visible-lg.visible-md, - td.visible-lg.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -table.hidden-xs { - display: table; -} - -tr.hidden-xs { - display: table-row !important; -} - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs, - tr.hidden-xs, - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm, - tr.hidden-xs.hidden-sm, - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md, - tr.hidden-xs.hidden-md, - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg, - tr.hidden-xs.hidden-lg, - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; - } -} - -.hidden-sm { - display: block !important; -} - -table.hidden-sm { - display: table; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs, - tr.hidden-sm.hidden-xs, - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm, - tr.hidden-sm, - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md, - tr.hidden-sm.hidden-md, - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-sm.hidden-lg, - tr.hidden-sm.hidden-lg, - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; - } -} - -.hidden-md { - display: block !important; -} - -table.hidden-md { - display: table; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs, - tr.hidden-md.hidden-xs, - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm, - tr.hidden-md.hidden-sm, - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md, - tr.hidden-md, - th.hidden-md, - td.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-md.hidden-lg, - tr.hidden-md.hidden-lg, - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; - } -} - -.hidden-lg { - display: block !important; -} - -table.hidden-lg { - display: table; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-lg.hidden-xs, - tr.hidden-lg.hidden-xs, - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm, - tr.hidden-lg.hidden-sm, - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md, - tr.hidden-lg.hidden-md, - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-lg, - tr.hidden-lg, - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} - -.visible-print, -tr.visible-print, -th.visible-print, -td.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } - .hidden-print, - tr.hidden-print, - th.hidden-print, - td.hidden-print { - display: none !important; - } -} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.min.css b/pilotage/public/css/bootstrap.min.css deleted file mode 100644 index c547283b..00000000 --- a/pilotage/public/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-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-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-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-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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: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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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: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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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: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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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: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)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-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)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.override.css b/pilotage/public/css/bootstrap.override.css deleted file mode 100644 index e06fc9b7..00000000 --- a/pilotage/public/css/bootstrap.override.css +++ /dev/null @@ -1,184 +0,0 @@ -body{ - background-color:#eee; - -} -.container{ - background-color:white; - min-width:1170px; -} - - -table td.overflow-visible { - overflow:visible; /* Permet aux .dropdown de s'afficher correctement*/ -} - -.table{ - background-color:white; -} - -.table-striped > tbody > tr > .danger, -.table-striped > tbody > .danger > td, -.table-striped > tbody > .danger > th { - background-color: #f2dede !important; -} - -.table-striped > tbody > tr > .warning, -.table-striped > tbody > .warning > td, -.table-striped > tbody > .warning > th { - background-color: #fcf8e3 !important; -} - -.table-bordered > thead > tr:last-child > th { - border-bottom-width: 0px !important; -} - -.form-horizontal .form-group { - margin-left: 0px; - margin-right: 0px; -} - -.glyphicon span { - padding-left:0.5em; - font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; -} - -/* Formulaires */ -.oblig{ - color:red; - -} -.gestion_couche .tooltip-inner { - white-space:pre; - max-width:none; - text-align:left; -} - -.tooltip-inner .tab{ - padding-left:1em; - -} - -.tooltip-inner .actif{ - color:#41ab5d; -} - -form .row{ - margin-bottom:0.5em; -} - -@media screen and (max-width: 768px){ - - h3, - .text-right{ - text-align:left; - } -} -/*Fin Formulaires*/ - - -select { - height:26px; -} - - - .table-search{ - table-layout:fixed; - width:1155px; -} - -.table-search td{ - overflow:hidden; - text-overflow:ellipsis; -} -.table-search td.overflow-visible{ - overflow:visible; -} - -.table-search pre{ - max-height:200px; - overflow: hidden; - background-color:transparent; - border:none; -} - -.table-search .id{ - width:44px; - -} - -.table-search .est_visible{ - width:70px; -} - -.table-search .est_active{ - width:70px; -} - - -.table-search .est_lecture{ - width:60px; -} - -.table-search .est_analyse{ - width:60px; -} - -.table-search .est_ecriture{ - width:60px; -} - -.table-search .est_exportation{ - width:85px; -} - -.table-search .date_modif, -.table-search .date_chargement{ - width:180px; -} - -.table-search .connexion{ - width:600px; -} - -.table-search .voir{ - width:50px; -} - -.table-search .actions{ - width:100px; -} - -.table-search .description{ - width:115px; -} - -.table-search .proprietaire{ - width:85px; -} - -.table-search .ordre{ - width:70px; -} - -.table-search.table-search-igo_classe_entite .geometries{ - width:90px; -} - -.table-search.table-search-igo_classe_entite .catalogue-csw{ - max-width:100px; -} -.glyphicon-retour{ - //Inverser le sens de la flêche - -ms-transform: scale(-1,1); /* IE 9 */ - -webkit-transform: scale(-1,1); /* Chrome, Safari, Opera */ - transform: scale(-1,1); - margin-right:0.5em; -} - -.color-green{ - color:green; -} - -.color-red{ - color:red; -} diff --git a/pilotage/public/css/datepicker.css b/pilotage/public/css/datepicker.css deleted file mode 100644 index 05c1d8c9..00000000 --- a/pilotage/public/css/datepicker.css +++ /dev/null @@ -1,204 +0,0 @@ -/*! - * Datetimepicker for Bootstrap v3 - * https://github.com/Eonasdan/bootstrap-datetimepicker/ - */ -.bootstrap-datetimepicker-widget { - top: 0; - left: 0; - width: 250px; - padding: 4px; - margin-top: 1px; - z-index: 99999 !important; - border-radius: 4px; -} -.bootstrap-datetimepicker-widget.timepicker-sbs { - width: 600px; -} -.bootstrap-datetimepicker-widget.bottom: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: 7px; -} -.bootstrap-datetimepicker-widget.bottom:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid white; - position: absolute; - top: -6px; - left: 8px; -} -.bootstrap-datetimepicker-widget.top:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - position: absolute; - bottom: -7px; - left: 6px; -} -.bootstrap-datetimepicker-widget.top:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-top: 6px solid white; - position: absolute; - bottom: -6px; - left: 7px; -} -.bootstrap-datetimepicker-widget .dow { - width: 14.2857%; -} -.bootstrap-datetimepicker-widget.pull-right:before { - left: auto; - right: 6px; -} -.bootstrap-datetimepicker-widget.pull-right:after { - left: auto; - right: 7px; -} -.bootstrap-datetimepicker-widget > ul { - list-style-type: none; - margin: 0; -} -.bootstrap-datetimepicker-widget .timepicker-hour, -.bootstrap-datetimepicker-widget .timepicker-minute, -.bootstrap-datetimepicker-widget .timepicker-second { - width: 100%; - font-weight: bold; - font-size: 1.2em; -} -.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator { - width: 4px; - padding: 0; - margin: 0; -} -.bootstrap-datetimepicker-widget .datepicker > div { - display: none; -} -.bootstrap-datetimepicker-widget .picker-switch { - text-align: center; -} -.bootstrap-datetimepicker-widget table { - width: 100%; - margin: 0; -} -.bootstrap-datetimepicker-widget td, -.bootstrap-datetimepicker-widget th { - text-align: center; - width: 20px; - height: 20px; - border-radius: 4px; -} -.bootstrap-datetimepicker-widget td.day:hover, -.bootstrap-datetimepicker-widget td.hour:hover, -.bootstrap-datetimepicker-widget td.minute:hover, -.bootstrap-datetimepicker-widget td.second:hover { - background: #eeeeee; - cursor: pointer; -} -.bootstrap-datetimepicker-widget td.old, -.bootstrap-datetimepicker-widget td.new { - color: #999999; -} -.bootstrap-datetimepicker-widget td.today { - position: relative; -} -.bootstrap-datetimepicker-widget td.today:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-bottom: 7px solid #428bca; - border-top-color: rgba(0, 0, 0, 0.2); - position: absolute; - bottom: 4px; - right: 4px; -} -.bootstrap-datetimepicker-widget td.active, -.bootstrap-datetimepicker-widget td.active:hover { - background-color: #428bca; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.bootstrap-datetimepicker-widget td.active.today:before { - border-bottom-color: #fff; -} -.bootstrap-datetimepicker-widget td.disabled, -.bootstrap-datetimepicker-widget td.disabled:hover { - background: none; - color: #999999; - cursor: not-allowed; -} -.bootstrap-datetimepicker-widget td span { - display: block; - width: 47px; - height: 54px; - line-height: 54px; - float: left; - margin: 2px; - cursor: pointer; - border-radius: 4px; -} -.bootstrap-datetimepicker-widget td span:hover { - background: #eeeeee; -} -.bootstrap-datetimepicker-widget td span.active { - background-color: #428bca; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.bootstrap-datetimepicker-widget td span.old { - color: #999999; -} -.bootstrap-datetimepicker-widget td span.disabled, -.bootstrap-datetimepicker-widget td span.disabled:hover { - background: none; - color: #999999; - cursor: not-allowed; -} -.bootstrap-datetimepicker-widget th.switch { - width: 145px; -} -.bootstrap-datetimepicker-widget th.next, -.bootstrap-datetimepicker-widget th.prev { - font-size: 21px; -} -.bootstrap-datetimepicker-widget th.disabled, -.bootstrap-datetimepicker-widget th.disabled:hover { - background: none; - color: #999999; - cursor: not-allowed; -} -.bootstrap-datetimepicker-widget thead tr:first-child th { - cursor: pointer; -} -.bootstrap-datetimepicker-widget thead tr:first-child th:hover { - background: #eeeeee; -} -.input-group.date .input-group-addon span { - display: block; - cursor: pointer; - width: 16px; - height: 16px; -} -.bootstrap-datetimepicker-widget.left-oriented:before { - left: auto; - right: 6px; -} -.bootstrap-datetimepicker-widget.left-oriented:after { - left: auto; - right: 7px; -} -.bootstrap-datetimepicker-widget ul.list-unstyled li div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td { - padding: 0px !important; -} \ No newline at end of file diff --git a/pilotage/public/css/main.css b/pilotage/public/css/main.css deleted file mode 100644 index b1fb7d57..00000000 --- a/pilotage/public/css/main.css +++ /dev/null @@ -1,26 +0,0 @@ -.container h4{ - border-bottom: orange 1px solid; -} - -.oblig{ - font-size:0.6em; - vertical-align:top; - color:red; -} - - -.action-index .oblig, -.action-index .creer, -.action-index .editer{ - display:none; -} - - -/* igo_couche */ -body.igo_couche label.pas-important{ - font-weight:normal; -} -body.igo_couche hr{ - height:2px; - background-color:grey; -} \ No newline at end of file diff --git a/pilotage/public/css/mapfile.css b/pilotage/public/css/mapfile.css deleted file mode 100644 index 509f43f2..00000000 --- a/pilotage/public/css/mapfile.css +++ /dev/null @@ -1,82 +0,0 @@ -.retro-wizard h1, -.retro-wizard h3 { - text-align: center; -} - -.retro-wizard .wizard-nav{ - margin: 10px; - height: 30px; -} - -.retro-wizard .wizard-nav a, -.retro-wizard .wizard-nav button { - width: 100px; -} - -.retro-wizard .wizard-nav a { - float: left; -} - -.retro-wizard .wizard-nav button { - float: right; -} - -.critical td{ - background-color: #FFCC99 !important; -} - -table#layers td { - vertical-align: middle; -} - -table#layers th { - text-align: center; -} - -table#layers th.action , -table#layers td.action { - width: 180px; -} - -table#layers td.action input[type="checkbox"], -table#layers td.action input[type="radio"] { - margin-left: 73px; -} - -table#layers th.action input[type="checkbox"], -table#layers th.action input[type="radio"] { - margin-left: 10px; -} - -.radio input[type="radio"] { - margin-top: 0px; - margin-left: 0px; -} - -.radio span { - margin-top: 0px; - margin-right: 5px; - float: left; -} - -#progress .wrap-active { - background-color: white !important; -} - -table#layers select { - width: 100%; -} - -table#layers select.danger { - border-color: #A94442; - color: #A94442; - border-radius: 4px 4px 4px 4px; -} - -table#layers option { - color: #555555; -} - -table#layers option.danger { - color: #A94442; -} diff --git a/pilotage/public/csw/acrigeo.JPG b/pilotage/public/csw/acrigeo.JPG deleted file mode 100644 index ba481afb7215951fd945967518c4d64e62abf986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14065 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 diff --git a/pilotage/public/csw/codelists.xml b/pilotage/public/csw/codelists.xml deleted file mode 100644 index 98f3fde0..00000000 --- a/pilotage/public/csw/codelists.xml +++ /dev/null @@ -1,2148 +0,0 @@ - - - - - - creation - - Date à laquelle la ressource est créée - - - - publication - - Date à laquelle la ressource est publiée - - - - revision - - Date à laquelle la ressource est révisée - - - - - notAvailable - - Date qui désigne le moment à partir duquel il n'est plus possible d'obtenir la ressource. - - - - inForce - - Date qui désigne le moment où la ressource est devenue en application. - - - - adopted - - Date qui désigne le moment où la ressource a été approuvée. - - - - deprecated - - Date qui désigne le moment où la ressource a été désapprouvée. - - - - superseded - - Date qui désigne le moment où la ressource a été substituée par une autre ressource. - - - - - - - download - - Téléchargement de la ressource - - - - information - - Online information about the resource - - - - offlineAccess - - Instruction pour une commande auprès du distributeur - - - - order - - Commande en ligne pour obtenir la ressource - - - - search - - Interface de recherche pour trouver la ressource - - - - - - - documentDigital - - Document numérique contenant du texte et pouvant contenir des illustrations - - - - imageDigital - - Aspects à travers la télédétection, stocké sous format numérique - - - - documentHardcopy - - Document papier contenant du texte et pouvant contenir des illustrations - - - - imageHardcopy - - Aspects à travers la télédétection, reproduit sur un support utilisable par l’homme - - - - mapDigital - - Carte numérique au format raster ou vecteur - - - - mapHardcopy - - Carte imprimée sur papier ou autre support utilisable par l’homme - - - - modelDigital - - Modèle numérique 3D sous forme digitale - - - - modelHardcopy - - Modèle numérique 3D physique - - - - profileDigital - - Profil vertical sous forme numérique - - - - profileHardcopy - - Profil vertical sous forme papier - - - - tableDigital - - Représentation numérique d’informations sous forme de colonnes - - - - tableHardcopy - - Représentation d’informations sous forme de colonnes sur papier ou autre support utilisable par l’homme - - - - videoDigital - - Vidéo numérique - - - - videoHardcopy - - Vidéo enregistré sur bande - - - - - audioDigital - - Enregistrement audio numérique. - - - - audioHarcopy - - Enregistrement audio livré sur support analogique tel un ruban magnétique. - - - - multimediaDigital - - Représentation d'information qui utilise simultanément plus d'un mode numérique pour le texte, le son, et les images. - - - - multimediaHardcopy - - Représentation d'information qui utilise simultanément plus d'un mode anlogique pour le texte, le son, et les images. - - - - diagramDigital - - Information representée graphiquement par des diagrammes tels les camemberts, les diagrammes à barres et tout autre type de diagramme et enregistrée en format numérique. - - - - diagramHardcopy - - Information representée graphiquement par des diagrammes tels les camemberts, les diagrammes à barres et tout autre type de diagramme, et imprimée sur papier, support photographique ou autre média. - - - - - - resourceProvider - - Organisme qui fournit la ressource. Acteur qui délivre physiquement la ressource, soit de manière directe au destinataire, soit par l’intermédiaire d’un diffuseur - - - - custodian - - Acteur responsable de la gestion et de la mise à jour de la ressource - - - - owner - - Organisme qui est propriétaire de la ressource / Acteur qui détient les droits patrimoniaux de la ressource - - - - user - - Organisme qui utilise ou a utilisé la ressource - - - - distributor - - Organisme qui distribue la ressource. Diffuseur de second niveau de la ressource - - - - originator - - Organisme qui a commandé la ressource. Acteur qui a été habilité à créer la ressource et qui a mis en place les moyens pour la constituer - - - - pointOfContact - - Organisme que l’on peut contacter pour avoir des renseignements détaillés sur la ressource. Acteur à contacter en premier lieu pour obtenir des informations relatives à la ressource - - - - principalInvestigator - - Personne clé pour obtenir des informations sur la ressource et les recherches conduites autour de la ressource -Acteur qui a assuré la réalisation de la ressource,éventuellement en faisant appel à des co-traitants ou des sous traitants - - - - processor - - Organisme qui a réalisé des traitements sur la ressource. Acteur qui est intervenu lors de la réalisation de la ressource - - - - publisher - - Organisme qui assure la publication de la ressource. - - - - author - - Organisme ou personne qui est auteur. Acteur qui dispose des droits moraux relatifs à la ressource. - - - - - collaborator - - Personne ou groupe qui a contribué à la ressource autre que le chercheur principal. - - - - editor - - Personne ou groupe qui corrige ou modifie la ressource pour en améliorer le contenu. - - - - mediator - - Une classe d'entités qui négocie l'accès à la ressource et à qui la ressource est destiné ou utile. - - - - rightsHolder - - Personne ou organisation qui possède ou gère les droits sur la ressource. - - - - - - - directInternal - - Méthode d’évaluation de la qualité d’un jeu de données basée sur l’analyse des données du jeu où toutes les données requises sont internes au jeu de données - - - - directExternal - - Méthode d’évaluation de la qualité d’un jeu de données basée sur l’analyse des données du jeu où les références vers des données externes sont requises. - - - - indirect - - Méthode d’évaluation de la qualité basée sur une connaissance externe. - - - - - - - crossReference - - Référence d’un jeu de données à un autre - - - - largerWorkCitation - - Référence à un jeu de données maître - - - - partOfSeamlessDatabase - - Référence à un jeu de données stocké dans une même base de données - - - - source - - Références vers la source des données qui a permis de produire les cartes,… - - - - stereoMate - - Partie d’un ensemble d’images qui, utilisé ensemble, fournit une vision 3D de l’image. - - - - - - - campaign - - Séries d’actions planifiées - - - - collection - - Accumulation de données dans un but précis - - - - exercise - - Action spécifique répondant à une ou des fonctions - - - - experiment - - Recherche pour vérifier si une hypothèse est valide - - - - investigation - - Recherche systématique - - - - mission - - Spécifique opération d’une collecte de données - - - - sensor - - Part d’un équipement qui détecte une information - - - - operation - - Action qui est une partie d’une série d’action - - - - platform - - Véhicule ou autre support supportant un capteur - - - - process - - Méthode pour faire quelque chose - - - - program - - Action spécifiquement planifiée - - - - project - - Recherche ou développement organisé - - - - study - - Investigation - - - - task - - Partie d'un travail - - - - trial - - Processus visant à tester ou démontrer quelque chose - - - - - - - point - - Chaque cellule représente un point - - - - area - - Chaque cellule représente une surface - - - - - voxel - - Chaque cellule représente un volume. - - - - - - - ucs2 - - 16-bit fixed size Universal Character Set, based on ISO 10646 - - - - ucs4 - - 32-bit fixed size Universal Character Set, based on ISO/IEC - 10646 - - - - utf7 - - 7-bit variable size UCS Transfer Format, based on ISO/IEC 10646 - - - - utf8 - - 8-bit variable size UCS Transfer Format, based on ISO/IEC 10646 - - - - utf16 - - 16-bit variable size UCS Transfer Format, based on ISO/IEC 10646 - - - - 8859part1 - - ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic - character sets - Part 1 : Latin alphabet No.1 - - - - 8859part2 - - ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic - character sets - Part 2 : Latin alphabet No.2 - - - - 8859part3 - - ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic - character sets - Part 3 : Latin alphabet No.3 - - - - 8859part4 - - ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic - character sets - Part 4 : Latin alphabet No.4 - - - - 8859part5 - - ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic - character sets - Part 5 : Latin/Cyrillic alphabet - - - - 8859part6 - - ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic - character sets - Part 6 : Latin/Arabic alphabet - - - - 8859part7 - - ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic - character sets - Part 7 : Latin/Greek alphabet - - - - 8859part8 - - ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic - character sets - Part 8 : Latin/Hebrew alphabet - - - - 8859part9 - - ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic - character sets - Part 9 : Latin alphabet No.5 - - - - 8859part10 - - ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic - character sets - Part 10 : Latin alphabet No.6 - - - - 8859part11 - - ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic - character sets - Part 11 : Latin/Thai alphabet - - - - 8859part13 - - ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic - character sets - Part 13 : Latin alphabet No.7 - - - - 8859part14 - - ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic - character sets - Part 14 : Latin alphabet No.8 (Celtic) - - - - 8859part15 - - ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic - character sets - Part 15 : Latin alphabet No.9 - - - - 8859part16 - - ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic - character sets - Part 16 : Latin alphabet No.10 - - - - jis - - Japanese code set used for electronic transmission - - - - shiftJIS - - Japanese code set used on MS-DOS machines - - - - eucJP - - Japanese code set used on UNIX based machines - - - - usAscii - - United States ASCII code set (ISO 646 US) - - - - ebcdic - - IBM mainframe code set - - - - eucKR - - Korean code set - - - - big5 - - Traditional Chinese code set used in Taiwan, Hong Kong of China and other - areas - - - - GB2312 - - Simplified Chinese code set - - - - - - - unclassified - - La ressource ne revêt pas un caractère sensible - - - - restricted - - Le caractère sensible de la ressource restreint son utilisation ou sa diffusion - - - - confidential - - La ressource présente un caractère confidentiel. - - - - secret - - La confidentialité de la ressource implique des mesures de protection particulière - - - - topSecret - - La confidentialité de la ressource implique des mesures de protection extrêmes - - - - - - - image - - Représentation numérique d’un paramètre physique - - - - thematicClassification - - Codification selon une classification - - - - physicalMeasurement - - Valeur physique mesurée - - - - - - - class - - Description d’un ensemble d’objet qui ont les mêmes attributs, méthodes … - - - - codelist - - Enumération modifiable, utilisée pour exprimée une liste de valeurs extensible - - - - enumeration - - Enumération, utilisée pour exprimée une liste de valeurs non extensible - - - - codelistElement - - Valeur possible pour une liste de codes - - - - abstractClass - - Classe qui ne peut être directement instancée - - - - aggregateClass - - Classe qui est composé d’un ensemble de classes connecté par une relation de type Agrégation. - - - - specifiedClass - - Classe qui peut être substituée à une classe de niveau supérieur - - - - datatypeClass - - Classe avec peu ou aucune opération dont le rôle est de gérer l’état d’une autre classe pour les informations relevant de la transmission, le stockage, l’encodage ou la persistance. - - - - interfaceClass - - Noms des opérations qui caractérisent le comportement d’une ressource - - - - unionClass - - Classe décrivant une sélection d’un type spécifique - - - - metaClass - - Classe dont les instances sont des classes - - - - typeClass - - Classe utilisée pour spécifier un domaine d’instance (objet) en relation avec les opérations applicables à ces objets. Un type peut avoir des attributs et des associations - - - - characterString - - Texte libre - - - - integer - - Champ numérique - - - - association - - Relation entre deux classes - - - - - - - row - - Axe des ordonnées (axe - Y) - - - - column - - Axe des abscisses (axe X) - - - - vertical - - Axe vertical (axe Z) - - - - track - - Dans la direction de la ... - - - - crossTrack - - Perpendiculaire ... - - - - line - - Ligne de scannage d'un capteur - - - - sample - - Elément le long d'une ligne de scannage - - - - time - - Durée - - - - - - - complex - - Ensemble de primitives géométriques représentées comme l'union d'autres primitives - - - - composite - - Ensemble de lignes connectées entre elles - - - - curve - - Primitive géométrique à une dimension représentant une image continue d'une ligne - - - - point - - Primitive géométrique à zéro dimension représentant une position sans étendue - - - - solid - - Primitive géométrique à trois dimensions représentant un volume (définition à revoir) - - - - surface - - Primitive géométrique à deux dimensions représentant une surface - - - - - - - blurredImage - - Portion de l’image floue - - - - cloud - - Portion de l’image partiellement occultée par des nuages - - - - degradingObliquity - - Due à l’angle entre le plan de l’écliptique et le plan équatorial - - - - fog - - Portion de l’image partiellement occultée par du brouillard - - - - heavySmokeOrDust - - Portion de l’image partiellement occultée des fumées ou des poussières - - - - night - - Image prise la nuit - - - - rain - - Image prise durant la pluie - - - - semiDarkness - - Image prise pendant une semi obscurité - - - - shadow - - Image obscurcie par une ombre - - - - snow - - Image obscurcie par la neige - - - - terrainMasking - - Absence de données en raison des caractéristiques topographiques qui masquent les informations recherchées - - - - - - - discipline - - Mot-clé en relation avec une branche de la connaissance - - - - place - - Mot-clé identifiant un lieu - - - - stratum - - Couche géologique - - - - temporal - - Mot clef identifiant une période de temps - - - - theme - - Mot-clé identifiant un sujet particulier - - - - - product - - Mot-clé identifiant un type de produit. - - - - subTopicCAtegory - - Spécialisation d'une catégorie sujet pour fin de classification des données géographiques. - - - - - - - continual - - Mise à jour continue - - - - daily - - Mise à jour quotidienne - - - - weekly - - Mise à jour hebdomadaire - - - - fortnightly - - Mise à jour 2 fois par mois - - - - monthly - - Mise à jour mensuelle - - - - quarterly - - Mise à jour trimestrielle - - - - biannually - - Mise à jour bi-annuelle - - - - annually - - Mise à jour annuelle - - - - asNeeded - - Mise à jour lorsque cela est jugé nécessaire - - - - irregular - - Mise à jour irrégulière - - - - notPlanned - - Mise à jour non planifiée - - - - unknown - - Mise à jour inconnue - - - - - semimonthly - - Les données sont mises à jour deux fois par mois. - - - - - - - cpio - - Copie en entrée /sortie (commande et fichier au format UNIX) - - - - tar - - Format d’archivage sur bande - - - - highSierra - - Système de fichiers High Sierra - - - - iso9660 - - Système de fichier CD – ROM - - - - iso9660RockRidge - - Protocole d’échange Rock Ridge (UNIX) - - - - iso9660AppleHFS - - Système hiérarchique de fichiers (Macintosh) - - - - - - - cdRom - - Disque optique en lecture seule - - - - dvd - - Disque numérique universel - - - - dvdRom - - Disque numérique universel en lecture seule - - - - 3halfInchFloppy - - Disquette magnétique de 3.5 pouces - - - - 5quarterInchFloppy - - Disquette magnétique de 5.25 pouces - - - - 7trackTape - - Bande magnétique - - - - 9trackTape - - Bande magnétique - - - - 3480Cartridge - - Cartouche à bande magnétique 3480 - - - - 3490Cartridge - - Cartouche à bande magnétique 3490 - - - - 3580Cartridge - - Cartouche à bande magnétique 3580 - - - - 4mmCartridgeTape - - Bande magnétique 4 mm - - - - 8mmCartridgeTape - - Bande magnétique 8 mm - - - - 1quarterInchCartridgeTape - - Bande magnétique 0.25 pouces - - - - digitalLinearTape - - Bande magnétique 0.5 pouces - - - - onLine - - En ligne - - - - satellite - - Communication par satellite - - - - telephoneLink - - Liens via un réseau téléphonique - - - - hardcopy - - Document papier - - - - - - - mandatory - - Obligatoire - - - - optional - - Optionnel - - - - conditional - - Conditionnel - - - - - - - center - - Centre - - - - lowerLeft - - Bas gauche - - - - lowerRight - - Bas droit - - - - upperRight - - Haut droit - - - - upperLeft - - Haut gauche - - - - - - - completed - - La production du jeu de données est terminée - - - - historicalArchive - - Jeu de données historique - - - - obsolete - - Jeu de données obsolète - - - - onGoing - - Jeu de données ayant des mises à jour continues - - - - planned - - Jeu de données planifié - - - - required - - Jeu de données devant être produit - - - - underDevelopment - - Jeu de données en cours d’élaboration - - - - - proposed - - Données pour lesquelles des intéressés se sont manifestés mais dont le financement pour la production est incomplet et des partenaires sont recherchés. - - - - - - - copyright - - Restriction lié à l’exercice du droit moral - - - - patent - - Restriction induite par l’existence d’un brevet - - - - patentPending - - Restriction induite par le dépôt d’un brevet en cours - - - - trademark - - Restriction lié à l’existence d’un dépôt de marque - - - - license - - Restriction induite par l’existence d’une licence - - - - intellectualPropertyRights - - Restriction lié à l’exercice du droit patrimonial - - - - restricted - - Cette valeur n’a pas d’application identifiée en France - - - - otherRestrictions - - Restrictions non prévues - - - - - licenseUnrestricted - - Autorisation formelle non limité d'utiliser la ressource. - - - - licenseEndUser - - Autorisation formelle à une personne ou une entité d'utiliser la ressource et qui peut être différente de la personne qui la commande ou qui l'achète. - - - - licenseDistributor - - Autorisation formelle à une personne ou une entité de commercialiser ou de distribuer la ressource. - - - - privacy - - Ensemble des phénomèmes qui sont personnels, tant sur le plan physique que mental. - - - - statutory - - Prévu par la loi. - - - - confidential - - Secret et réservés à un nombre limité de personnes déterminées qui ne doivent pas en faire connaître le contenu. - - - - sensitivity - - Donnée dont la divulgation, l'altération, la perte ou la destruction risquent de paralyser ou de mettre en péril soit un service, soit l'organisation elle-même, et qui, de ce fait, devient particulièrement vulnérable. - - - - - - - attribute - - Informations appliquées aux caractéristiques de l’attribut - - - - attributeType - - Informations appliquées aux caractéristiques de l’entité - - - - collectionHardware - - Informations appliquées aux caractéristiques d’une collection matérielle - - - - collectionSession - - Informations appliquées aux caractéristiques d’une collection de session - - - - dataset - - Informations appliquées aux caractéristiques de jeu de données - - - - series - - Informations appliquées aux caractéristiques de la collection de données - - - - nonGeographicDataset - - Informations appliquées aux caractéristiques de jeux de données non géographiques - - - - dimensionGroup - - Informations appliquées à un groupe - - - - feature - - Informations appliquées à une entité - - - - featureType - - Informations appliquées à un type d’entité - - - - propertyType - - Informations appliquées à un type de propriété - - - - fieldSession - - Informations appliquées aux caractéristiques d’un champ de session - - - - software - - Informations appliquées à programme ou à une routine - - - - service - - Informations appliquées à un service Internet - - - - model - - Informations appliquées à modèle décrivant les objets ou un ensemble d'objets - - - - tile - - Tuile - - - - - - - vector - - Donnée vecteur (point, ligne, polygone) - - - - grid - - Donnée raster - - - - textTable - - Texte ou donnée tabulaire - - - - tin - - Réseau de triangle irrégulier (Triangulated Irregular Network) - - - - stereoModel - - Vue en 3 dimensions - - - - video - - Enregistrement vidéo - - - - - - - farming - - Elevage et/ou cultures. Exemples : agriculture, irrigation, aquaculture, plantations - - - - biota - - Flore et faune dans un écosystème naturel. Exemples : habitat, écologie, faune sauvage, faune aquatique, sciences biologiques, zones humides, végétation, biodiversité - - - - boundaries - - Exemples : limites de pays, de provinces, de départements, de communes - - - - climatologyMeteorologyAtmosphere - - Processus et phénomènes atmosphériques. Exemples : climat, météorologie, conditions atmosphériques, changements climatiques, couverture nuageuse - - - - economy - - Activités économiques. Exemples : production, travail, revenu, commerce, industrie, tourisme et éco-tourisme, foresterie, pêche, chasse, exploration et exploitation des ressources minières, pétrole, gaz naturel - - - - elevation - - Hauteurs au dessous et dessus du niveau de la mer. Exemples : altitude, bathymétrie, MNT, pentes et calculs dérivés de l’altitude - - - - environment - - Ressources naturelles, protection, conservation des ressources naturelles. Exemples : pollution, traitement et stockage des déchets, suivi de l’environnement, gestion du risque, réserves naturelles, paysage - - - - geoscientificInformation - - Informations relatives aux sciences de la terre. Exemples : composants et processus géophysiques, géologie, minéralogie, tectonique, risque sismique - - - - health - - Santé, services de santé, épidémiologie. Exemples : maladies et épidémie, facteurs affectant la santé, santé mentale et physique, services de santé - - - - imageryBaseMapsEarthCover - - Carte de référence. Exemples : occupation des terres, imagerie aérienne et satellitale, carte thématiques, carte topographiques - - - - intelligenceMilitary - - Bases militaires et infrastructures - - - - inlandWaters - - Exemples : fleuves, rivières, glaciers, lacs salés, systèmes hydrographiques, barrages, débits, qualité de l’eau - - - - location - - Exemples : zones postales, adresses, points de contrôle, réseau géodésique - - - - oceans - - Composants et caractéristiques du milieu maritime. Exemples : littoral, récifs, marée, etc. - - - - planningCadastre - - Exemples : carte d’utilisation des terres, plan d’occupation des sols, planification pour la prévention des risques - - - - society - - Caractéristiques des sociétés et des cultures. Exemples :lois, anthropologie, éducation, données démographiques, archéologique, suivi des systèmes sociaux, croyances, us et coutumes, crimes et justices - - - - structure - - Aménagements urbains. Exemples : musée, église, usines, maisons, monuments, boutiques, immeubles - - - - transportation - - Moyens de transports des personnes et des biens. Exemples : routes, aéroports, tunnels, viaducs, ponts, chemin de fer - - - - utilitiesCommunication - - Systèmes de distribution de gestion ou de stockage de l’énergie, de l’eau, des déchets. Infrastructures et services de communication. Exemples : source d’énergie solaire, hydroélectrique, nucléaire, épuration et distribution des eaux, réseau de distribution électrique, de gaz, réseau de télécommunication, radio. - - - - - - - geometryOnly - - Objets vecteurs sans aucune structure qui décrit la topologie - - - - topology1D - - Réseau sans surface (communément dénommée topologie réseau) - - - - planarGraph - - Topologie 1D planaire - - - - fullPlanarGraph - - Topologie 2D planaire - - - - surfaceGraph - - Topologie 1D avec surfaces - - - - fullSurfaceGraph - - Topologie 2D avec surfaces - - - - topology3D - - Topologie 3D - - - - fullTopology3D - - Couverture complète d’un espace Euclidien 3D - - - - abstract - - Objets géométriques sans description de la topologie - - - - - - - attribute - - Informations appliquées aux caractéristiques de l’attribut - - - - attributeType - - Informations appliquées aux caractéristiques de l’entité - - - - collectionHardware - - Informations appliquées aux caractéristiques d’une collection matérielle - - - - collectionSession - - Informations appliquées aux caractéristiques d’une collection de session - - - - dataset - - Informations appliquées aux caractéristiques de jeu de données - - - - series - - Informations appliquées aux caractéristiques de la collection de données - - - - nonGeographicDataset - - Informations appliquées aux caractéristiques de jeux de données non géographiques - - - - dimensionGroup - - Informations appliquées à un groupe - - - - feature - - Informations appliquées à une entité - - - - featureType - - Informations appliquées à un type d’entité - - - - propertyType - - Informations appliquées à un type de propriété - - - - fieldSession - - Informations appliquées aux caractéristiques d’un champ de session - - - - software - - Informations appliquées à programme ou à une routine - - - - service - - Informations appliquées à un service Internet - - - - model - - Informations appliquées à modèle décrivant les objets ou un ensemble d'objets - - - - tile - - Tile - - attribute - - Informations appliquées aux caractéristiques de l’attribut - - - - attributeType - - Informations appliquées aux caractéristiques de l’entité - - - - collectionHardware - - Informations appliquées aux caractéristiques d’une collection matérielle - - - - collectionSession - - Informations appliquées aux caractéristiques d’une collection de session - - - - dataset - - Informations appliquées aux caractéristiques de jeu de données - - - - series - - Informations appliquées aux caractéristiques de la collection de données - - - - nonGeographicDataset - - Informations appliquées aux caractéristiques de jeux de données non géographiques - - - - dimensionGroup - - Informations appliquées à un groupe - - - - feature - - Informations appliquées à une entité - - - - featureType - - Informations appliquées à un type d’entité - - - - propertyType - - Informations appliquées à un type de propriété - - - - fieldSession - - Informations appliquées aux caractéristiques d’un champ de session - - - - software - - Informations appliquées à programme ou à une routine - - - - service - - Informations appliquées à un service Internet - - - - model - - Informations appliquées à modèle décrivant les objets ou un ensemble d'objets - - - - tile - - Tile - - - - initiative - - The referencing entity applies to a transfer aggregate which was originally - identified as an initiative (DS_Initiative) - - - - stereomate - - The referencing entity applies to a transfer aggregate which was originally - identified as a stereo mate (DS_StereoMate) - - - - sensor - - The referencing entity applies to a transfer aggregate which was originally - identified as a sensor (DS_Sensor) - - - - platformSeries - - The referencing entity applies to a transfer aggregate which was originally - identified as a platform series (DS_PlatformSeries) - - - - sensorSeries - - The referencing entity applies to a transfer aggregate which was originally - identified as a sensor series (DS_SensorSeries) - - - - productionSeries - - The referencing entity applies to a transfer aggregate which was originally - identified as a production series (DS_ProductionSeries) - - - - transferAggregate - - The referencing entity applies to a transfer aggregate which has no existence - outside of the transfer context - - - - otherAggregate - - The referencing entity applies to a transfer aggregate which has an existence - outside of the transfer context, but which does not pertains to a specific aggregate - type. - - - - - - - DCP is XML - XML - - - - DCP is CORBA - CORBA - - - - DCP is JAVA - JAVA - - - - DCP is COM - COM - - - - DCP is SQL - SQL - - - - DCP is WebServices - WebServices - - - - - - - Présence d'une donnée associée - tight - - - - Présence de plusieurs données associées - mixed - - - - Absence de donnée associée - loose - - - - - - - in - - - - out - - - - in/out - - - - - \ No newline at end of file diff --git a/pilotage/public/csw/download.png b/pilotage/public/csw/download.png deleted file mode 100644 index 4c7bb5866384bd4e7d53b0bb45bc570f29449be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1074 zcmaJ=Pe>F|93GHFHZ_mc#c2%k;Lgn3e>#JsxihOSv?A+@3k5aKJay8UH_klURXUV( zvCJ-I5J9<=coMxO8AS$KP;{t^P(%@Q5X3HpCGGl%Fu=`F5$PUpx!1O2v)B00BHiwgw!Ry^9wbj2gNG-kd#Xdjwg0@VEdiShB7Xw4j$cWWXQZ(mGoaPi6S534&rx|>Tq%_|#`;QN!g z%B!2X*T3J?-D_{VoLg6Kg}xSbRE*ZgA5&q#%P97W5z9JRwJd0G?z1sF>|IfhjCk>DT`^N z;w5S-<*97h3K?Ctlr~ClTiQ~*A}We>L%HmGv}xZz-rnEyob$UppU>xe`F;NQWd`&8 z%uQ`gNhFeafInA2%nrl{m>3iP+*08VVzR+~!tfAOife=zLSjo$5ds7#gpr5<5lRv^ z*CU=J(qvG!Dhv;PH|sfIQy+hbk0b&}v+O z{GIRr6jrZFP$7^2QKPY#n7BBp{dg!9lY=2b9K}|lXv{4t7YR8Wh zU2QKY8a4^MHfLYZqS_#MciJqA?~ag<^p3vSa*K6#!-_y^&ShB&Vh^n0M~ zavIgvh@`z?z9I{?#tPJ=-p=ZRPNd&hf_a?6R{WIxL|vlYJF;F+#?6#Dz*`%5bqSOzp}n=AL@m5K-2kd~j{ zOVT>uIi_5QP4;aB7tYF5ZH#upZZ5PrITmLkPiL91Qmi91yllH=E zXZr`aP>PM`wR^K!TCB=uYgy0lDP5s&3}!o3f%Hv_uN6OUgfh8@D%P4ySKqhhH^J%8 z%6DlmdN9TTl?WMc#(GuZkN^+vqW6&dXK=7^y4xMajWc)qnZB9{fvE+Pb zLSu9Roz2ltn^9WoH{OF~ z*P}CwyKTBV`VK?O8K5W^$PYANC<%(m?%=K|SfqQs+v4Mi z+wWU{Y=3k^c-}voVQ*qvd|+o$&Cq#icNEfDkZ6WPlg??ln@3`-UrTgBQ)ci0uWz3` zzW?#&=#*BuL!SPT?KUv<_bsK>32V7f^l)$I(sGB?e-@Q2O=RiJe6 zU!FVv;x{S>k$Z8H!PBv^@3(Yc;em?M;GtvM6k zbx&RgU}J5=!^6-v?}JcxTybyylsnp=X>IJEuF@kHpyA=+%~!8#p}ZBLw=Zo>*N;6r z7@2jZ?N7T5mXx_K4lASV**iyD%5Cg>AvhMY2t1mV8QOQ4?%A;}{P2%8*_&1`pDVpL u*QL7K_PSN&%UaRS+MxT@eew~9OQaA>zx|;n=G+~BO$7MxxhK6hrT+&eg|goO diff --git a/pilotage/public/csw/icon_populaire.png b/pilotage/public/csw/icon_populaire.png deleted file mode 100644 index 54f0684e4af2929aa018952f2ef09b6b0623a078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2994 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 diff --git a/pilotage/public/csw/icon_populaire_mini.png b/pilotage/public/csw/icon_populaire_mini.png deleted file mode 100644 index ef1e2353cf254671ee8b0f713cd790cd0c10fb7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 zcmaJ?X;2eq7|v8$zzYK?SA`{jRZETy1lT};oCHh)1X^J%Bb#J_NU|G}1;V8jC<2NC zMU-larKzJRf>y;rEqGKAv9+~D@jy^J(1HhE%z(DtP{95u-I?9*nCE%k=Y7BTn=Olx zMJ$@{I-f)$Es7Kii9^STAZs#;&Ns2%G`7%q@sj{0wG2=A)rNY7%*xzsDW+dP^NU*#N4t?rvOtB zJe@=N$5ete2H<0Q1Ypq^R3#$-1OohNpg#lhhkOAh17y%aCY=#T1sQBsAe#XK(+`D+ zrdOq~q~W-ZO{ZsPXVbF%XqY~g4nhz_XE5nZCY3-?4LK+d8>y(lYeqqU z7?gUo4p(C+U{Qn>SSHS)5KjL|L93gUMGezsA__(~!a6!gV^~s}0ZOI+57laC(FR)Fz@ZQdG__jAhPd1y$R7;i1%d()6oNc|P{0oo1@MJJCM5Fb z&2R;nGEz8okw#?9?y0E6O>#An%h-a%BD%vsG+m ztHUzbZB*eY$o<%n73V;6wjHth`XndNBg<_7`njTjWjrqt=ELk@C4hu`S4z0>wSm*2D{yZWp$;PJe>x}Sa-xu12~y7+vEQ}yMSVwVk@ zN{$^XB?ULHL?4!zhQ3s+at+@dlhiAAdfZbjiH^SK?BQ{vN1DeuVBV~9Veo2AQ9*t9 zqk3E4tRp*$t5hiZII*Chz-}EWG(yfS?;lFC>3nC2+E2FpyYfry=w45g%$mAv&A}sA zj*Ysxxs9l`+T{RCRN3;%V{GzGfyQTIa&kOcBH63PuzS+ncQ=!V91iF6yRtTXXy1Gz zZ`ZaB3m4;gE#EdNl%kg5^h-mlc1E2z*f;VjP(yazdJHK9Mt`)E~c`gd;dAo z$)t&rI-JS-L1dNj;82IJe6-xT3tqa;X0qiCIhkbFQmL1dg~66zOQcXHIKoRV{2T58 BnM42p diff --git a/pilotage/public/csw/labels.xml b/pilotage/public/csw/labels.xml deleted file mode 100644 index 7f313e8b..00000000 --- a/pilotage/public/csw/labels.xml +++ /dev/null @@ -1,3436 +0,0 @@ - - - - - - - - - - - - - - Valeur alphanumérique pour l'identification d'une occurrence dans le domaine de valeurs - Code alphanumérique de l'identifiant. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. - - - - - - Code. Par exemple, le code epsg. - - - - - - - Nom ou identification de la personne ou de l'organisation responsable pour le domaine de valeurs - Informations sur la personne ou l'organisation en charge de l'espace nominal ou de l'identifiant. - - - - - - Date de l'édition - Date de la version / de l'édition (jj.mm.aaaa). - - - - - - Type de données pour des dates de références et des événements avec lesquels la date est en relation - Type de données intégrant la date de référence et le type de référence de la source citée. - - - - - - Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressource - Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressources. - - - - - - Date et heure à laquelle les donnée seront à disposition - Date et heure à laquelle les données seront disponibles. - - - - - - - Nom des tests qui ont été appliqués aux données - Nom du test appliqué aux données. - - - - - - Unité de l'indication de l'étendue verticale. Exemple : mètre, pied, millimètre, hectopascal - Unité altimétrique. Exemples : mètre, pied, millimètre, hectopascal - - - - - - Type de données pour la localisation de l'organisation ou la personne individuelle responsable - Type de données avec indication d'adresse. - - - - - - Type de données pour la description standardisée des informations de références de la ressource - Type de données destiné à une description unifiée des sources (renvoi standardisé aux sources). Ce type de données permet une indication standardisée des sources (CI_Citation). Il contient également des types de données pour la description des services en charge de données et de métadonnées (CI_ResponsibleParty). La description du service compétent peut intégrer le nom de l'organisation comme celui de la personne responsable au sein de cette organisation. Il est également impératif de décrire sa fonction (son rôle). CI_Contact recèle des informations sur le mode de communication avec le service compétent. CI_Citation contient les principaux attributs permettant l'identification d'un jeu de données ou d'une source. Parmi ceux-ci on peut citer le titre, sa forme abrégée, l'édition ou la date. Le type de données CI_Citation est alors appelé lorsque l'identification complète d'une information supplémentaire d'une source de données est à fournir. Des renvois sont effectués à partir de ce type de données vers chacun des autres types de données du groupe ?Citation?. CI_Citation est un regroupement de classes pouvant être appelées par plusieurs attributs de la norme. - - - - - - Type de données avec l'information utilisée pour permettre le contact avec la personne et/ou l'organisation responsable - Type de données intégrant des informations telles qu''un numéro de téléphone, de télécopie, des heures d'ouverture ou d'autres indications, toujours en rapport avec la personne ou le service désigné dans CI_ResponsibleParty. - - - - - - Type de données pour des dates de références et des événements avec lesquels la date est en relation - Type de données intégrant la date de référence et le type de référence de la source citée. - - - - - - Type de données pour l'information sur les sources en ligne, grâce auxquelles les éléments de métadonnées étendus sur le jeu de données, la spécification ou le profil peuvent être obtenus - Type de données contenant des informations relatives à la possibilité et dans l'affirmative, à la manière d'accéder en ligne au jeu de données. - - - - - - Type de données pour l'identification des personnes et organisations, ainsi que pour la description des modes de communication avec, associées avec le jeu de données - Type de données destiné à l'identification de personnes et/ou d'organisations en relation avec le jeu de données (en tant que responsable, en charge du traitement, propriétaire, etc.), intégrant par ailleurs d'autres informations telles que le numéro de téléphone, l'adresse (postale, messagerie électronique) permettant d'entrer en contact avec ces personnes et/ou organisations. Les trois premiers attributs (individualName, organisationName, positionName) de ce type de données permettent de savoir s'il s'agit de la description d'une personne, d'un service ou de la domiciliation d'une personne précédemment définie. Une indication au moins est obligatoire. La liste de sélection CI_RoleCode spécifie alors la nature de la responsabilité endossée par le service désigné. Cf. CI_Citation pour d'autres informations. - - - - - - Type de données pour l'information sur les séries ou le jeu de données global, à qui appartient le jeu de données - Type de données réservé aux informations relatives à la série ou au jeu de données composé dont le jeu de données fait partie. Il s'agit d'informations concernant le nom, l'édition et (en cas de disponibilité) le numéro de la page sur laquelle cette série du jeu de données peut être trouvée. l'ensemble des feuilles de la carte au 1:25''000 de swisstopo constitue par exemple une série. - - - - - - Type de données pour le numéro de téléphone de la personne ou du service responsable - Type de données pour les numéros de téléphone. - - - - - - Classe pour la description de la concordance des coordonnées mesurées avec les valeurs vraies ou acceptées comme telles - Classe destinée à décrire la précision des coordonnées effectives par rapport aux coordonnées théoriques. - Exemple : Des points GPS sont à plus de 10 m de leur localisation acceptée comme - vraie, Lampadaires issus de la restitution : 40 cm et Lampadaires issus des levers : - 5 cm. - - - - - - Classe pour la description de la justesse de la référence temporelle d'un élément (rapport d'erreur d'une mesure de temps) - Exemple : La date renseignée pour une procédure administrative est imprécise. - - - - - - Classe pour la description des données excédentaires présentes dans le jeu de donnée définit par le domaine d'applicabilité - Classe destinée à la description des données surabondantes présentes dans le jeu de données, conformément au champ d'application défini. - Exemple : Un bâtiment a été reporté deux fois, Un cours d’eau a été représenté alors qu’il n’aurait pas dû être pris en compte. - - - - - - Classe pour la description des données manquantes du jeu de donnée définit par le domaine d'applicabilité - Classe destinée à la description des données manquantes dans le jeu de données, conformément au champ d'application défini. - Exemple : il manque un bâtiment. - - - - - - Classe pour l'adhésion aux règles du schéma conceptuel - Classe permettant la description du respect des règles du schéma conceptuel. - Exemple : Une parcelle n’a pas de propriétaire. - - - - - - Classe qui contient l'information sur les résultats des évaluations des valeurs (ou jeu de valeurs) obtenues en comparaison avec une valeur de qualité spécifique - Classe contenant des informations relatives aux résultats d'exploitation se déduisant de la comparaison des valeurs obtenues avec un indicateur de qualité spécifié. - - - - - - Classe avec l'information sur la qualité pour les données spécifiées par un domaine de qualité des données - Classe comportant des informations relatives à la qualité du jeu de données. La qualité des données est exprimée par les éléments de métadonnées des classes DQ_DataQuality, LI_Lineage et DQ_Legislation. l'étendue des indications de qualité est définie et décrite dans la classe du champ d'application (DQ_Scope). La filiation ou la provenance des données est décrite dans la classe LI_Lineage qui est une agrégation des deux classes LI_Source (indications concernant les données source) et LI_ProcessStep (informations relatives aux étapes de traitement). Les différentes étapes de traitement peuvent à leur tour présenter une relation avec les données source. "+lineage" est obligatoire si "scope.DQ_Scope.level" = "Jeu de données". - Les prescriptions de qualité applicables au jeu de données à décrire figurent dans la classe DQ_Legislation. - - - La totalité des caractéristiques d’un produit qui lui confèrent l’aptitude à satisfaire des besoins exprimés ou - implicites, conformément à la norme EN ISO 19101. - - - - - - - Classe pour l'adhésion des valeurs aux domaines de valeurs - Classe permettant la description du respect des valeurs des domaines de valeurs. - Exemple : Un attribut a une valeur non renseignée dans la nomenclature, La charte graphique n’est pas respectée. - - - - - - Degré de conformité de l’échange de données avec le format spécifié. - Classe permettant la description du niveau d'accord auquel le jeu de données décrit dans le domaine de qualité des données est mémorisé en regard de la structure de données physique. - Exemple : France / Le lot EDIGEO n’est pas conforme au standard PCI, Les couleurs Autocad sont renseignées sur l’entité et non sur le layer, Un objet bâtiments est stocké dans la couche parcelle. - - - - - - Classe pour la description de la concordance des valeurs de position dans la grille avec les valeurs vraies ou acceptées comme telles - Classe permettant la description de la précision en position dans le réseau, en comparaison des valeurs théoriques. - - - - - - Classe pour la description de la précision des attributs non-quantitatifs - Classe destinée à la description de la précision d'attributs non quantitatifs. - Exemple : La commune du client est fausse. - - - - - - Classe pour la description de la précision des attributs quantitatifs - Classe destinée à la description de la précision d'attributs quantitatifs. - Exemple : La surface renseignée de la parcelle est inférieure de 20% à la réalité. - - - - - - Classe contenant l'information des valeurs (ou jeu de valeurs) obtenu en appliquant sur les données une mesure de qualité - Informations relatives aux résultats des tests livrés par l'application d'une mesure de qualité. - - - - - - Classe pour la description de la concordance des positions relatives des objets du domaine d'applicabilité avec les positions relatives respectives vraies ou admises comme telles - Classe destinée à la description de la précision de position relative par rapport à une position relative acceptée ou à une position théorique. - Exemple : Le bâtiment est de l’autre côté de la route. - - - - - - Description de l'étendue des charactéristiques des données pour lesquelles des informations de qualité sont rapportées - Description du domaine du jeu de données pour lequel des informations de qualité ont été saisies. d'autres indications peuvent être trouvées sous DQ_Dataquality. - Obligatoire - - - - - Classe pour la description de la justesse d'événements, ou séquences, ordonnés, dans le cas ou ils sont donnés - Exemple : La date renseignée d’approbation d’une procédure est antérieure à celle de la demande. - - - - - - Classe pour la description de la validité des données du domaine d'applicabilité, en regard de l'aspect temporel - Classe destinée à la description de la validité des données définies dans le domaine de qualité associé. - - - - - - Classe pour la description de la comparaison de classes ou leurs attributs assignés aux objets avec un discours universel - Classe permettant la description de la comparaison de classes ou d'attributs assignés aux objets avec un large éventail de possibilités. - Exemple : Un poteau a été affecté à la classe « poteau téléphone ». - - - - - - Classe pour la description de la justesse des caractéristiques topologiques définies explicitement du jeu de donnée définit par le domaine - Classe permettant de décrire l'exactitude des caractéristiques topologiques définies explicitement, conformément au champ d'application défini pour le jeu de données. - Exemple : La zone de plan d'occupation du sol (POS) ne passe pas sur tous les sommets des parcelles. - - - - - - Type de données pour la description d'une surface fermée, exprimée par un ensemble de paires de coordonnées (x, y), qui englobe le jeu de données. Le premier et le dernier points sont identiques - Type de données destiné à la description d'une surface fermée (polygone) définie par un ensemble de paires de coordonnées (x, y) et englobant le jeu de données. Le premier et le dernier point sont identiques. Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. - - - - - - Type de données pour l'information sur l'étendue horizontale, verticale et temporelle du jeu de données - Type de données contenant des informations relatives à l'extension horizontale, verticale et temporelle du jeu de données. Les types de données de cette classe contiennent des éléments de métadonnées décrivant l'extension spatiale et temporelle des données. EX_Extent est une agrégation des classes EX_GeographicExtent (description de l'extension géographique), EX_TemporalExtent (extension temporelle des données) et EX_VerticalExtent (extension verticale des données). l'extension géographique est spécifiée plus avant par une délimitation au moyen d'un polygone (EX_BoundingPolygon) comme par un rectangle de délimitation géographique (EX_GeographicBoundingBox) et une description textuelle (EX_GeographicDescription). Pour EX_Extent comme pour CI_Citation, il s'agit d'un regroupement de classes pouvant être appelées par plusieurs attributs de la norme. - - - - - - Type de données pour la description de la position géographique du jeu de données. Il s'agit ici d'une référence approximative de telle sorte qu''il n''est pas nécessaire de spécifier le système de coordonnées - Type de données destiné à la description de la position géographique du jeu de données. Il s'agit ici de la définition d'une enveloppe sommaire (délimitation en latitude et en longitude). Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. - Obligatoire - - - - - Type de données pour la description de la surface géographique en utilisant des identifiants - Type de données destiné à la description de l'extension géographique au moyen d'identifiants, par exemple une commune issue d'une liste. Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. - - - - - - Type de données pour la description de l'étendue en respectant les limites date/heure et spatiales - Type de données destiné à la description de l'extension dans le respect des limites spatiales et temporelles. Cette classe est une représentation de la classe EX_TemporalExtent. l'extension géographique est saisie en plus de l'indication de la validité temporelle. - - - - - - Type de données pour la description de la période de temps couverte par le contenu du jeu de donnée - La validité temporelle du jeu de données est définie dans cette classe. Cette classe connaît la représentation EX_SpatialTemporalExtent. Des informations supplémentaires peuvent être trouvées sous EX_Extent. - - - - - - Type de données pour la description de l'étendue verticale du jeu de données - Type de données permettant la description de la troisième dimension (axe Z) avec ses altitudes minimale et maximale ainsi que l'unité de mesure utilisée. Vous trouverez des informations supplémentaires sous EX_Extent. - - - - - - Numéro international normalisé d'un livre (ISBN) - - - - - - - Numéro international normalisé d'une publication en série (ISSN) - Numéro international normalisé d'une série de publications (ISSN) - - - - - - Classe contenant l'information sur les événements ou les données sources utilisées pour la construction des données - Classe contenant des informations relatives à la provenance et au processus de génération du jeu de données. - Ces indications font partie intégrante des informations sur la qualité. - Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. - - - L’historique d’une série de données et son cycle de vie, depuis sa collecte et son acquisition jusqu’à sa - forme actuelle, en passant par sa compilation et sa dérivation, conformément à la norme EN ISO 19101. - - - Example : X% lampadaires issus de restitution photogrammétrique, X% lampadaires issus levers - - - - - - Information sur un événement du processus de création ou de transformation, y inclus le processus de la maintenance des données - Informations relatives à une étape du processus de création ou de transformation des données incluant leur processus d'actualisation. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici. Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies via un texte, une date, une source et l'identification de la personne ayant réalisé le traitement. Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. - - - - - - Classe contenant l'information sur les données sources utilisées pour créer les données spécifiées par l'attribut scope (79) du domaine d'applicabilité - Classe contenant des informations relatives aux données source dont le domaine de données est issu et auxquelles il est renvoyé dans la classe DQ_DataQuality (attribut concernant l'étendue des indications de qualité). Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. - - - - - - Informations du jeu de données rassemblé - Informations relatives aux jeux de données de rang inférieur telles que le nom, l'identification, le genre de relation, le motif de la saisie. Exemple : lorsqu''un lot de la MO est décrit, il est renvoyé ici aux couches existantes de la MO pour ce lot (biens-fonds, couverture du sol, etc.). Ces indications décrivent la hiérarchie de rang inférieur, au contraire de l'attribut MD_Metadata.parentIdentifier décrivant lui le jeu de données de rang supérieur. - - - - - - Classe avec l'information sur le schéma d'application utilisé pour construire le jeu de donnée - Dans MD_ApplicationSchemaInformation, il est possible d'indiquer les conditions marginales sous lesquelles les données peuvent être utilisées pour une application spécifique. Exemple : supposons qu''un jeu de données relatif à des clairières ait été créé par des forestiers ; la description comprise dans MD_ApplicationSchemaInformation contiendrait alors des informations sur la manière dont les clairières sont à représenter en sylviculture comme sur les aspects sous lesquels leurs limites sont à définir et à interpréter. Si le même jeu de données avait été généré par des botanistes, les clairières auraient été considérées sous des aspects bien différents. d'autres signes conventionnels auraient par ailleurs été utilisés. De telles informations peuvent exercer une forte influence sur l'utilisation ultérieure comme sur le champ d'application. Les indications entrées sous MD_ApplicationSchemaInformation ne sont associées à aucune restriction d'utilisation puisque c''est déjà le cas sous MD_Constraints. Les conditions marginales sous lesquelles le jeu de données a été saisi puis est à traiter dans l'application correspondante sont entrées ici. Il peut même s'agir de plusieurs options différentes. La description d'un schéma d'application doit au moins comprendre le nom, le langage de modélisation et la langue utilisée. Le fait de savoir si le schéma de données est transmis sous forme d'un graphique, d'un fichier ASCII ou d'un fichier spécifique à un environnement logiciel donné est quant à lui facultatif. Si les noms des objets spatiaux définis par l'intermédiaire du schéma d'application sont à indiquer, alors la classe MD_SpatialAttributeSupplement renvoyant à la classe MD_FeatureTypeList peut servir à cela. - - - - - - Classe pour l'étendue des longueurs d'ondes utilisées dans le spectre électromagnétique - Classe précisant le domaine des longueurs d'onde utilisées dans le spectre électromagnétique. - - - - - - Classe pour la description d'un graphique qui contient une illustration du jeu de données - Classe destinée à la description d'un graphique contenant une représentation du jeu de données (une légende du graphique devrait être incluse). Il s'agit généralement d'un jeu de données d'exemple, valant pour des jeux de données de même nature (des cartes nationales par exemple). - - - - - - Classe pour les restrictions sur l'accès et l'utilisation d'une ressource ou de métadonnées - Classe recelant des informations relatives aux restrictions d'accès et d'utilisation de la ressource ou du jeu de métadonnées. Le paquet contenant la description des restrictions d'accès et d'utilisation intègre la classe MD_Constraints avec un attribut fournissant une description générale des restrictions et les deux sous-classes MD_LegalConstraints (informations sur les restrictions d'accès et d'utilisation dues au respect de droits d'auteurs) et MD_SecurityConstraints (informations sur les restrictions liées à des questions de sécurité de portée nationale ou assimilée telles que la confidentialité ou le secret). La classification des restrictions et des niveaux de sécurité s'effectue via des listes de sélection (MD_RestrictionCode et MD_ClassificationCode). - - - - - - CLasse pour l'information sur le contenu de la cellule de données raster - Des contenus physiques et thématiques d'une trame peuvent être décrits dans la classe MD_CoverageDescription. Si l'on se limite au contenu, les informations générales relatives aux attributs obligatoires attributeDescription et contentType peuvent convenir, la description de l'attribut dans attributeDescription devant toutefois s'effectuer via la valeur mesurée. Cf. MD_ContentInformation pour plus d'informations. - - - - - - Classe avec l'information utile pour identifier un jeu de données - Classe contenant des informations de base utilisées pour l'identification sans équivoque du ou des jeux de données. Il s'agit de la description du jeu de données concret. La classe MD_DataIdentification est la représentation de MD_Identification pour les données. Elle intègre des informations relatives à la caractérisation spatiale et temporelle des données, au jeu de caractères et à la langue utilisés, de même que d'autres informations descriptives. Une extension spatiale minimale des données est à indiquer par l'intermédiaire de l'option "geographicBox" (rectangle de délimitation géographique), de l'option "geographicDescription" (description textuelle de l'extension) ou des deux simultanément. Il est en outre possible de restreindre l'extension par le biais de l'attribut "extent", aussi bien au niveau spatial (via un polygone) que temporel. La norme prévoit une liste internationale de 19 thèmes (MD_TopicCategoryCode) pour la classification thématique des données, gérée par l'intermédiaire de l'attribut "topicCategory". Une recherche standardisée par thèmes est de la sorte possible au plan international. - - - - - - Classe avec les possibilités techniques et les médias avec lesquels une ressource peut être obtenue par un distributeur - Classe contenant les possibilités techniques et les supports envisageables pour l'obtention d'une ressource auprès d'un distributeur. Cf. MD_Distribution pour des informations complémentaires. - - - - - - Classe contenant les propriétés des axes - Cette classe contient les propriétés des axes requises pour la définition de données tramées. Ces informations sont utilisées dans la classe MD_GridSpatialRepresentation. d'autres informations peuvent y être trouvées. - - - - - - Classe avec l'information sur le distributeur de données et sur les possibilités d'obtenir les ressources - Classe contenant des informations relatives au distributeur des données de même qu''aux possibilités d'obtention du jeu de données. Cette classe recèle des indications sur le lieu de délivrance des données ainsi que sur la forme de leur obtention. MD_Distribution est une agrégation des informations concernant le transfert de données numériques (MD_DigitalTransferOptions) et des informations relatives au format des données (MD_Format). - - - - - - Classe avec l'information sur le distributeur - Classe contenant les informations relatives au distributeur des données (nom, rôle, adresse, etc.). d'autres informations peuvent être trouvées sous MD_Distribution. - - - - - - Classe pour des éléments de métadonnées nouveaux, qu''on ne trouve pas dans ISO 19115, utilisés pour décrire des données géographiques - Classe réservée à de nouveaux éléments de métadonnées requis pour la description des données géographiques mais absents de la norme ISO19115. - - - - - - Classe pour l'information qui définit le catalogue d'objets ou le modèle de donnée - Classe destinée aux informations identifiant le catalogue d'objets ou le modèle de données utilisé. Dans cette classe, le catalogue d'objets mis en application est spécifié sans entrer dans les détails de son contenu. Le catalogue d'objets auquel il est renvoyé par l'intermédiaire de l'attribut featureCatalogueCitation contient la description des propriétés des objets figurant dans le jeu de données. Dans la plupart des cas, le catalogue d'objets consiste en une liste exhaustive enregistrée qui n''est pas définie en fonction du jeu de données spécifique auquel le jeu de métadonnées se rapporte. La norme ne prévoit pas non plus que les objets définis dans le catalogue soient listés. Il est uniquement indiqué si le jeu de données contient effectivement des objets dont les propriétés coïncident avec celles des objets du catalogue. Vous trouverez d'autres informations sous MD_ContentInformation. - - - - - - Classe avec la description du format informatique avec lequel la représentation du jeu de donnée peut être enregistrée et transférée, sous la forme d'un enregistrement de données, d'un fichier, d'un message, d'un support de stockage ou d'un canal de transmission - Classe contenant la description du format de fichier dans lequel le jeu de données peut être stocké et transféré sur un support de données, dans un fichier, via un courrier électronique, un périphérique de stockage ou un canal de transmission. - - - - - - Classe pour le nombre d'objets utilisés par le jeu de données. Ils sont listés en fonction du type d'objet géométrique - Classe destinée au type et au nombre d'objets utilisés dans le jeu de données. Les objets sont ordonnés selon leur type géométrique. Cette information définit l'objet géométrique décrit dans la classe MD_VectorSpatialRepresentation. - - - - - - Classe pour la description du raster qui est aligné sur un système de coordonnées géographiques défini par un système à référence spatial, de telle sorte que chaque cellule puisse être localisée géographiquement avec les coordonnées raster ou l'origine du raster - Classe réservée à des trames dont les cellules sont disposées de façon régulière dans un système de coordonnées en projection ou dans un système de coordonnées géographiques défini dans le système de référence spatial, de telle sorte que chacune des cellules puisse être localisée par les coordonnées, l'origine, l'extension et l'orientation de la trame. La classe MD_Georectified permet la description de la rectification géographique de la trame. Le lien de la trame redressée avec le système de coordonnées spatial ne peut toutefois être défini que par l'intermédiaire des quatre coins de la trame. La description de l'extension spatiale de la trame de même que l'indication de points de contrôle pour la vérification de la précision du géoréférencement sont optionnels. - - - - - - Classe pour un raster, dont les cellules sont disposées irrégulièrement en fonction de différents systèmes de projections, de telle manière qu''ils ne sont pas localisables avec les propriétés du raster mais avec les informations de localisation disponible - Classe réservée à une trame dont les cellules sont disposées de façon irrégulière dans un système de coordonnées quelconque (en projection / géographique), de sorte qu''elles ne peuvent être localisées qu''à l'aide d'informations de localisation fournies et non au moyen des propriétés de la trame. La classe MD_Georeferenceable contient la description des informations concernant le géoréférencement. Il est établi une distinction dans ce cadre entre un géoréférencement par des points d'appui et par des paramètres de transformation. l'attribut "parameterCitation" permet, via le type de données CI_Citation, de fournir d'autres informations encore concernant la provenance et le service compétent ayant transmis les informations de géoréférencement. - - - - - - Classe contenant l'information sur les objets spatiaux de type raster du jeu de données - Cette classe contient des informations relatives à l'extension spatiale dans le cas d'un jeu de données tramées. Les valeurs entrées concernent les axes, les cellules, etc. Cette classe est une représentation de MD_SpatialRepresentation. Vous trouverez d'autres informations sous MD_SpatialRepresentation. - - - - - - Classe contenant une valeur codée unique à l'intérieur d'un domaine de valeurs - Cette classe contient un identifiant unique au sein d'un espace nominal. Il peut s'agir d'une description géographique (exemple : une liste de communes) ou une indication de sources (exemple : désignation d'un thésaurus). Dans la représentation RS_Identifier, l'identifiant est spécifiquement utilisé pour des systèmes de référence. MD_Identifier avec la représentation RS_Identifier peut être appelé par plusieurs attributs de la norme. - - - - - - Classe avec l'information sur l'utilisation d'une image - Classe contenant les informations relatives aux possibilités d'utilisation d'une image. - - - - - - Classe pour les mots clés, leur type et leur source de référence - Classe réservée aux mots clés, à leurs types (c.-à-d. la catégorie dont ils sont issus), de même qu''à leur référence ou à leur provenance. Les mots clés sont utilisés comme arguments de recherche. - - - - - - Classe pour les restrictions et conditions préalables légales pour accéder et utiliser les ressources où de métadonnées - Classe contenant des informations relatives aux restrictions juridiques s'appliquant à la ressource, au jeu de métadonnées ou à leur utilisation. Cette classe est une représentation de la classe MD_Constraints. Cf. MD_Constraints pour de plus amples informations. - - - - - - Classe sur la raison, l'étendue et la fréquence des mises à jour. - Les informations concernant l'étendue, la fréquence et la date de mise à jour des données sont contenues dans la classe MD_MaintenanceInformation. Cette classe recèle des attributs renseignant sur la fréquence et l'étendue de la mise à jour et de la réactualisation des données du jeu. Seule l'indication de la fréquence est impérative et doit être sélectionnée dans la liste MD_MaintenanceFrequencyCode. l'étendue de la mise à jour, les attributs qu''elle concerne et les descriptions associées sont des informations qu''il est possible d'indiquer via les attributs "updateScope" et "updateScopeDescription". Il n''est pas prévu d'indiquer l'extension spatiale de la mise à jour. Si seules des parties d'un jeu de données sont mises à jour ou si toutes ses parties ne sont pas mises à jour simultanément, alors les parties concernées par la description de la mise à jour peuvent être précisées via "+updateScopeDescription" dans la classe MD_ScopeDescription. - - - - - - Classe avec l'information sur les médias sur lesquels les données pouvent être distribuée - Classe contenant des informations relatives au support sur lequel les données peuvent être obtenues. Il s'agit d'un support hors ligne. d'autres informations peuvent être trouvées sous MD_Distribution. - - - - - - Classe qui définit les métadonnées concernant des ressources - Classe définissant les métadonnées d'une ou de plusieurs ressources. Les métadonnées peuvent se rapporter à des jeux de données entiers mais également à des objets géométriques, des attributs, des types d'objets géométriques et d'attributs ou à des agrégations de données, de séries de données ou de niveaux hiérarchiques ("hierarchyLevel"). Les relations de dépendance hiérarchique entre jeux de métadonnées peuvent être indiquées par la filiation ("parentIdentifier"). La norme ISO prévoit une relation monovalente entre jeux de métadonnées dans ce cadre, une seule filiation pouvant être indiquée et non plusieurs. La classe MD_Metadata présente également un attribut de contact avec le service compétent pour d'autres informations relatives aux métadonnées. - - - - - - Classe pour les informations décrivant les extensions du modèle de métadonnées - Classe contenant des informations décrivant les extensions des métadonnées. - - - - - - Classe avec l'information pour l'identification du catalogue de présentation utilisé - La classe MD_PortrayalCatalogueReference comprend uniquement l'attribut portrayalCatalogueCitation. Le catalogue utilisé pour la description de la représentation des objets peut être identifié ici via le type de données CI_Citation. La classe MD_PortrayalCatalogueReference permet uniquement la description des conditions marginales de la représentation "cartographique" sans tenir compte de leur mise en oeuvre. - - - - - - Classe pour l'information sur la dimension de la valeur mesurée dans chaque cellule - Classe destinée aux informations relatives aux domaines de valeurs de chacune des dimensions des valeurs mesurées dans les cellules. - - - - - - Classe pour l'information sur le système de référence - La classe MD_ReferenceSystem décrit le système de référence spatial et temporel utilisé pour le jeu de données. Dans cette classe, le lien avec le système géodésique de référence est établi à l'aide de l'attribut "referenceSystemIdentifier". Seuls le nom du système de référence et l'organisation associée sont saisis, aucun paramètre concret n''est entré. - - - - - - Classe : dérivé de ISO 19103 l'échelle, ou MD_RepresentativeFraction.denominator = 1 / Scale.measure et Scale.targetUnits = Scale.sourceUnits - Classe comportant des informations relatives à l'échelle. Seul le dénominateur de l'échelle est saisi dans cette classe. l'échelle est déduite de la norme ISO 19103. Les informations contenues dans cette classe sont requises pour la description de la résolution géométrique du jeu de données dans la classe MD_Resolution, pour l'attribut d'équivalence d'échelle ("equivalentScale"). Cf. également sous MD_Resolution. - - - - - - Classe avec le degré de détail exprimé avec un facteur d'échelle ou une distance au sol - Dans la classe MD_Resolution, le degré de spécification est indiqué en référence à l'objet. Cela signifie que la résolution d'un objet est à indiquer ici dans le cas d'une trame (exemple : la résolution spatiale d'une orthophoto de 50cm). Outre la distance au sol (distance), il est également possible de saisir une échelle pour indiquer le degré de spécification, éventualité à envisager dans le cas de données vectorielles ou tramées. l'échelle est précisée en recourant à la classe MD_RepresentativeFraction. - - - - - - Description de la classe d'information concernée par les informations - Description du domaine auquel se rapporte une information. Ces indications sont utilisées pour les informations de qualité (DQ_Quality) et les informations de mise à jour (MD_Maintenance) lorsque les caractéristiques ne sont pas homogènes sur l'ensemble du jeu de données décrit. l'un au moins de ces attributs doit être saisi. Exemple de la MO, jeu de données décrit : "Lot". La couche des biens-fonds est mise à jour en permanence, la couche de la nomenclature n''est quant à elle actualisée qu''au besoin. Si la mise à jour de la couche des biens-fonds est décrite, l'option "Biens-fonds" est entrée pour les propriétés. Les informations de qualité sont gérées sur le même modèle. Vous trouverez d'autres informations sous MD_MaintenanceInformation et DQ_DataQuality. - Il faut saisir un des attributs suivants: Attributs, Objets Géométriques, Occurences d'objets, Occurences d'attributs, Jeu de données, Autre. - - - - - Classe avec les restrictions de manipulation imposées sur les ressources où de métadonnées pour la sécurité nationale ou des situations de sécurité similaires - Classe contenant des informations relatives aux restrictions de sécurité liées à des questions de sécurité de portée nationale ou assimilée (exemple : secret, confidentialité, etc.). Cette classe est une représentation de la classe MD_Constraints. Cf. MD_Constraints pour d'autres informations. - - - - - - Classe pour l'identification des prestations, disponibles auprès un fournisseur de services, via un ensemble d'interfaces définissant un comportement (cf. ISO 19119 pour obtenir plus d'information). - Classe destinée à l'identification des services qu''un prestataire propose à l'utilisateur et dont le contenu et l'étendue sont définis par un ensemble d'informations. Dans cette classe, les domaines dans lesquels le prestataire met ses services à la disposition de l'utilisateur peuvent être saisis. l'attribut de type de service (serviceType) définit le nom du service géomatique proposé et l'attribut des propriétés du type de service (ServiceTypProperty) permet la description des caractéristiques qui lui sont associées. Ces deux attributs font appel à l'un des types de données définis dans la norme 19118. On suppose que les services géomatiques concernés sont standardisés et répertoriés au sein d'une liste. - - - - - - Classe pour la description des instructions et des modes usuels d'obtention de la ressource, comprenant également les informations sur les coûts - Classe contenant des informations relatives aux émoluments et à la commande. d'autres informations peuvent être trouvées sous MD_Distribution. - - - - - - Classe pour une brève description de la manière dont les ressources sont actuellement utilisées ou ont été utilisées - Brève description de la manière dont les ressources sont actuellement utilisées ou l'ont été, avant tout lorsqu''il s'agit d'applications spéciales poursuivant un objectif particulier. Exemple : un forestier saisit une clairière avec une précision, des signes conventionnels et des attributs bien différents de ceux qu''emploierait un biologiste. - - - - - - Classe qui contient l'information sur les objets géographiques de type vecteur du jeu de données - Cette classe contient des informations concernant l'extension spatiale lorsqu''un jeu de données vectorielles est concerné. Les valeurs entrées sont des informations relatives à la topologie et aux objets géométriques. Cette classe est une représentation de MD_SpatialRepresentation. Vous trouverez d'autres informations sous MD_SpatialRepresentation. - - - - - - Classe pour la description d'un texte libre multilingue sur des éléments de métadonnées - Classe réservée à la description d'un élément textuel de métadonnées, libre et multilingue. Le type de données PT_FreeText permet la gestion d'informations textuelles dans différentes langues. Le multilinguisme est accepté en cinq endroits différents du modèle CH-Profil : la description du contenu des données (résumé dans la classe MD_Identification), le titre d'indications de sources (titre dans CI_Citation), le nom et l'abréviation de services compétents (organisationName et organisationAcronym dans CI_ResponsibleParty), le code d'identifiants (code dans MD_Identifier) et les mots clés (keyword dans MD_Keyword). - - - - - - Classe pour l'identifiant utilisé pour les systèmes de référence - Classe réservée aux identifiants de systèmes de référence. Cette classe est une représentation de MD_Identifier pour l'identification d'un système de référence par des attributs supplémentaires. Cf. également sous MD_Identifier. - - - - - - Classe destinée à la description d'un élément de métadonnées URL libre multilingue - Classe destinée à la description d'un élément de métadonnées URL libre multilingue. Le type de données PT_FreeText permet de gérer des informations textuelles en plusieurs langues. - - - - - Court résumé explicatif du contenu des ressources - Court résumé descriptif du contenu du jeu de données. Cet attribut est du type PT_FreeText et est géré dans la classe du même nom. - Obligatoire - - - - - Contraintes d'accès appliquées pour assurer la protection de la propriété privée et intellectuelle, et autres restrictions spéciales ou limitations pour obtenir la ressource où de métadonnées - Restrictions d'accès relatives à la garantie de la propriété privée ou intellectuelle et restrictions de toutes natures visant à la conservation de la ressource ou des métadonnées. Elles peuvent être sélectionnées parmi les éléments suivants : droit d'auteur, brevet, brevet en voie de délivrance, marque, licence, propriété intellectuelle, diffusion limitée, autres restrictions. - - - - - - - Adresse physique et électronique à laquelle la personne ou l'organisation responsable peut être contactée - Adresse postale ou électronique d'un premier niveau de contact (par exemple un secrétariat). Ces informations sont du type CI_Address et sont gérées dans la classe du même nom. - - - - - - Canton ou département de l'emplacement - Canton - - - - - - Informations d'identification sur le jeu de données rassemblé - Informations d'identification des jeux de données de rang inférieur. Identification sans équivoque d'un objet au sein d'un espace nominal et indication du service responsable de ce nom et de son actualisation. Ces informations sont du type MD_Identifier et sont gérées dans la classe du même nom. - Condition - - - - Informations de référence sur le jeu de données rassemblé - Nom et autres indications de sources des jeux de données de rang inférieur. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. - Condition - - - - Met à dispositionles les informations sur le jeu de données rassemblé - Informations concernant le jeu de données de rang supérieur et les relations qu''il entretient avec le jeu de données décrit. Ces informations sont du type MD_AggregateInformation et sont gérées dans la classe du même nom. - - - - - - Nom raccourci ou autre façon d'écrire le nom, sous lequel l'information des informations de références est connue. Exemple : DCW pour "Digital Chart of the World" - Nom abrégé ou orthographe du titre/nom différente de celle sous laquelle l'information correspondante est connue. Exemple : DCW pour "Digital Chart of the World" - - - - - - Numéro d'amélioration du format - Numéro de la modification apportée au format. - - - - - - Nom d'un profil d'application qui peut être utilisé avec les ressources en ligne - Nom d'un profil d'application pouvant être utilisé pour la source en ligne. - - - - - - Informations sur le schéma conceptuel du jeu de données - Informations relatives au schéma conceptuel du jeu de données - - - - - - Type d'association sur le jeu de données rassemblé - Type de relation entre jeux de données de rang inférieur, autrement dit, nature du lien unissant les deux jeux de données. La sélection s'opère dans la liste suivante : transfert à titre de comparaison, comparaison avec le jeu de données de rang supérieur, partie d'une structure de données identique, renvoi à une source, couple stéréoscopique. - - - - - - Description de l'attribut décrit par la valeur mesurée - Description de l'attribut décrit par la valeur mesurée. - Obligatoire - - - - - Occurrences d'attributs sur lesquels l'information s'applique - Occurrences d'attributs auxquelles les informations se rapportent. - - - - - Attributs sur lesquels l'information s'applique - Attributs auxquels les informations se rapportent. - - - - - Personne ou service responsable pour la maintenance du domaine de valeurs - Personne ou organisation responsable de cet espace nominal, par exemple un service. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. - - - - - - Information sur les propriétés des axes spatio-temporels - Informations relatives aux propriétés des axes spatio-temporels telles que le nom, la dimension et la résolution. Ces informations sont du type MD_Dimension et sont gérées dans la classe du même nom. - - - - - - Nombre maximum de bits significatifs dans la représentation non-comprimée de la valeur dans chaque bande de chaque pixel - Nombre maximal de bits significatifs dans la représentation non comprimée de la valeur dans chaque gamme et dans chaque pixel. - - - - - - Indication si oui ou non les constantes pour les corrections de la calibration de la caméra sont à disposition - Indication de la présence éventuelle de constantes pouvant être utilisées pour les corrections d'étalonnage de chambre. - - - - - - Identification du type de raster (point ou cellule) - Définition du type de trame (point ou cellule). - Obligatoire - - - - - Relation du système de coordonnées raster au système de référence spatiale définie par la cellule du centre du raster et par les coordonnées correspondantes du système de référence spatiale - Lien du système de coordonnées de la trame avec le système terrestre défini par la cellule centrale de la trame et les coordonnées correspondantes dans le système de référence spatial. - - - - - - Nom complet du standard de code de caractères utilisé pour le jeu de métadonnées - Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. - Par défaut UTF-8 - - - - Nom entier du standard de code de caractères utilisé pour le jeu de données - Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. - Par défaut UTF-8 - - - - Nom complet du standard de code de caractères utilisé pour le jeu de métadonnées - Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. - Par défaut UTF-8 - - - - Indication si oui ou non des points de contrôle sont disponibles pour tester la précision des données raster géoréférencées - Indication de l'existence ou de l'absence de points de contrôle pour tester la précision du géoréférencement de la trame. - Obligatoire - - - - - Description des points de contrôle utilisés pour tester la précision des données raster géoréférencées - Description des points de contrôle utilisés pour tester la précision du géoréférencement de la trame. - Condition - - - - Informations de référence sur les ressources - Indication des sources du jeu de données décrit. Le nom ou le titre du fichier du jeu de données de même qu''une date du type adéquat (création, publication, traitement) sont gérés ici. Cet attribut est du type CI_Citation et est géré dans la classe du même nom. - - - - - - - Information sur le nom et la position d'une personne individuelle ou d'une organisation responsable pour la ressource - Informations concernant le nom et la domiciliation de la personne ou de l'organisation responsable de la source citée. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. - - - - - - Ville de l'emplacement - Ville, localité - - - - - - Noms des restrictions de manipulation sur les ressources où de métadonnées - Type de restriction. Sélection dans la liste suivante : non classé, diffusion restreinte, confidentiel, secret, top secret. - Obligatoire - - - - - Nom du système de classification - Le nom du système de classification peut être indiqué ici, s'il en existe un. - - - - - - Surface du jeu de données recouverte par les nuages, exprimée en pourcentage de la couverture spatiale - Surface du jeu de données images assombrie par des nuages (en pourcentage de la surface totale). - - - - - - Valeur alphanumérique pour l'identification d'une occurrence dans le domaine de valeurs - Code alphanumérique de l'identifiant. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. - Obligatoire - - - - - - Nom ou identification de la personne ou de l'organisation responsable pour la domaine de valeurs - Informations sur la personne ou l'organisation en charge de l'espace nominal ou de l'identifiant. - - - - - - Titre commun avec indication d'une appartenance. Note : le titre identifie des éléments d'une série collective, combiné avec l'information sur quels volumes sont à disposition à la source citée - Cet élement est utilisé en Suisse pour designer le nom d'une géodonnées de base qui correspond à l'entrée du catalogue Annexe I de la OGéo, car il est possible que plusieurs jeux de données "physiques" soient attribuée à une entrée "juridique". Ex.: L'entrée no. 47 "Cartes géophysiques" consiste de 3 jeux de données "Cartes géophysiques 1:500000", "Cartes géophysisques spéciales" et "Atlas gravimétrique 1:100000" - - - - - - Indication de la conformité du catalogue d'objets avec l'ISO 19110 - Indication de la conformité du catalogue d'objets mentionné avec la norme ISO 19110 - - - - - - Nombre de cycles de compressions (avec pertes) appliqués à l'image - Nombre de cycles de compression (avec pertes) appliqués à l'image - - - - - - Condition sous laquelle l'élément étendu est obligatoire - Condition sous laquelle l'élément est obligatoire. - - Condition - - - - Langage formelle utilisée dans le schéma d'application - Langage formel utilisé pour le schéma d'application. - Obligatoire - - - - - Organisme responsable pour les informations que contiennent les métadonnées. - Rôle (propriétaire, prestataire, gestionnaire, etc.) de la personne ou du service compétent pouvant être sélectionné dans la liste présentée ici. Cet attribut renvoie à la classe CI_ResponsibleParty dans laquelle les informations relatives au service ou à la personne concernée sont gérées. Cet attribut est du type CI_ResponsibleParty et est géré dans la classe du même nom. - Obligatoire - - - - - Indications concernant la personne ou l'organisation qui est responsable de la mis à jour des métadonnées - Informations concernant la personne ou l'organisation responsable de la mise à jour des données. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. - - - - - - Organisme responsable pour les informations que contiennent les métadonnées. - Rôle (propriétaire, prestataire, gestionnaire, etc.) de la personne ou du service compétent pouvant être sélectionné dans la liste présentée ici. Cet attribut renvoie à la classe CI_ResponsibleParty dans laquelle les informations relatives au service ou à la personne concernée sont gérées. Cet attribut est du type CI_ResponsibleParty et est géré dans la classe du même nom. - Obligatoire - - - - - Heures de service du service responsable - Adresse du service responsable. Ces informations sont du type CI_Contact et sont gérées dans la classe du même nom. - - - - - - Instructions supplémentaires sur quand et comment contacter la personne ou l'organisation responsable - Informations supplémentaires pour la prise de contact. - - - - - - Informations sur le catalogue d'objet et sur les descriptions de la couverture et des charactéristiques raster - Description du contenu du jeu de données. Renvoi au catalogue d'objets, au modèle de données ou à la description des données. Le contenu de ces catalogues et de ces descriptions ne fait toutefois pas partie des métadonnées. Ces informations sont gérées dans la classe MD_ContentInformation. - - - - - - Type d'information représenté par la valeur de la cellule - Type d'information représenté par la valeur de la cellule. La cellule est une image, une classification thématique ou une mesure physique. - Obligatoire - - - - - Indication si oui ou non des points de contrôle existent - Indication de l'existence ou de l'absence de points d'appui pour le géoréférencement. - Obligatoire - - - - - Relation du système de coordonnées raster au système terrestre définie par les cellules des quatre coins du raster et par les coordonnées correspondantes du système de référence spatial - Lien du système de coordonnées de la trame avec le système terrestre défini par les cellules des quatre coins de la trame et les coordonnées correspondantes dans le système de référence spatial. - Obligatoire - - - - - Pays dans la langue duquel l'URL libre est écrit - Pays dans la langue duquel l'URL libre est écrit, la sélection s'opère dans la liste des pays ISO. - - - - - Pays d'où provient la loi - Pays dans lequel la loi a été promulguée, sélection dans la liste ISO des pays. - - - - - - Pays de la langue dans le lequel le texte libre est écrit - Pays dans la langue duquel le texte libre est rédigé. Sélection dans la liste ISO des pays. - - - - - - Reconnaissance de ceux qui ont contribués à ces ressources - Reconnaissance ou confirmation des intervenants ayant apporté leur contribution à cette ressource. - - - - - - Estimation de la qualité des ressources - Estimation de la qualité du jeu de données. Ces informations sont gérées dans la classe DQ_DataQuality. - - - - - - Uniformed Resource Identifier (URI) du jeu de données, que les métadonnées décrivent - Identifiant URI (Uniformed Resource Identifier) du jeu de données auquel les métadonnées renvoient. Une adresse URL est indiquée ici, par exemple www.cosig.ch. - - - - - - Code qui identifie le genre de valeur fourni dans l'élément étendu - Code définissant le type de données de l'élément étendu. - Obligatoire - - - - - Jeu de données sur lequel l'information s'applique - Jeu de données auquel les informations se rapportent. - - - - - - Date de la prochaine mise à jour de la ressource - Date de la prochaine mise à jour (jj.mm.aaaa). - - - - - - Date de référence pour la ressource en question - Date de référence indiquée sous forme de date (jj.mm.aaaa) et de type de date (création, publication, traitement). Ces informations sont du type CI_Date et sont gérées dans la classe du même nom. - - - - - - Date de référence pour la ressource en question - Date de référence (jj.mm.aaaa) - - - - - - Date de la prochaine mise à jour de la ressource - Date de la prochaine mise à jour (jj.mm.aaaa). - - - - - - Date de création des métadonnées - Date de création des métadonnées. Elle est automatiquement attribuée par l'application. - Obligatoire - - - - - - Date et heure, ou période, à laquelle l'étape de processus s'est réalisée - Date à laquelle ou période au sein de laquelle le processus de traitement a été effectué. Indication en format horaire jj.mm.aaaa/ hh.mm.ss - - - - - - Date ou période pendant laquelle une mesure de qualité des données a été appliquée - Date à laquelle ou période durant laquelle la qualité des données a été déterminée. - - - - - - Evénements en relations avec la date - Evénement auquel la date se rapporte (création, publication, traitement), respectant le type de la date. - Obligatoire - - - - - Définition de l'élément étendu - - Obligatoire - - - - - Adresse de l'emplacement (comme décrit dans ISO 11180, Annexe A) - Nom de la rue - - - - - - Le dénominateur de l'échelle (le chiffre en dessous de la barre de fraction) - La valeur se trouvant sous la barre de fraction. Il s'agit ici de l'échelle : dans le cas d'une carte à l'échelle du 1:25000, seul le terme "25000" est entré. Cette valeur peut également représenter une indication de précision dans le cas d'un jeu de données vectorielles. Exemple : des limites saisies à une échelle de 1:25'000 et présentant ce niveau de précision. - Il faut saisir ou une échelle ou une distance - - - - - - - - - - - - - - - - - - Densité d'écriture sur le medium - Densité d'écriture sur le support concerné. - - - - - - Unité de mesure pour la densité d'enregistrement - Unité de mesure de la densité d'écriture. - - Condition - - - - Description de l'événement, incluant les paramètres ou tolérances y relatifs - Description du processus (étape de traitement) pouvant inclure la description de paramètres ou de tolérances. - Obligatoire - - - - - Description détaillée de l'état des données sources - Description des données source. - - - - Etendue spatiale et temporelle pour l'objet en question - Description sous forme textuelle de l'extension spatiale et temporelle de l'objet considéré. - - - - - Texte descriptif détaillé sur ce que la ressource en ligne est/fait - Description détaillée de ce que propose la source en ligne. - - - - - - Catégorie, type et source de référence des mots clés - - En Europe, si la ressource est une série de données géographiques ou un ensemble de séries de données géographiques, il - convient de fournir au moins un mot clé du thésaurus multilingue de l’environnement (GEMET, General Environ­mental Multi-lingual Thesaurus) - décrivant le thème dont relèvent les données géographiques, conformément aux - définitions des annexes I, II ou III de la directive 2007/2/CE. - - - Catégorie du mot clé, décrivant si ce dernier concerne la discipline, le lieu, la couche, l'intervalle de temps, ou le thème. Ces informations sont gérées dans la classe MD_Keywords. - - - - - - Description de l'étendue de la valeur mesurée sur une cellule - Description du domaine de valeurs mesurées dans une cellule. - - - - - - Informations sur les dimensions des cellules - Informations concernant les dimensions des valeurs mesurées dans les cellules. - - - - - - Nom de l'axe - - Obligatoire - - - - - Nombre d'éléments le long de cet axe - Nombre de cellules le long de cet axe - Obligatoire - - - - - Distance de référence, mesurée au sol - Résolution au sol - Saisir une distance si pas d'échelle - - - - - - - - - - - - - Description du format de distribution - Description du format de distribution. Ces informations sont gérées dans la classe MD_Format. - - - - - - Informations sur le distributeur et sur la façon d'acquérir les ressources - Informations relatives au distributeur et au mode d'acquisition de la ou des ressources. Indications concernant le lieu et la forme d'obtention des données. Ces informations sont gérées dans la classe MD_Distribution. - - - - - - Informations sur comment les données peuvent êtres commandées, ainsi que sur leur coûts et sur les formatlités de commandes - Informations relatives au mode de commande des données, à leur coût ainsi qu''à d'autres instructions de commande. Ces informations sont gérées dans la classe MD_StandardOrderProcess. - - - - - - Informations sur le distributeur et sur la façon d'acquérir les ressources - Informations relatives au distributeur. - - - - - - Services depuis lesquels la ressource peut être obtenue. Cette liste n''a pas besoin d'être exhaustive - Personne ou organisation compétente auprès de laquelle le jeu de données peut être obtenu. Une seule information est permise. La référence est du type de données CI_ResponsibleParty et est gérée dans la classe du même nom. - Obligatoire - - - - - Informations sur le format utilisé par le distributeur - Informations relatives au format utilisé par le distributeur (nom et version du format, par exemple TIFF, version 6.0). Ces informations sont gérées dans la classe MD_Format. - Condition - - - - - Informations concernant la technique et le média utilisés par le distributeur - Informations concernant le mode et le support de diffusion utilisés par le distributeur, par exemple la taille du fichier, la manière de l'obtenir, etc. Ces informations sont gérées dans la classe MD_DigitalTransferOptions. - - - - - - Trois codes digitaux attribués à l'élément étendu - Code à trois chiffres affecté à l'élément étendu. - - Condition - - - - Domaine de validité pour le système de référence - Domaine de validité du système de référence géographique. - - - - - - Valeurs valides qui peuvent être assignées à l'élément étendu - Valeurs licites pouvant être affectées à l'élément étendu. - - Condition - - - - Coordonnée la plus à l'est de la limite de l'étendue du jeu de données, exprimée en longitude avec des degrés décimaux (EST positif) - Limite est de l'extension du jeu de données, exprimée en longitude géographique (degrés décimaux) comptée positivement vers l'est. - Obligatoire - - - - - Version de la ressource en question - Version/édition de la source mentionnée - - - - - - Date de l'édition - Date de la version / de l'édition (jj.mm.aaaa). - - - - - - Adresse du courrier électronique de l'organisation ou de la personne individuelle responsable - Adresse de courrier électronique de l'organisation ou de la personne responsable - - - - - - Description de l'environnement de travail dans lequel le jeu de données a été créé, incluant des choses telles que logiciel, système d'exploitation, nom de fichier et taille du jeu de données - Description de l'environnement de travail dans lequel le jeu de données est créé, incluant des éléments tels que le logiciel utilisé, le système d'exploitation, le nom et la taille du fichier. - - - - - - Degré de détail exprimé avec l'échelle d'un graphique ou carte papier comparable - Degré de spécification exprimé au moyen de l'échelle d'une carte ou d'un graphique analogique comparable. - Cette échelle peut également indiquer la précision de la saisie dans le cas d'un jeu de données vectorielles. - Cette information est du type MD_RepresentativeFraction et est gérée dans la classe du même nom où de plus amples renseignements peuvent être obtenus. - - - Condition - - - - Méthode statistique utilisée pour déterminer la valeur - Méthode statistique utilisée pour la détermination de la valeur. - - - - - - Description des méthodes d'évaluation - Description de la méthode d'appréciation. - - - - - - Type de méthodes utilisées pour évaluer la qualité du jeu de donnée - Méthode utilisée pour apprécier la qualité du jeu de données. - - - - - - Référence à l'information sur la procédure - Renvoi à la description de la procédure. - - - - - - Explication de la signification de conformance pour ces résultats - Explication de la signification de la concordance pour ce résultat. - Obligatoire - - - - - Informations relatives à un nouvel élément de métadonnées requis pour la description des données géographiques, mais absent de la norme ISO19115. - - - - - - - Information sur les sources en ligne décrivant le profil d'un domaine d'application spécifique ainsi que les extensions du modèle. Information sur tous les nouveaux éléments de métadonnées. - Informations relatives à des sources en ligne contenant le profil de la communauté d'utilisateurs de même que des éléments de métadonnées étendus. Informations concernant tous les nouveaux éléments de métadonnées. - - - - - Information complémentaire sur les étendues spatiales et temporelles du jeu de données, incluant le polygone de délimitation et les dimensions verticales et temporelles - Informations supplémentaires concernant l'extension spatiale et temporelle des données, incluant le polygone de délimitation, les altitudes et la durée de validité. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. - Condition - - - - Information sur les domaines horizontaux, verticaux et temporels des données spécifiées par l'attribut scope (79) du domaine d'applicabilité - Informations relatives à l'extension horizontale, verticale et temporelle des données conformément au domaine de validité défini. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. - Condition - - - - - Date et temps pour le contenu du jeu de donnée - Date et heure du domaine de validité du jeu de données (texte). - Condition - - - - - Indication si le polygone de délimitation recouvre une surface recouverte par des données ou une surface ne comportant pas de données - Indication du fait de savoir si le polygone de délimitation définit une zone recouverte ou exempte de données du jeu de données. - - - - - - Numéro de fax de la personne ou organisation responsable - Numéro de télécopieur. - - - - - - Référence bibliographique complète à un ou plusieurs catalogues d'objets externes - Référence bibliographique complète vers un ou plusieurs catalogues d'objets externes. La référence est du type de données CI_Citation et est gérée dans la classe du même nom. - Obligatoire - - - - - Occurrences d'objets sur lesquels l'information s'applique - Occurrences de propriétés auxquelles les informations se rapportent. - - - - - Sous-ensemble de types d'objets, tirés du catalogue d'objets cité, intervenant dans le jeu de données - Sous-ensemble des types d'objets du catalogue cité, présents dans le jeu de données. - - - - - - Objets sur lesquels l'information s'applique - Propriétés auxquelles les informations se rapportent. - - - - - Taxes et conditions pour accéder à la ressource. Les unités monétaires sont incluses (comme spécifié dans ISO 4217) - Emoluments relatifs à l'obtention ou à l'utilisation des données. Indications fournies dans les unités monétaires définies dans la norme ISO 4217. - - - - - - Recommandations sur les algorithmes et les processus qui peuvent être appliqués pour lire ou ouvrir une ressource, à laquelle des techniques de compressions ont été appliquées. - Remarques relatives aux algorithmes ou aux processus à mettre en ?uvre pour la lecture ou l'extension de la ressource en cas de compression de cette dernière. - - - - - - Description textuelle de l'illustration du jeu de données - Description de la représentation figurative du jeu de données. Elle indique ce qui est présenté, le degré d'adaptation avec le jeu de données sélectionné, etc. - - - - - - Identifiant unique pour ce fichier de métadonnées - Identifiant unique pour ce fichier de métadonnées. Il correspond à un et un seul nom de fichier. - - - - - - Nom du fichier qui contient le graphique contenant une illustration du jeu de données - Nom du fichier contenant une représentation figurative du jeu de données. - - - - - - Format dans lequel l'illustration est enregistrée. Exemple : CGM, EPS, GIF, JPEG, PBM, PS, TIFF, XWD - Format dans lequel la représentation est enregistrée, ex : CGM, EPS, GIF, JPEG, PBM, PS, TIFF, XWD - - - - - - Indication si oui ou non le protocole de calibration est à disposition - Indication de la présence éventuelle de valeurs d'étalonnage d'un réseau. - - - - - - Informations sur le format de distribution - Informations relatives au distributeur, aux coûts et aux modalités de commande. Elles sont gérées dans la classe MD_Distributor. - - - - - - Code pour une fonction accomplie par la ressource on-line - Rôle de la source en ligne, sélection dans la liste suivante : téléchargement, information, accès hors ligne, commande ou recherche. - - - - - - Informations sur l'etendue géographique - Informations concernant l'extension géographique. Ces informations sont gérées dans la classe EX_GeographicExtent. - Condition - - - - Identifiant utilisé pour représenter une surface géographique - Identifiant servant à la définition sans équivoque d'une zone géographique. Le code d'identification (MD_Identifier.code) correspond par exemple au numéro communal à 4 chiffres de l'OFS s'il s'agit du territoire d'une commune. Ces informations sont du type MD_Identifier et sont gérées dans la classe du même nom. - Obligatoire - - - - - Nombre total d'objets de type point ou vecteur intervenant dans le jeu de données - Nombre de points ou d'objets vectoriels présents dans le fichier. - - - - - - Nom des objets spatiaux point et vecteur utilisés pour localiser les positions à zéro, une, deux et trois dimensions dans le jeu de données - Nom du type d'objet géométrique. Sélection dans la liste suivante : complexe, combinaison, ligne ouverte, point, primitive en 3D, ligne fermée. - - - - - - Information sur les objets géométriques utilisés dans le jeu de données - Informations concernant les objets géométriques utilisés dans le jeu de données. Ces informations sont du type MD_GeometricObjects et sont gérées dans la classe du même nom. - - - - - - Indication sur les données de géoréférencement du raster - Valeurs numériques contenant les données de géoréférencement de la trame. - - - - - - Vue générale graphique illustrant les ressources (y inclus une légende) - Vue d'ensemble graphique de la ressource (légende incluse). Ces informations sont gérées dans la classe MD_BrowseGraphic. - - - - - - Schéma d'application entièrement donné dans un graphique - Représentation graphique du schéma d'application complet. - - - - - - Information complémentaire sur les restrictions au sujet de la manipulation des ressources où de métadonnées - Description de la manière dont la restriction est à appliquer, des cas dans lesquels elle doit l'être et des exceptions recensées. - - - - - - Domaine auquel les métadonnées s'appliquent (voir l'annexe C pour plus d'information au sujet des niveaux de hiérarchie des métadonnées) - Domaine auquel les métadonnées se rapportent. La catégorie d'informations à laquelle l'entité se réfère peut être indiquée dans la liste des codes (exemple : attributs, objets géométriques, jeu de données, etc.). "Jeu de données" est le paramètre par défaut. - Par défaut: "jeu de données" - - - - Nom du niveau de hiérarchie pour lequel les métadonnées sont produites - Nom du niveau hiérarchique auquel les métadonnées se rapportent. Il peut par exemple s'agir du nom d'une série. - Condition - - - - Période de temps (incluant aussi le fuseau horaire) pendant laquelle la personne ou l'organisation responsable peut être contactée - Heures d'ouverture, indications fournies sous forme de texte libre, par exemple : "08h00 - 11h45h et 13h30 - 17h00" ou "De 08h00 à 11h45 et de 13h30 à 17h00" - - - - - - Informations de base sur les ressources concernées par les métadonnées - Informations de base concernant la ressource (voire les ressources) ou le jeu de données auquel se rapportent les métadonnées. Ces informations sont gérées dans la classe MD_IdentificationInformation. - - - - - - Identificateur de l'indication de provenance - Identificateur de l'indication de provenance. La classe MD_Identifier permet d'affecter une indication de provenance à un registre existant. - Condition - - - - - Angle d'azimut mesuré en degré dans le sens des aiguilles d'une montre entre le nord géographique et la ligne optique au moment de la prise de vue. Pour les images scannées, le pixel central prend le rôle de la ligne optique - Azimut d'éclairage mesuré en degrés sexagésimaux dans le sens horaire à compter du nord géographique au moment de la prise de vues. Pour les images scannées, la référence est le pixel central. - - - - - - Angle d'élévation mesuré en degré dans le sens des aiguilles d'une montre entre a. l'intersection de la ligne optique et le plan cible et b. la surface terrestre. Pour les images scannées, le pixel central prend le rôle de la ligne optique - Angle vertical d'éclairage mesuré en degrés sexagésimaux dans le sens horaire à compter du plan cible à l'intersection de la ligne de visée optique avec la surface terrestre. Pour les images scannées, la référence est le pixel central. - - - - - - Connaissances qui spécifient la qualité de l'image - Identification spécifiant la qualité de l'image - - - - - - Conditions affectant l'image - Contraintes auxquelles l'image est soumise. - - - - - - Indications si oui ou non le catalogue d'objets est inclus dans le jeu de données - Indication de la présence ou de l'absence du catalogue d'objets dans le jeu de données. - - - - - - Nom de la personne responsable. Prénom, nom et titre sont séparés par un signe de délimitation - Nom de la personne responsable. Des séparateurs (virgules) figurent entre le prénom, le nom et le titre. - Condition - - - - Type d'initiative pour laquelle le jeu de données rassemblé a été produit - Type de l'initiative ou du projet ayant motivé la saisie des données de rang inférieur (exemple : campagne, collecte, analyse, mission, étude, etc.) - - - - - - Information identifiant l'édition des séries - Informations concernant l'édition ou le numéro d'édition de la série. - - - - - - Mots, notions ou phrases courants utilisés pour décrire le sujet - Mots clés du jeu de données par l'intermédiaire desquels il peut être caractérisé et défini. Ces termes sont également utilisés en tant qu''arguments de recherche. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. - - - - - - Langue utilisée pour documenter les métadonnées - Langue utilisée pour la documentation des métadonnées. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... - Obligatoire - - - - Langue utilisée pour le jeu de données - Langue utilisée pour la documentation des données. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... - Obligatoire - - - - - Langues utilisées dans le catalogue - Langue utilisée dans le catalogue d'objets. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... - - - - - - Indication si oui ou non des informations sur la corrections de fautes dues aux lentilles sont à disposition - Indication de la présence éventuelle de valeurs de correction de la distorsion de l'objectif ayant servi à la prise de vue. - - - - - - Niveau hiérarchique des données spécifiées par l'attribut scope (79) du domaine d'applicabilité - Domaine auquel s'appliquent les informations de qualité. La catégorie à laquelle se rapporte cette information peut être indiquée dans la liste de codes (exemple : attributs, objets géométriques, jeu de données, etc.). - Obligatoire - - - - - Description détaillée sur le niveau des données spécifiées par l'attribut scope (79) du domaine d'applicabilité - Description détaillée du domaine des données. Ces données sont gérées dans la classe MD_ScopeDescription. - Obligatoire si niveau hiérarchique autre que "jeu de données" - - - - Informations de qualité concernant la provenance des données - Informations relatives à la provenance, à la filiation ou au processus de génération. Elles sont gérées dans la classe LI_Lineage. "+lineage" est obligatoire si "scope.DQ_Scope.level" = "Jeu de données". - Condition - - - - URL ou indication semblable d'une adresse Internet pour un accès on-line , par exemple http://www.isotc211.org - Lien Internet, par exemple www.cosig.ch. - - - - - - Fréquence avec laquelle des changements et des ajouts sont fait à la ressource après que la ressource initiale ait été complétée - Fréquence à laquelle des changements et des ajouts sont apportés à la ressource. La valeur concernée est à sélectionner dans la liste suivante : en permanence, quotidienne, hebdomadaire, bimensuelle, mensuelle, trimestrielle, semestrielle, annuelle, au besoin, irrégulière, non prévue, inconnue, définie par l'utilisateur. - Obligatoire - - - - - Informations ou remarques en ce qui concerne les besoins spécifiques concernant la maintenance des ressources - Informations ou remarques concernant la prise en compte de besoins spécifiques lors de la mise à jour des ressources. - - - - - - Longueur d'onde la plus longue que le senseur est capable de collecter à l'intérieur d'une bande donnée - Longueur d'onde la plus élevée à laquelle le capteur est capable d'effectuer une mesure au sein de la gamme mentionnée. - - - - - - Indication de l'altitude du point le plus haut du jeu de données - Altitude du point le plus élevé du jeu de données - Obligatoire - - - - - Description des tests - Description de la mesure (test). - - - - - - Code identifiant une procédure standard enregistrée - Identification d'une procédure normalisée enregistrée - - - - - - Méthode utilisée pour écrire dans le média - Format d'écriture utilisé pour le support considéré. La sélection peut s'effectuer parmi les formats suivants : cpio, tar, highSierra, iso9660, iso9660Rockridge, iso9660AppleHFS. - - - - - - Description d'autres restrictions ou exigences pour l'utilisation du média - Descriptions complémentaires ou informations importantes concernant le support telles que des restrictions, des exigences, etc. - - - - - - Contraintes sur l'accès et l'utilisation des métadonnées - Restrictions d'accès et d'utilisation des métadonnées (exemple : copyright, conditions d'octroi de licence, etc.). Ces informations sont gérées dans la classe MD_Constraints. - - - - - - Contraintes sur l’accès et l’utilisation des métadonnées - - - - - - - Informations décrivant l'extension des métadonnées - Informations décrivant des extensions de métadonnées - - - - - - Informations sur la fréquence de mise à jour des métadonnées, ainsi que de leur étendue - Informations concernant la fréquence, l'étendue, la date et la validité des mises à jour. Ces informations sont gérées dans la classe MD_MaintenanceInformation. - - - - - - Nom du standard (incluant le nom du profil) de métadonnées utilisé - Nom de la norme sur les métadonnées utilisée, profil inclus (exemple : GM03Core, GM03Profil). - - - - - - Version (du profil) du standard de métadonnées utilisé. - Version (du profil) de la norme sur les métadonnées utilisée. - - - - - - Longueur d'onde la plus courte que le senseur est capable de collecter à l'intérieur d'une bande donnée - Longueur d'onde la plus courte à laquelle le capteur est capable d'effectuer une mesure au sein de la gamme mentionnée. - - - - - - Indication de l'altitude du point le plus bas du jeu de données - Altitude du point le plus bas du jeu de données. - - - - - - - Nom du média sur lequel les données pouvent être obtenues - Type de support sur lequel les données peuvent être obtenues, par exemple CD-ROM, DVD, DVD-ROM, disquette, etc. (sélection dans une liste). - Obligatoire - - - - - Nom du système de référence utilisé - Nom du système de référence utilisé. - Obligatoire - - - - - Nom des formats de transfert des données - Nom du format de transfert de données, par exemple TIFF, ZIP, etc. - Obligatoire - - - - - Nom de l'élément de métadonnée étendu - Nom de l'élément de métadonnées étendu. - Obligatoire - - - - - Nom du schéma d'application utilisé - Nom du schéma d'application utilisé. - Obligatoire - - - - - Nom de la ressource en ligne - Nom de la source en ligne. - Obligatoire - - - - - Nom des séries ou du jeu de données global desquels le jeu de donnée est une partie - Nom de la série ou du jeu de données composé dont émane le jeu de données. - Obligatoire - - - - - Name of the series, or aggregate dataset, of which the dataset is a part - - Obligatoire - - - - - Nom des tests qui ont été appliqués aux données - Nom du test appliqué aux données. - - - - - - Coordonnée la plus au nord de la limite de l'étendue du jeu de données, exprimée en latitude avec des degrés décimaux (NORD positif) - Limite nord de l'extension du jeu de données, exprimée en latitude géographique (degrés décimaux) comptée positivement vers le nord. - - - - - - Nombre d'axes spatio-temporels indépendants (nombre de dimensions) - - - - - - - Obligation de l'élément étendu - Niveau d'obligation associé à l'élément étendu (obligatoire, optionnel ou obligatoire sous certaines conditions). - - Condition - - - - Information sur les médias off-line depuis lesquels la ressource peut être obtenue - Informations concernant le support hors ligne sur lequel le jeu de données peut être obtenu. Ces informations sont gérées dans la classe MD_Medium. - - - - - - Valeur physique correspondant à la valeur zéro d'une cellule - Valeur physique correspondant à la valeur zéro d'une cellule. - - - - - - Information sur les sources en ligne depuis lesquelles la ressource peut être obtenue - Informations relatives à la source en ligne via laquelle le jeu de données peut être acquis. Ces informations sont du type CI_OnlineRessource et sont gérées dans la classe du même nom. - - - - - - Information on-line qui peut être utilisée pour contacter la personne ou l'organisation responsable - Information en ligne, par exemple l'adresse Internet de l'organisation. - - - - - - Instructions générales, conditions et services offerts par le distributeur - Instructions générales, délais et services offerts par le distributeur - - - - - - Nom de l'organisation responsable - Nom de l'organisation responsable, s'il s'agit d'une personne isolée ou nom de l'organisation au sein de laquelle cette personne est employée. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. - Condition - - - - Indication si oui ou non des paramètres d'orientation sont disponibles - Indication de l'existence ou de l'absence de paramètres d'orientation pour le géoréférencement. - - - - - - Description des paramètres utilisés pour décrire l'orientation des senseurs - Description des paramètres utilisés pour l'orientation du capteur. - - - - - - Type d'information qui ne se laisse classer dans aucune des autres possibilités de choix - Description des informations ne se laissant classer dans aucune des autres possibilités de choix. - - - - - Autre information utilisée pour compléter les informations de référence qui ne sont pas prévues ailleurs - Autre information requise pour une description complète de la source, non saisie ou impossible à saisir dans un autre attribut. - - - - - - Autres restrictions et prérequis légaux pour accéder et utiliser les ressources où de métadonnées - Autres restrictions et conditions préalables de nature juridique concernant l'accès et l'utilisation de la ressource ou des métadonnées. Ce champ doit être complété dès lors que l'un des deux champs précédents (accessConstraints, useConstraints) porte la mention "Autres restrictions". - Condition - - - - Détails sur quelles pages de la publication l'article a été publié - Indication détaillée des numéros de pages de l'article dans la publication concernée ou du jeu de données dans la série considérée. - - - - - - Référence bibliographique sur les paramètres - Titre et date (citation) avec la description des paramètres - - - - Nom des entités de métadonnées sous lesquelles l'élément étendu de métadonnée pourrait apparaître. Les noms devraient être des éléments de métadonnées standards ou d'autres éléments de métadonnées étendus - Nom de la ou des classes de métadonnées dans lesquelles apparaît cet élément de métadonnées étendu. Le nom peut être celui d'une classe standard ou d'une classe étendue. - Obligatoire - - - - - Identifiant du fichier de métadonnées parent. - Nom unique du fichier de métadonnées parent ou origine. Il peut s'agir d'un modèle prédéfini ou de données de rang supérieur (dans le cas par exemple d'une carte nationale au 1:25''000, le parent peut être la série de toutes les cartes au 1:25''000). - Condition - - - - Indication sur le résultat de conformance où 0 = échoué et 1= réussi - Indication du résultat du test de concordance (0 = échec, 1= succès). - Obligatoire - - - - - Longueur d'onde à laquelle la réponse est la plus haute - Longueur d'onde à laquelle l'intensité de la réponse est la plus forte. - - - - - - Numéro de téléphone avec lequel la personne ou l'organisation responsable peut être contactée - Numéro de téléphone. Ces informations sont du type CI_Telephone et sont gérées dans la classe du même nom. - - - - - - Type de données pour le numéro de téléphone de la personne ou du service responsable - Type de données pour les numéros de téléphone. - - - - - - Date et heure à laquelle les donnée seront à disposition - Date et heure à laquelle les données seront disponibles. - - - - - - Point d'un pixel correspondant à la location terrestre du pixel - Point d'un pixel correspondant à la localisation du pixel dans le système terrestre. - Obligatoire - - - - - Identification, et mode de communication avec, des personnes ou des organisations associées aux ressources - Identification de la personne (voire des personnes) ou de l'organisation (voire des organisations) responsable du jeu de données décrit et mode de communication avec elle. Cette personne ou ce service endosse un rôle (propriétaire, prestataire, gestionnaire, etc.) bien spécifique pouvant être sélectionné dans la liste proposée. Les données correspondantes de la personne ou du service sont gérées dans la classe CI_ResponsibleParty. Ce rôle peut également servir à l'affectation d'un jeu de données à une commune. Exemple : le rôle de "propriétaire" permet ici d'affecter un lot de la MO à la commune correspondante. - - - - - - Liste de points définissant le polygone de délimitation - Série de points définissant le polygone de délimitation. Les positions sont exprimées en latitude et longitude géographique. Il s'agit d'un objet géométrique. - Obligatoire - - - - - Référence bibliographique du catalogue de présentation utilisé - Référence bibliographique au catalogue de représentation cité - Obligatoire - - - - - Informations sur le catalogue de règles concernant la représentation des ressources - Informations concernant le catalogue de règles établi pour la représentation de ressources. - - - - - - Rôle ou position de la personne responsable - Fonction ou position de la personne responsable. - Condition - - - - Code postale ou autre code pour l'emplacement - Code postal - - - - - - Mode dans lequel la ressource est représentée - Forme sous laquelle la source est disponible. Exemple : document numérique ou analogique, image, carte, modèle, etc. (sélection dans une liste). - - - - - - Informations sur des événements dans la vie du jeu de données - Informations concernant les étapes de traitement requises par la génération et l'actualisation d'un jeu de données avec indication des dates correspondantes. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici. Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies dans la classe LI_ProcessStep (texte, date, source et personne en charge du traitement). - Condition - - - - Code du distributeur d'image qui identifie les niveaux de processus radiométrique et géométrique appliqués - Identification du distributeur de l'image indiquant le niveau de traitement radiométrique et géométrique appliqué. - - - - - - Identification des personnes et organisations associées avec l'étape de processus, ainsi que des moyens de communications à utiliser pour entrer en contact avec elles - Identification de la personne (voire des personnes) ou de l'organisation (voire des organisations) en charge du jeu de données décrit et mode de communication avec elle(s). Cette personne ou ce service endosse un rôle bien spécifique (propriétaire, prestataire, gestionnaire, etc.) pouvant être sélectionné dans la liste proposée ici. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. - - - - - - Protocole de la connexion à utiliser - Protocole de connexion utilisé, par exemple FTP. - - - - - - Résumé des intentions pour lesquelles les ressources ont été développées - Motif(s) de la création de ce jeu de données. - - - - - - Indication si oui ou non l'information sur la calibration radiométrique pour générer le produit standard corrigé radiométriquement est à disposition - Indication de la présence éventuelle d'informations relatives à l'étalonnage radiométrique utilisé pour générer le produit standard corrigé au plan radiométrique. - - - - - - Exigences ou buts pour une étape de processus - Motif de l'étape de traitement ou but poursuivi. - - - - - - Raison de la création de l'élément étendu - Motif de l'extension de la norme par l'élément considéré. - - - - - - Nom du système de référence spatiale, par lequel sont définis la projection, l'ellipsoïde et le datum géodésique utilisés - Nom du système de référence spatial englobant la définition de la projection, de l'ellipsoïde et du datum géodésique utilisés. Ces informations sont du type RS_Identifier et sont gérées dans la classe du même nom. - Condition - - - - - Description des références spatiale et temporelle utilisées dans le jeu de données - Description des systèmes de référence spatiale et temporelle utilisés dans le jeu de données. Ces informations sont gérées dans la classe MD_ReferenceSystem. - - - - - - Information de qualité quantitative pour les données concernée par le domaine - Information de qualité de nature quantitative portant sur les données. - Condition - - - - Degré de détail dans le jeu de données de type raster - Degré de spécification de la trame, c.-à-d. description d'une extension, d'une dimension ou d'un nombre de cellules. - - - - - - Informations sur les contraites concernant les ressources - Informations relatives aux restrictions s'appliquant aux ressources. Ces informations sont gérées dans la classe MD_Constraints. - - - - - - Description du format de la ressource - Description du format de la ressource. Le nom et la version du format sont entrés ici. Ces informations sont gérées dans la classe MD_Format. - - - - - - Informations sur la fréquence de mise à jour des ressources, ainsi que de leur étendue - Informations concernant l'étendue et la date de mise à jour de la ressource. Si la mise à jour ne concerne pas la totalité du jeu de données, les options "updateScope" et "updateScopeDescription" permettent la description de la mise à jour individualisée de chacune des parties du jeu. Exemple : les biens-fonds de la MO sont actualisés annuellement, les nomenclatures ne l'étant qu''au besoin. Ces informations sont gérées dans la classe MD_MaintenanceInformation. - - - - - - Informations sur des applications spécifiques pour lesquelles la ressource est ou sera utilisée - Informations concernant des applications particulières pour lesquelles la ou les ressources sont ou ont été utilisées. Ces informations sont gérées dans la classe MD_Usage. - - - - - - Valeur (ou jeu de valeur) obtenue en appliquant une mesure de qualité de donnée ou par le résultat d'une comparaison des valeurs (ou jeu de valeurs) obtenues avec un niveau de qualité spécifique - Valeur (ou ensemble de valeurs) déduite de la mesure de qualité utilisée ou résultats provenant de la comparaison de ces valeurs avec un indicateur de qualité spécifié. - Obligatoire - - - - - Fonction accomplie par le service responsable - Rôle endossé par le service responsable (prestataire, gestionnaire, propriétaire, utilisateur, distributeur, créateur de données, instance compétente, évaluateur de données, responsable de leur traitement ou de leur publication, auteur, éditeur ou partenaire commercial). - Obligatoire - - - - - Spécifications comment l'élément étendu est en relation avec d'autres éléments et entités existants - Spécification de la manière dont l'élément étendu est en relation avec d'autres classes et éléments existants. - Obligatoire - - - - - Dénominateur de l'échelle de la carte source - Facteur d'échelle (dénominateur) de la carte source. Ces informations sont du type MD_RepresentativeFraction et sont gérées dans la classe du même nom. - - - - - - Facteur d'échelle appliqué à la valeur de la cellule - Facteur d'échelle appliqué à la valeur de la cellule. - - - - - - Schéma d'application entièrement donné dans un fichier ASCII - Schéma d'application dans un fichier ASCII. - - - - - - Identification de la langue de schéma utilisée - Identification de la langue utilisée pour le schéma d'application. - Obligatoire - - - - - Les données spécifiques auxquelles sont appliquées les informations de qualité des données - Indications relatives au domaine (exemple : attribut, jeu de données, série, projet, etc.) auquel se rapportent les informations concernant la qualité des données. Ces informations sont du type DQ_Scope et sont gérées dans la classe du même nom. - - - - - - Nombre qui identifie de façon unique le nombre de bandes de longueurs d'ondes sur lesquelles un senseur travaille - Entier identifiant sans équivoque le nombre de gammes de longueurs d'onde utilisées par un capteur. - - - - - - Information sur la série (ou sur le jeu de données global) de laquelle le jeu de données est une partie - Information relative à la série ou au jeu de données composé dont le jeu de données est issu. - Exemple : la série de toutes les cartes nationales au 1:25'000. - Ces informations sont du type CI_Series et sont gérées dans la classe du même nom. - - - - - - Nom court utilisé lors d'une implémentation telle que par exemple XML, SGML ou autres - Forme abrégée du nom utilisée lors d'une implémentation dans XML ou SGML. Remarque : d'autres méthodes d'implémentation peuvent être employées. - Condition - - - - Schéma d'application entièrement donné dans un fichier de développement software - Schéma d'application complet sous forme de fichier de développement logiciel. - - - - - - Format, dépendant du software, utilisé pour le fichier (dépendant du software) du schéma d'application - Format lié à un logiciel et utilisé pour la description du schéma d'application dans un fichier de développement logiciel. - - - - - - Informations sur la source de la donnée - Informations relatives aux données source. Elles sont gérées dans la classe LI_Source. - Condition - - - - Nom de la personne ou de l'organisation ayant créé les extensions - Nom de la personne ou de l'organisation ayant procédé à l'extension de la norme. - Obligatoire - - - - - Référence recommandée pour les données sources - Indication des sources du jeu de données source décrit. Le nom / titre du fichier de données source de même qu''une date du type correspondant (création, publication, traitement complémentaire) sont gérés ici. Des informations supplémentaires peuvent être indiquées au besoin. Elles sont du type CI_Citation et sont gérées dans la classe du même nom. - - - - - - Information sur les étendues spatiales, verticales et temporelles des données sources - Informations concernant l'extension spatiale, verticale et temporelle des données source. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. - Condition - - - - Système de référence spatiale utilisé par les données sources - Indications relatives au système de référence. Elles sont gérées dans la classe MD_ReferenceSystem. - - - - - - Informations sur une étape du processus de création des données - Informations relatives aux étapes de traitement requises par la génération et l'actualisation des données source, avec indication des dates correspondantes. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici (les données source sont décrites). Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies dans la classe LI_ProcessStep (texte, date, source, personne responsable du traitement). - - - - - - Coordonnée la plus au sud de la limite de l'étendue du jeu de données, exprimée en latitude avec des degrés décimaux (NORD positif) - Limite sud de l'extension du jeu de données, exprimée en latitude géographique (degrés décimaux) comptée positivement vers le nord. - Obligatoire - - - - - Information sur l'étendue spatiale de la composition spatio-temporelle de l'étendue - Informations relatives à l'extension spatiale de la classe composée EX_SpatialTemporalExtent. Ces informations sont gérées dans la classe EX_Extent. - - - - - - Représentation digitale de l'information spatiale dans le jeu de données - Informations sur la manière dont les représentations spatiales sont définies. Une distinction est étable entre les données vectorielles et les données tramées. Dans le cas de données vectorielles, les indications concernent le type géométrique, la topologie, etc., tandis qu''elles se rapportent au nombre de pixels, à l'ordre de succession des axes, aux paramètres de géoréférencement, etc. dans le cas de données tramées. Ces informations sont gérées dans la classe MD_SpatialRepresentation. - - - - - - Méthode utilisée pour représenter spatialement l'information géographique - Méthode utilisée pour la représentation spatiale des informations géographiques par des vecteurs, un quadrillage, des cartes, des tableaux, ou d'autres moyens similaires. - - - - - - Facteur qui donne une indication générale sur la densité de données spatiales dans le jeu de données - Facteur donnant une indication générale de la résolution spatiale du jeu de données. Il est indiqué sous forme d'échelle ou d'élément de comparaison au sol. Ces informations sont gérées dans la classe MD_Resolution. - La résolution spatiale se rapporte au niveau de détail de la série de données. Elle est exprimée comme un ensemble - de valeurs de distance de résolution allant de zéro à plusieurs valeurs (normalement utilisé pour des données - maillées et des produits dérivés d’imagerie) ou exprimée en échelles équivalentes (habituellement utilisées pour les - cartes ou les produits dérivés de cartes). - - - - - - - Brève description de l'utilisation actuelle de la ressource et/ou de la série de ressource - Brève description de l'utilisation de la ressource et/ou de la série de ressources sous forme de texte. - Obligatoire - - - - - Informations de référence des spécifications de produits ou des exigences des utilisateurs avec lesquelles les données sont comparées - Description des spécifications du produit ou des exigences de l'utilisateur avec lesquelles les données ont été comparées. - Obligatoire - - - - - Nom d'une spécification de sous-ensemble, profil ou produit du format - Nom d'une spécification partielle, de profil ou de produit du format. - Obligatoire - - - - - - Explication générale sur les connaissances du producteur de données au sujet de la filiation du jeu de données - Explication générale de la filiation du jeu de données fournie par le créateur des données. Dans le cas de données de la MO, il peut s'agir de l'indication des bases (MO93/MD93). Pour des données tramées, il peut s'agir de l'indication du fait qu''elles dérivent de prises de vues aériennes. - Condition - - - - Etat (de travail) des ressources - Etat de traitement du jeu de données. Sélection de l'une des options suivantes : complet, archive historique, obsolète, en cours, en projet, nécessaire, à l'étude. - - - - - - Toute autre information descriptive sur le jeu de données - Informations descriptives supplémentaires relatives au jeu de données présentant un intérêt général ou plus spécifiquement lié à l'utilisation, au traitement, etc. du jeu de données. - - - - - - Informations sur l'étendue temporelle - - L’étendue temporelle définit la période de temps couverte par le contenu de la ressource. Cette période peut être - exprimée de l’une des manières suivantes : une date déterminée, - un intervalle de dates exprimé par la date de début et la date de fin de l’intervalle, - un mélange de dates et d’intervalles. - - - Informations relatives à l'extension temporelle. Elles sont gérées dans la classe EX_TemporalExtent. - Condition - - - - Informations sur les éléments nécessaire pour utiliser le multilinguisme - Informations relatives à la définition de l'élément de texte en différentes langues (langue, contenu, etc.). Ces informations sont du type PT_Group et sont gérées dans la classe du même nom. - - - - - - Nom du thésaurus formellement enregistré ou d'une source d'autorité reconnue de mots clés - Nom d'un thésaurus enregistré sous forme d'une banque de données ou d'une source de mots clés similaire faisant autorité. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. - - - - - - Nom avec lequel la ressource en question est connue - - - Nom caractéristique et souvent unique sous lequel la ressource est connue. - - Titre/nom. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. - Obligatoire - - - - - - Nombre de valeurs numériques discrètes dans les données raster - Nombre de valeurs numériques discrètes dans les données tramées. - - - - - - Thème(s) principal(aux) du jeu de données - Thème principal (ou thèmes principaux) du jeu de données. - Ce thème ou groupe de thèmes permet de trouver un jeu de données. - Cet attribut se fondant sur une liste de codes de la norme ISO (MD_TopicCategoryCode), une recherche standardisée - par thèmes est possible au plan international. - Les thèmes suivants sont répertoriés : agriculture, biologie, limites, climatologie et météorologie, économie, indications altimétriques, environnement, sciences de la Terre, santé, images et cartes de base, armée et renseignement, cours d'eau intérieurs, indications de lieux, mers et océans, aménagement du territoire et cadastre, société, subdivisions, transport, infrastructures de transport. - - Obligatoire si "jeu de données" - - - - Code de la catégorie du sujet - - - - - - - Code qui identifie le degré de complexité des relations spatiales - Code indiquant les caractéristiques topologiques présentes dans le jeu de données telles que la géométrie sans topologie, les lignes, les lignes planes fermées, les surfaces, les corps, les surfaces tridimensionnelles, etc. - - - - - - Informations sur la façon de se procurer les données chez le distributeur - Informations relatives au mode d'obtention des données auprès du distributeur. Ces informations sont gérées dans la classe MD_DigitalTransferOptions. - - - - - - Taille estimée d'une unité dans le format de transfert spécifié, exprimé en mégabits. La taille de transfert est > 0.0 - Taille approchée d'un fichier (exprimée en mégaoctets) dans le format spécifié. La taille de transfert est > 0.0 - - - - - - Description général de la transformation - Description générale de la transformation. - - - - - - Information sur l'étendue géographique définie par l'étendue du raster - Règle de représentation spatiale de la trame. - - - - - - Indication si oui ou non des paramètres de transformation existent - Indication de l'existence ou de l'absence de paramètres de transformation pour un géoréférencement de la trame. - - - - - - Indication si oui ou non la triangulation a été effectuée sur l'image - Indication de l'éventuelle exécution d'une triangulation sur l'image. - - - - - - Temps d'attente usuel pour la préparation d'une commande - Temps de traitement usuel d'une commande. - - - - - - Thèmes utilisés pour grouper des mots clés similaires - Thème utilisé pour grouper des mots clés similaires. Les thèmes suivants sont disponibles : discipline, lieu, couche, intervalle de temps, thème. - - - - - - - Unité dans laquelle les longueurs d'ondes du senseur sont indiquées - Unité dans laquelle la longueur d'onde du capteur est exprimée. - Condition - - - - Parties, niveaux, surfaces géographiques, etc., dans lesquelles les données sont à disposition - Découpage en carroyages, couches, zones géographiques, etc. permettant l'obtention des données. - - - - - - Domaine d'applicabilité des données sur lequel une mise à jour est appliquée - Domaine des données concerné par la mise à jour. La catégorie à laquelle l'information se rapporte peut être indiquée dans la liste de codes (exemple : attributs, objets géométriques, jeu de données, etc.). - - - - - - Information supplémentaire sur le domaine ou l'étendue de la mise à jour - Informations supplémentaires relatives au domaine ou à l'étendue de la mise à jour. Ces données supplémentaires sont gérées dans la classe MD_ScopeDescription. La couche de la MO concernée par la mise à jour est par exemple précisée ici. - - - - - - Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressource - Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressources. - - - - - - Contraintes appliquées pour assurer la protection des sphères privées et intellectuelles, et autres restrictions spéciales ou limitations ou mises en garde pour utiliser les ressources où de métadonnées - Restrictions d'utilisation à fondement juridique destinées à garantir la sphère privée, la propriété intellectuelle ou d'autres domaines similaires tels que les conditions d'octroi de licence. Elles peuvent être sélectionnées parmi les éléments suivants : droit d'auteur, brevet, brevet en voie de délivrance, marque, licence, propriété intellectuelle, diffusion limitée, autres restrictions. - - - - - - Limitation d'utilisation de la ressource où de métadonnées. Exemple: "ne pas utiliser pour la navigation" - Restriction d'utilisation de la ressource ou des métadonnées. Exemple: "ne pas utiliser pour la navigation" - - - - - - Identification des personnes et organisations, et des modes de communication avec celles-ci, utilisant les ressources - Identification de la personne (ou des personnes) et de l'organisation (ou des organisations) utilisant la ou les ressources et mode de communication avec elle(s). Cette personne ou ce service endosse un rôle bien spécifique (propriétaire, prestataire, gestionnaire, etc.) pouvant être sélectionné dans la liste présentée. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. - - - - - - Rythmes de mise à jour autres que ceux définis - Rythme de mise à jour défini par l'utilisateur, si l'option "Définie par l'utilisateur" a été sélectionnée dans la liste de la "Fréquence d'entretien et de mise à jour". - - - - - - Applications déterminées par l'utilisateur pour lesquelles les ressources et/ou série de ressource ne sont pas adéquates - Applications indiquées par l'utilisateur pour lesquelles la ressource et/ou la série de ressources est inadéquate. - - - - - - Explications sur l'application des contraintes légales, ou d'autres restrictions et conditions préalables légales, pour obtenir et utiliser les ressources où de métadonnées - Explication plus détaillée de la restriction. - - - - - - Valeurs quantitatives, déterminées par la procédure d'évaluation utilisée. - Valeurs quantitatives définies par le processus d'exploitation. - - - - - - - - - - - - - Valeur quantitative, ou domaine de valeur, pour l'appréciation de qualité - Valeur (ou domaine de valeurs) quantitative pour l'appréciation de la qualité. - - - - - - Unité de valeur pour la documentation des résultats de qualité sur les données - Unité de valeur pour la documentation du résultat de la qualité des données. - - - - - - Identification de la version pour la domaine de valeurs - Numéro de version de l'espace nominal / de l'identifiant (alphanumérique). - - - - - - Version du format (date,nombre,etc) - Version du format de données, par exemple 6.0. - Obligatoire - - - - - Informations sur l'étendue verticale - Informations concernant l'extension verticale. Elles sont gérées dans la classe EX_VerticalExtent. - Condition - - - - Numéro de téléphone de la personne ou organisation responsable - Numéro de téléphone. - - - - - - Nombre de sujets identifiés dans le média - Nombre d'exemplaires de supports. Exemple : s'il s'agit de CD-ROM et si un disque est insuffisant pour le stockage, le nombre total de disques requis pour l'enregistrement du jeu de données complet est à indiquer ici. - - - - - - Coordonnée la plus à l'ouest de la limite de l'étendue du jeu de données, exprimée en longitude avec des degrés décimaux (EST positif) - Limite ouest de l'extension du jeu de données, exprimée en longitude géographique (degrés décimaux) comptée positivement vers l'est. - Obligatoire - - - - - - description - - - - - - - Instant - - - - Date ponctuelle - - - - - Période de temps (début/fin) - - - - - Noeud - - - - - Ecart de temps - - - - - Elément complexe - - - - - Bord précédent - - - - - Bord suivant - - - - - Début - - - - - Fin - - - - - Début - - - - - Durée - - - - - Intervalle de temps - - - - - Extension - - - - - Position - - - - - Date de début de validité (AAAA-MM-JJTHH:mm:ss) - - - - - Date de fin de validité (AAAA-MM-JJTHH:mm:ss) - - - - - Définit la relation entre un temps donné et l’objet - - - - - Coordonnées - - - - - Polygone - - - - - Point - 74. -37. - - - - - Ligne - - - - - Cercle - - - - - Limite extérieure - - - - - Limite intérieure - - - - - - - - - Identification de l'ellipsoïde utilisée - Identification de l'ellipsoïde utilisé. - - - - - - - - - - - - - Identification du service (ISO 19119) - - - - - Classification qui permet de rechercher les services de données géographiques disponibles. Un service donné ne - peut être classé que dans une seule catégorie. - - - - - - - - - - - - - - - - - - - - - - Version du type de service - - - - Information sur la disponibilité du service (prix, instructions de commande...) - - - - Contraintes légales et de sécurité sur l’accès au service et sur la distribution de la donnée via le service - - - - Information sur les opérations - - - - Information sur la ou les données associées au service - - - - Nom de l’opération - - - - Information sur les opérations - - - - Plateforme de communication (DCP) sur laquelle l’opération a été implémentée - - - - - - - Description de l’opération sous forme de texte libre - - - - Nom de l’appel - - - - Paramètres requis par l’interface - - - - - - - Point de connection pour accéder à l’interface - - - - List of operations that must be completed immediately before current operation is invoked, structured as a list for capturing alternate predecessor paths and sets for capturing parallel predecessor paths - - - - Nom du fournisseur du service - - - - Informations permettant contacter le fournisseur du service - - - - Nom utilisé par le service pour le paramètre - - - - Description du rôle du paramètre - - - - Indication sur l’optionalité du paramètre - - - - Indication sur la répétabilité du paramètre - - - - - Si la ressource est un service de données géographiques, cet élément de métadonnées identifie, le cas échéant, la - série ou les séries de données géographiques cibles du service grâce à leurs identificateurs de ressource uniques - (Unique Resource Identifiers, URI). - - - - - Information sur la ressource couplée - - - - Identifiant de la resource sur laquelle l’opération porte - - - - Type de couplage - - - - Extension géographique/temporelle du service - - - - Mots-clés décrivant le service - - - - Utiliser cette section pour définir la liste des langues utilisées dans cette métadonnée. - - - - - - Describes - - - - - - - PropertyType - - - - - - - Langue - - - - - - - PT_LocaleContainer - - - - - - - FeatureType - - - - - - - Provides information about the list of feature types with the same spatial representation - - - - - - - FeatureAttribute - - - - - - - DS_Association - - - - - - - DS_DataSet - - - - - - - DS_Initiative - - - - - - - DS_OtherAggregate - - - - - - - DS_Platform - - - - - - - DS_ProductionSeries - - - - - - - DS_Sensor - - - - - - - DS_Series - - - - - - - DS_StereoMate - - - - - - - LanguageCode - - - - - - - CharacterEncoding - - - - - - - - - - - - - - Unité de mesure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Has - - - - - - - - - - - - - - - - - - - - - Nombre maximum d’occurrences du nouvel élément de métadonnée - - - - - - - - - - - - - - ComposedOf - - - - - - - PartOf - - - - - - - SeriesMetadata - - - - - - - Subset - - - - - - - Superset - - - - - - - - - - - - - - - Le type durée permet de définir un interval de temps. - - Le format est le suivant "PnYnMnDTnHnMnS" : - - * P Période (Obligatoire) - * nY : nombre d'années - * nM : nombre de mois - * nD : nombre de jours - * T début de la section temps (Obligatoire, si définition d'un des éléments suivants) - * nH : nombre d'heures - * nM : nombre de minutes - * nS : nombre de secondes - - - - - - - - - - - - - - - - - Information sur l'origine depuis laquelle les altitudes maximale et minimale ont été mesurées - - - - Nom du fichier et URL. - - - - URL du document. - - \ No newline at end of file diff --git a/pilotage/public/fonts/glyphicons-halflings-regular.eot b/pilotage/public/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20290 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pilotage/public/fonts/glyphicons-halflings-regular.ttf b/pilotage/public/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41236 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 diff --git a/pilotage/public/img/banniere_geo.jpg b/pilotage/public/img/banniere_geo.jpg deleted file mode 100644 index 83323d2a9e29ebe6213fdb92de0cd3be46a8841f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34009 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 - - -} catch (\Exception $e) { - echo $e->getMessage(); -} diff --git a/pilotage/public/js/ZeroClipboard.js b/pilotage/public/js/ZeroClipboard.js deleted file mode 100644 index 75278c1b..00000000 --- a/pilotage/public/js/ZeroClipboard.js +++ /dev/null @@ -1,311 +0,0 @@ -// Simple Set Clipboard System -// Author: Joseph Huckaby - -var ZeroClipboard = { - - version: "1.0.7", - clients: {}, // registered upload clients on page, indexed by id - moviePath: '/pilotage/js/ZeroClipboard.swf', // URL to movie - nextId: 1, // ID of next movie - - $: function(thingy) { - // simple DOM lookup utility function - if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); - if (!thingy.addClass) { - // extend element with a few useful methods - thingy.hide = function() { this.style.display = 'none'; }; - thingy.show = function() { this.style.display = ''; }; - thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; - thingy.removeClass = function(name) { - var classes = this.className.split(/\s+/); - var idx = -1; - for (var k = 0; k < classes.length; k++) { - if (classes[k] == name) { idx = k; k = classes.length; } - } - if (idx > -1) { - classes.splice( idx, 1 ); - this.className = classes.join(' '); - } - return this; - }; - thingy.hasClass = function(name) { - return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); - }; - } - return thingy; - }, - - setMoviePath: function(path) { - // set path to ZeroClipboard.swf - this.moviePath = path; - }, - - dispatch: function(id, eventName, args) { - // receive event from flash movie, send to client - var client = this.clients[id]; - if (client) { - client.receiveEvent(eventName, args); - } - }, - - register: function(id, client) { - // register new client to receive events - this.clients[id] = client; - }, - - getDOMObjectPosition: function(obj, stopObj) { - // get absolute coordinates for dom element - var info = { - left: 0, - top: 0, - width: obj.width ? obj.width : obj.offsetWidth, - height: obj.height ? obj.height : obj.offsetHeight - }; - - while (obj && (obj != stopObj)) { - info.left += obj.offsetLeft; - info.top += obj.offsetTop; - obj = obj.offsetParent; - } - - return info; - }, - - Client: function(elem) { - // constructor for new simple upload client - this.handlers = {}; - - // unique ID - this.id = ZeroClipboard.nextId++; - this.movieId = 'ZeroClipboardMovie_' + this.id; - - // register client with singleton to receive flash events - ZeroClipboard.register(this.id, this); - - // create movie - if (elem) this.glue(elem); - } -}; - -ZeroClipboard.Client.prototype = { - - id: 0, // unique ID for us - ready: false, // whether movie is ready to receive events or not - movie: null, // reference to movie object - clipText: '', // text to copy to clipboard - handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor - cssEffects: true, // enable CSS mouse effects on dom container - handlers: null, // user event handlers - - glue: function(elem, appendElem, stylesToAdd) { - // glue to DOM element - // elem can be ID or actual DOM element object - this.domElement = ZeroClipboard.$(elem); - - // float just above object, or zIndex 99 if dom element isn't set - var zIndex = 99; - if (this.domElement.style.zIndex) { - zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; - } - - if (typeof(appendElem) == 'string') { - appendElem = ZeroClipboard.$(appendElem); - } - else if (typeof(appendElem) == 'undefined') { - appendElem = document.getElementsByTagName('body')[0]; - } - - // find X/Y position of domElement - var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem); - - // create floating DIV above element - this.div = document.createElement('div'); - var style = this.div.style; - style.position = 'absolute'; - style.left = '' + box.left + 'px'; - style.top = '' + box.top + 'px'; - style.width = '' + box.width + 'px'; - style.height = '' + box.height + 'px'; - style.zIndex = zIndex; - - if (typeof(stylesToAdd) == 'object') { - for (addedStyle in stylesToAdd) { - style[addedStyle] = stylesToAdd[addedStyle]; - } - } - - // style.backgroundColor = '#f00'; // debug - - appendElem.appendChild(this.div); - - this.div.innerHTML = this.getHTML( box.width, box.height ); - }, - - getHTML: function(width, height) { - // return HTML for movie - var html = ''; - var flashvars = 'id=' + this.id + - '&width=' + width + - '&height=' + height; - - if (navigator.userAgent.match(/MSIE/)) { - // IE gets an OBJECT tag - var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; - html += ''; - } - else { - // all other browsers get an EMBED tag - html += ''; - } - return html; - }, - - hide: function() { - // temporarily hide floater offscreen - if (this.div) { - this.div.style.left = '-2000px'; - } - }, - - show: function() { - // show ourselves after a call to hide() - this.reposition(); - }, - - destroy: function() { - // destroy control and floater - if (this.domElement && this.div) { - this.hide(); - this.div.innerHTML = ''; - - var body = document.getElementsByTagName('body')[0]; - try { body.removeChild( this.div ); } catch(e) {;} - - this.domElement = null; - this.div = null; - } - }, - - reposition: function(elem) { - // reposition our floating div, optionally to new container - // warning: container CANNOT change size, only position - if (elem) { - this.domElement = ZeroClipboard.$(elem); - if (!this.domElement) this.hide(); - } - - if (this.domElement && this.div) { - var box = ZeroClipboard.getDOMObjectPosition(this.domElement); - var style = this.div.style; - style.left = '' + box.left + 'px'; - style.top = '' + box.top + 'px'; - } - }, - - setText: function(newText) { - // set text to be copied to clipboard - this.clipText = newText; - if (this.ready) this.movie.setText(newText); - }, - - addEventListener: function(eventName, func) { - // add user event listener for event - // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel - eventName = eventName.toString().toLowerCase().replace(/^on/, ''); - if (!this.handlers[eventName]) this.handlers[eventName] = []; - this.handlers[eventName].push(func); - }, - - setHandCursor: function(enabled) { - // enable hand cursor (true), or default arrow cursor (false) - this.handCursorEnabled = enabled; - if (this.ready) this.movie.setHandCursor(enabled); - }, - - setCSSEffects: function(enabled) { - // enable or disable CSS effects on DOM container - this.cssEffects = !!enabled; - }, - - receiveEvent: function(eventName, args) { - // receive event from flash - eventName = eventName.toString().toLowerCase().replace(/^on/, ''); - - // special behavior for certain events - switch (eventName) { - case 'load': - // movie claims it is ready, but in IE this isn't always the case... - // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function - this.movie = document.getElementById(this.movieId); - if (!this.movie) { - var self = this; - setTimeout( function() { self.receiveEvent('load', null); }, 1 ); - return; - } - - // firefox on pc needs a "kick" in order to set these in certain cases - if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { - var self = this; - setTimeout( function() { self.receiveEvent('load', null); }, 100 ); - this.ready = true; - return; - } - - this.ready = true; - this.movie.setText( this.clipText ); - this.movie.setHandCursor( this.handCursorEnabled ); - break; - - case 'mouseover': - if (this.domElement && this.cssEffects) { - this.domElement.addClass('hover'); - if (this.recoverActive) this.domElement.addClass('active'); - } - break; - - case 'mouseout': - if (this.domElement && this.cssEffects) { - this.recoverActive = false; - if (this.domElement.hasClass('active')) { - this.domElement.removeClass('active'); - this.recoverActive = true; - } - this.domElement.removeClass('hover'); - } - break; - - case 'mousedown': - if (this.domElement && this.cssEffects) { - this.domElement.addClass('active'); - } - break; - - case 'mouseup': - if (this.domElement && this.cssEffects) { - this.domElement.removeClass('active'); - this.recoverActive = false; - } - break; - } // switch eventName - - if (this.handlers[eventName]) { - for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { - var func = this.handlers[eventName][idx]; - - if (typeof(func) == 'function') { - // actual function reference - func(this, args); - } - else if ((typeof(func) == 'object') && (func.length == 2)) { - // PHP style object + method, i.e. [myObject, 'myMethod'] - func[0][ func[1] ](this, args); - } - else if (typeof(func) == 'string') { - // name of function - window[func](this, args); - } - } // foreach event handler defined - } // user defined handler for event - } - -}; \ No newline at end of file diff --git a/pilotage/public/js/ZeroClipboard.swf b/pilotage/public/js/ZeroClipboard.swf deleted file mode 100644 index fbd5e9d5c096ebf47ded34d33eace7f8e545feac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2055 zcmV+i2>ACyS5pow3;+Ol+I?0_bKA%fo(2I708tc0Nwh4#=#|&9WJsiBuh*7s*|JDl zvL(^cW92x0a0m`W*dV|FpdLx3;!4#X@&j_p#ku5^TYf-pxuhxu$rbNChg7QaAJ%Dr zGG*B2*^kc|9BL0(*)E@~M22$)lO$hn*z~6w7J6_$KT`QJzdrjN%XHmL4 z)(C>uY(BrcyF0aeZOZkw^V7F(-O3kc@-s7&Xff&UI|199bo|k=xfr0xeZ#X_f#o{6 zNM<#+9o!uoJ3_4+UC>tBvt!7*k>@sVawqWf(^Jz3R5xZ#*K4w1jDqSdb1mfzssT-$l$xVxP#jb zj9*dy!!r^;qrd&@_eHGu-?eAla~Eu@RdbnFCx03Ik4gwG5YuB#K26eOiU@DN|FcX4 za`ZHbydHR#vn^L@uelK<<4R2Nov3`;ire;iDdNQ)*Q(P8u4{AV$gAyUjeET(w(IS9 z)-AtfvweBJul*G)gUy%fS~CJicjJv3vy~n0DIKmIbW}x5 zF^##+7WH`$LGRcU2uW23Z|IT7DfWO4e@ z`m2>nadWx!YHMx&$&*s?lX1#tjujwMCml+Y2du~fHhRTuJ4W39SK_Q-p7h-DF~)Ph z)UM`oJ6P2d+vV=&JpS{xujOY7g&X-=+p+`8p&rLP8(d~~@R;xSbh6(LEZZMEQHj}3B`%#*7CY}w(HC5t zdduP7g_A~0PQX2ehu`5H!!!Q}}RmUTNO**uLZk zI2*#ovczm_+o6uTZZMmxenc^8Tw8WooqJ1;>587~2AbWKwHAxI8YA>mf!Fo}Uaxr8 zw&nP;AD0kx3B$8KwY0yFCQW6X8*R+Teh;&4cem&^@!(Q)E$wTaUX8Zx#g04fF=g9h zt%hazYKP3;c*(p zI4{cIhjNTJX z)c>QF%l_|9&14}fX0>5eBFdK%IR)7(BkIWb$i&Fi5q)GbJD2^5kdi>AilB;GPqH`F z_k@B#AwdO+q8=y(g@Q^GJyc3ksh3JAD)mt*O{IP+WvDbjVUWTQg)Eg$QE8Y;BUCy= zrLz>ipz>u3W9k@Cm{O;Z=G8o$!FPeeG=*yvzM_d66uzc#lfo@^7N~rerteX>Pvvc zIRRBvktCA%YoZV>#_d6xOeTSdy+EWC5V;QsO#@N-fv6cE+5nKAK_E#Y4#@zgAu9_& zPW2~XxL*{Y7bxzRA_-8`3t{2qkbb%`^fIfT)6c)tFT4xQp?7-joqq9MBl|E4OHkDQ zuy9a4t&i%L9tiqqc|=%@LdDQl!$R&`L);{9h3^hB8A9G4m}l5or03Xqq!(E35;3I1 z-xzXwfDpAN*QE34@V+J<)g{inARS}VNX?l^s9b}XyF@0cqvmz| zepR_4qACyU>lZhXsoab#stNN}XeKMOLPxkAn!R1&PH3jO!rjp9>k4zBnMR>{Pag`+ zOyz#W4Tffahs%cM0CJ(ek*f>}SQ3$nT3;>P=|&V>d(+55$y!& z;j;_HM2SFxl!+jbhXngs5(QODhlNmo6(z4c44tUtuD*IgPerWgc%)~?`cSXs;+K&t z4+`IYILwF`^ ul', - items: "> li:has(.afficher)", - cancel:"> li:not(:has(.afficher))", - cursor:"n-resize", - handle:'.action-deplacer', - update:$.proxy(function(event, ui){ - - this.estModifie = true; - this.majOrdre(); - this.trier(); - }, that) - }); - },0,this); - - - } - - function _click(params){ - - var that = this; - Arborescence.debutPatienter(); - //Déclencher le click de l'objet correspondant - setTimeout(function(){ - - params.data.arbo.clickElement(that.id); - Arborescence.finPatienter(); - }, 0); - } - - //Gestion du click sur les attributs et initialisation des tooltips - this.obtenirReference().find('input.check:not(.expander)').on("click", null, {arbo:this}, _click).tooltip(); - - this.obtenirReference().find('.action, .lien-groupe, .lien-couche, label').tooltip(); - - $(window).on("beforeunload", null, {arbo:this}, function(params){ - - if(params.data.arbo.estModifie){ - return 'Des modifications sont non enregistrées. Si vous quittez cette page, ces modifications seront perdues.'; - - } - - }); - - $('#enregistrer').on("click", null, {arbo:this}, function(){ - //Désactiver la vérification "Est-ce qu'on va perdre des données si on quitte la page" - arbo.estModifie = false; - }); - -} - -/** - * Déclenche l'affichage du contenu de l'arborescence - */ -Arborescence.prototype.afficher = function(){ - - //Faire générer le HMTL requis - this.ecrire('

    '); - - //Afficher l'arborescence dans la page - this.obtenirReference().html(this.contenuAAfficher.join('\n')); - this.contenuAAfficher = []; - - this.init(); - -} - -/** - * Le mode édition permet d'activer l'édition du libellé d'un groupe/couche et - * de changer leur ordre dans l'arborescence - * @returns bool - */ -Arborescence.prototype.estEnModeEdition = function(){ - - return this.params.edition; -} - -Arborescence.prototype.getClassName = function(){ - - return 'Arborescence'; -} - -/** - * Met à jour l'ordre des groupes enfants en se basant sur leur ordre dans le DOM - */ -Arborescence.prototype.majOrdre = function(){ - - this.obtenirReference().find(' > ul > li').each($.proxy(Arborescence._majOrdre, this)); - -} - -Arborescence._majOrdre = function(index, valeur){ - if($(valeur).has('.check-coche, .check-complet, .check-partiel')){ - var item = this.obtenirElementAmeliore(valeur.id); - item.definirOrdre(index + 1); - }else{ - item.definirOrdre(0); - }; -} - -Arborescence.prototype.obtenirElements = function() { - return this.enfants; -} - -//TODO Mettre un vrai commentaire pour cette fonction -Arborescence.prototype.clickElement = function(idElement) { - - //On a cliqué une colonne - if(idElement.substring(0,7) == "colonne"){ - var colonne = this.obtenirElementAmeliore(idElement); - - //Permuter l'état de la colonne sur laquelle on a cliqué - colonne.click(); - if(this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true){ - colonne.majEtatColonnesAvecLeMemeId(); - } - return; - } - - this._clickElement(this.enfants, idElement); - -} - -//TODO Mettre un commentaire pour cette fonction -Arborescence.prototype._clickElement = function(elements, idElement) { - var element; - - for (id in elements) { - element = elements[id]; - - //On a trouvé l'élément cherché - if (element.id == idElement) { - element.click(); - return true; - } - - //Chercher dans les enfants si possible - if(element.nbEnfants > 0) { - - //Chercher parmis les enfants - if (this._clickElement(element.enfants, idElement)){ - return true; - } - } - - //Chercher dans les attributs si possible (c'est un groupe ou une couche) - if(element.attributs && element.attributs.nbAttributs > 0) { - - var spl = idElement.split('_'); - var type_attribut; //attribur de couche ou de groupe spl0 - var nomAttribut = spl[spl.length-1]; - var attribut = element.obtenirAttribut(nomAttribut); - if(!attribut){ - continue; - } - - var elementSousId = spl.shift() + spl.shift() + '_' + spl.pop(); - - var estArboPermission = (this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true); - - spl = attribut.obtenirId().split('_'); - type_attribut = spl.shift(); - - //On est dans l'arbo des permission et c'est un attribut de couche qu'on a cliqué - if(estArboPermission && attribut.parent.parent.estCouche() ){ - - //L'attribut correspond (ou est le double) de celui qu'on a cliqué - if(type_attribut + spl.shift() + '_' + spl.pop() == elementSousId){ - - attribut.click(); - - } - } else if (attribut.obtenirId() == idElement) { - attribut.click(); - return true; - - } - - } - } -} - -/** - * Trouver un élément groupe ou couche - * @param object groupe ou couche - * @param string id de l'élément à trouver - */ -Arborescence.prototype.obtenirElement = function(idElement) { - - return this._obtenirElement(this.enfants, idElement); - -} - -Arborescence.prototype.obtenirElementAmeliore = function(idElement){ - - //Déterminer à quoi on a affaire - var typeElement = ''; - if(idElement.substring(0,7) == "colonne"){ - typeElement = 'colonne'; - }else if(idElement.substring(0,6) == "couche"){ - typeElement = 'couche'; - - }else if(idElement.substring(0,6) == "groupe"){ - typeElement = 'groupe'; - }else{ - alert("C'est un attribut?"); - } - - switch(typeElement){ - case 'colonne': - return this.obtenirColonne(idElement); - case 'couche': - return this.obtenirCouche(idElement); - case 'groupe': - return this.obtenirGroupe(idElement); - case 'attribut': - return this.obtenirAttribut(idElement); - default: - break; - } - - return false; - -} - -Arborescence.prototype.obtenirColonne = function(id){ - return this.colonnes.obtenirElement(id); -} - - -Arborescence.prototype.obtenirCouche = function(id){ - return this.couches.obtenirElement(id); -} - -Arborescence.prototype.obtenirGroupe = function(id){ - return this.groupes.obtenirElement(id); - -} - -Arborescence.prototype.obtenirAttribut = function(id){ - return this.attributs.obtenirElement(id); -} - -/* - * Récupère une référence sur un élément - * @param object elements Éléments à fouiller - * @param string idElement Id de l'élément qu'on cherche - */ -Arborescence.prototype._obtenirElement = function(elements, idElement) { - - var elementTrouve = false; - var element; - for (id in elements) { - element = elements[id]; - - //On a trouvé l'élément cherché - if (element.id == idElement) { - return element; - } - - //Chercher dans les enfants si possible - if(element.nbEnfants > 0) { - - //Chercher parmis les enfants - elementTrouve = this._obtenirElement(element.enfants, idElement); - - } - - //Chercher dans les attributs si possible - if(!elementTrouve && element.attributs && element.attributs.nbAttributs > 0) { - - //Chercher parmis les attributs - var attributs = element.attributs.attributs; - var attribut; - for(nomAttribut in attributs){ - attribut = attributs[nomAttribut]; - if(attribut.obtenirId() == idElement){ - elementTrouve = attribut; - } - } - } - - if (elementTrouve) { - return elementTrouve; - } - } - - //on a pas trouvé l'élément - return elementTrouve; - -} - -Arborescence.prototype.ajouterGroupe = function(groupe) { - - groupe.parent = this; - this.enfants[groupe.id] = groupe; - this.nbEnfants++; - - groupe.ajusterOrdre(); - - this.groupes.ajouterElement(groupe); - - this.ajouterAttributsALaListe(groupe.obtenirAttributs()); - -} - -Arborescence.prototype.ajouterAttributsALaListe = function(attributs){ - for(ind in attributs){ - this.attributs.ajouterElement(attributs[ind]); - } -} - -Arborescence.prototype.ordreMax = function(){ - - var max = 1; - var enfant; - //parcourir le parent et trouver le ordre max - for(cle in this.enfants){ - enfant = this.enfants[cle]; - if(enfant.ordre > max){ - max = enfant.ordre; - } - } - return max; -} - -/** - * Ajuster l'affichage des flêches monter/descendre - */ -Arborescence.prototype.rafraichirFleches = function(){ - - var liste = this.obtenirReference().find(' > ul > li'); - - //Cacher les flèches des items non activées - liste.children('.masquer.action-monter').hide(); - liste.children('.masquer.action-descendre').hide(); - liste.children('.masquer.action-deplacer').hide(); - - //Afficher la flèche monter de tous les activés, sauf le premier - liste.children('.afficher.action-monter').show().first().hide(); - - //Afficher la flèche descendre de tous les activés, sauf le dernier - liste.children('.afficher.action-descendre').show().last().hide(); - - liste.children('.afficher.action-deplacer').show(); - -} - -/** - * Tri les items en fonction de la valeur de leur ordre - */ -Arborescence.prototype.fonctionDeTri = function(a, b){ - - //Les items ayant un ordre "0" sont envoyé en fin de liste - var valeurA = parseInt($(a).children('.input-ordre').val()); - if(valeurA == 0){ - return 1; - } - var valeurB = parseInt($(b).children('.input-ordre').val()); - if(valeurB == 0){ - return -1; - } - - //Trier en ordre croisant - return valeurA - valeurB; -} - -Arborescence.prototype.trier = function(){ - this.trierGroupes(this); -} - -/** - * Trier les groupes - * @param Groupe item Groupe de couches à trier - */ -Arborescence.prototype.trierGroupes = function(item){ - - var parent, liste; - - if(item.estArbo()){ - parent = this.obtenirReference().children('ul'); - }else{ - parent = this.obtenirReference().find('#' + item.id).children('ul'); - } - liste = parent.children('li'); - - liste.sort(this.fonctionDeTri); - - liste.appendTo(parent); - item.rafraichirFleches(); - -} - -/** - * Tri les couches - * @param Groupe item Groupe de couches - */ -Arborescence.prototype.trierCouches = function(item){ - - var parent = this.obtenirReference().find('#' + item.id).children('ul'); - var liste = parent.children('li'); - - liste.sort(this.fonctionDeTri); - - liste.appendTo(parent); - item.rafraichirFleches(); -} - -Arborescence.prototype.estGroupe = function(){ - return false; -} - -Arborescence.prototype.estArbo = function(){ - return true; -} - -Arborescence.prototype.obtenirArbo = function(){ - - return this; -} - -/** - * Récupère une référence jQuery sur l'arborescence - * @returns - */ -Arborescence.prototype.obtenirReference = function(){ - if(this.reference == undefined){ - this.reference = $(document.getElementById(this.id)); - } - return this.reference; -} - -/** - * Ajoute du contenu au HTML qui va construire l'arborescence - */ -Arborescence.prototype.ecrire = function(texte){ - this.contenuAAfficher.push(texte); -} - -/** - * Tous les champs contenus dans l'arborescence - * @returns {undefined} - */ -Arborescence.prototype.getJSON = function(){ - - //Générer un ordre de tri total pour toutes les couches et les groupes - this.obtenirReference().find('li').has('.check-coche, .check-complet, .check-partiel, .check-exclu').each($.proxy(function(index, valeur){ - - var item = this.obtenirElementAmeliore(valeur.id); - item.definirOrdre(index + 1); - }, this)); - - var data = {}; - this.obtenirReference().find('input[name]').each($.proxy(function(index, element){ - - //Dans le formulaire, pour le même name, on a un input[type=checkbox] - //avec un value à 0 et un autre à 1. Si aucun est coché, on veut que la - //valeur soit 0. Si celui qui a value=1 est coché, on veut 1. - - //C'est le cch par défaut, ou la cch de l'attribut est cochée - if(element.value == 0 || (element.checked)){ - data[element.name] = element.value; - } - - //Inclure l'élément titre et ordre au besoin - if(this.estEnModeEdition()){ - - var utilite = element.getAttribute('data-utilite'); - if(('ordre' == utilite || 'titre' == utilite)){ - - data[element.name] = element.value; - - } - - } - - }, this)); - - return JSON.stringify(data); - -} - -Arborescence.debutPatienter = function(){ - $('body').addClass('wait'); - -} - -Arborescence.finPatienter = function(){ - $('body').removeClass('wait'); -} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Attribut.js b/pilotage/public/js/arborescence/Attribut.js deleted file mode 100644 index 494c2dd4..00000000 --- a/pilotage/public/js/arborescence/Attribut.js +++ /dev/null @@ -1,530 +0,0 @@ -/** - * Classe Attribut représente un attribut de Groupe ou de Couche. Un attribut - * désigne l'état de la couche, soit visible, actif, lecture, écriture, export, - * etc. Le constructeur est généralement appelé par la classe Attributs. - */ - -/** - * - * @param string nomAttribut Nom de l'attribut (ex : "lecture", "analyse", "ecriture", "export", "association" - * @param bool checked - * @param bool association L'utilisateur à le droit d'associer (cocher/décocher) cet attribut - * @returns {Attribut} - */ -function Attribut(nomAttribut, checked, association) { - - this.nomAttribut = nomAttribut; - this.etat = checked ? 'coche' : 'decoche'; - this.association = association; - -} - -Attribut.prototype.id = ''; -Attribut.prototype.parent = ''; //Défini lors de Attributs.ajouterAttribut() -Attribut.prototype.reference = undefined; //référence jQuery - -Attribut.prototype.getClassName = function(){ - return 'Attribut'; -} - -/** - * - * @param {type} etatDuParent "coche", "decoche", "exclu", "partiel" ou "complet" - */ -Attribut.prototype.init = function(etatDuParent){ - - if(!this.association){ - - document.getElementById(this.obtenirId()).setAttribute('disabled', true); - } - - //La parent est coché - if (etatDuParent == "coche"){ - - //L'enfant est exclu - if(this.nomAttribut == "visible" && this.etat == "decoche" && this.obtenirArbo().estEnModeEdition()){ - - this.etat = 'exclu'; - this.parent.parent.majClasse(); - }else{ - - this.etat = 'coche'; - } - - //Le parent est exclu - }else if(etatDuParent == 'exclu' && this.nomAttribut == "visible" && this.obtenirArbo().estEnModeEdition()){ - this.etat = 'exclu'; - this.parent.parent.majClasse(); - } - - if(this.estUnAttributDeGroupe()){ - - //Stocker l'état de l'attributs de tous les enfants(récursivement) - var etatDesAttributsDesEnfants = []; - var enfants = this.parent.parent.enfants; - for(indiceEnfant in enfants){ - - //Initialiser l'attribur enfant et récupérer son résultat - etatDesAttributsDesEnfants.push(enfants[indiceEnfant].obtenirAttribut(this.nomAttribut).init(this.etat)); - } - - //L'attribut n'est pas coché - if(!this.estCoche() && !this.estExclu()){ - - //Déterminer son état en fonction de celui de ses enfants - var nbTotal = etatDesAttributsDesEnfants.length; - var nbCoche = 0; - var nbPartiel = 0; - - var etat; - for(ind = 0; ind < nbTotal ; ind++){ - etat = etatDesAttributsDesEnfants[ind]; - if(etat == "coche" || etat == "complet"){ - nbCoche++; - }else if(etat == "partiel"){ - nbPartiel++; - } - - } - - if(nbTotal == nbCoche){ - this.etat = 'complet'; - }else if(nbCoche > 0 || nbPartiel > 0){ - this.etat = 'partiel'; - }else{ - this.etat = 'decoche'; - - } - } - } - - this.majAffichageAttribut(); - return this.etat; -} - -/** - * Récupère une référence jQuery sur l'attribut - */ -Attribut.prototype.obtenirReference = function(){ - if(this.reference == undefined){ - this.reference = $(document.getElementById(this.obtenirId())); - } - return this.reference; -} - -Attribut.prototype.obtenirId = function(){ - - if(!this.id){ - this.id = this.parent.parent.id + '_' + this.nomAttribut; - } - return this.id; -} - -/** - * Indique si le parent ayant le même attribut est coché - * @returns {undefined} - */ -Attribut.prototype.parentEstCoche = function(){ - - //Il n'y a pas de parent - if(this.parent.parent.parent.estArbo()){ - return false; - } - return this.parent.parent.parent.obtenirAttribut(this.nomAttribut).estCoche(); -} - -/* - * Gère le click sur un attribut - */ -Attribut.prototype.click = function() { - - var arbo = this.obtenirArbo(); - - //Indiquer qu'une modification non enregistrée à été faite - arbo.estModifie = true; - - //Détacher du DOM le temps de faire les mises à jour - var arboTempo = $(document.getElementById(arbo.id)).detach(); - - switch(this.etat){ - - case 'coche': - - //On a cliqué sur l'attribut "visible", on n'est pas à la racine, le parent est coché et il a au moins 2 enfants - if(this.nomAttribut == 'visible' && this.parentEstCoche() && this.parent.parent.parent.nbEnfants > 1){ - this.exclure(); - - //L'attribut était exclu - }else{ - - this.deExclure(); - } - break; - - //L'attribut n'était pas coché ou exclu - case 'decoche': - case 'partiel': - case 'complet': - this.etat = 'coche'; - break; - - case 'exclu': - if(this.parentEstCoche()){ - this.deExclure(); - this.etat = 'coche'; - }else{ - this.deExcluACoche(); - } - - break; - } - - this.parent.parent.majClasse(); - - this.majAffichageAttribut(); - this.parent.parent.majEtatOutilsEdition(); - - this.changerEtatEnfants(); - this.changerEtatParents(); - - //Ratacher l'arbo du DOM à la fin des maj - arboTempo.appendTo('#conteneur-arborescence'); - -} - -/** - * Met à jour le style d'un attribut en fonction de son état - * @returns {undefined} - */ -Attribut.prototype.majAffichageAttribut = function(){ - - var estArboPermission = (this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true); - var cch = this.obtenirReference(); - cch.removeClass('check-coche') - .removeClass('check-decoche') - .removeClass('check-partiel') - .removeClass('check-partiel-gris') - .removeClass('check-complet') - .removeClass('check-complet-gris') - .removeClass('check-exclu'); - - switch(this.etat){ - case 'coche': - cch.addClass('check-coche').prop('checked', true); - - break; - case 'decoche': - cch.addClass('check-decoche').prop('checked', false); - - break; - case 'partiel': - cch.addClass('check-partiel'); - if(!estArboPermission && this.parent.parent.estGroupeDeGroupe()){ - cch.addClass('check-partiel-gris'); - } - break; - case 'complet': - cch.addClass('check-complet'); - if(!estArboPermission && this.parent.parent.estGroupeDeGroupe()){ - cch.addClass('check-complet-gris'); - } - break; - case 'exclu': - cch.addClass('check-exclu'); - - if(this.parent.parent.estCouche()){ - this.parent.parent.decocherColonnes(); - } - break; - } - -} - -/** - * Fait changer l'état de l'attribut du même type, pour les groupes et couches enfants - * @param bool checked État du parent original qui déclenche le changement - * @returns {undefined} - */ -Attribut.prototype.changerEtatEnfants = function(){ - - var conteneurParent = this.parent.parent; - if(conteneurParent.nbEnfants == 0){ - return; - } - - if (conteneurParent.estGroupe()){ - - var enfant, attributEnfant, attributEnfantInput; - - var enfants = conteneurParent.enfants; - for(id in enfants){ - - enfant = enfants[id]; - - //Attribut correspondant dans l'enfant - attributEnfant = enfant.obtenirAttribut(this.nomAttribut); - attributEnfantInput = attributEnfant.obtenirReference(); - - if(this.estDecoche()){ - attributEnfantInput.removeClass("parent-est-coche").prop('checked', false); - attributEnfant.etat = 'decoche'; - }else if(this.estExclu()){ - attributEnfantInput.removeClass("parent-est-coche").prop('checked', false); - - }else{ - attributEnfantInput.addClass("parent-est-coche").prop('checked', true); - attributEnfant.etat = 'coche'; - } - - attributEnfant.majAffichageAttribut(); - attributEnfant.changerEtatEnfants(); - - } - - //On est dans une couche - }else{ - - if(this.estDecoche()){ - conteneurParent.decocherColonnes(); - - } - } - - conteneurParent.majEtatOutilsEdition(); - - conteneurParent.parent.majOrdre(); - conteneurParent.parent.rafraichirFleches(); - -} - -/** - * Coche l'élément parent si vous ses enfants sont coché - * Attention : le parent direct est un groupe ou une couche, ici on s'intéresse - * au "grand-parent" - */ -Attribut.prototype.changerEtatParents = function (){ - - //Récupérer le groupe parent de l'attribut - var parent = this.parent.parent.parent; - - //Il n'y a pas de groupe ou couche parent - if(parent.estArbo()){ - return; - } - - if(this.obtenirReference().prop('disabled')){ - return; - } - - //Récupérer l'attribut dans le groupe parent - var parentAttribut = parent.obtenirAttribut(this.nomAttribut); - - //S'assurer que l'utilisateur a les permissions nécessaires - if(!parentAttribut.association){ - - return; - } - - //L'attribut est maintenant exclu, il était donc coché auparavant, et tous les enfants de sont parent ne sont pas décoché - if(this.estExclu() && parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ - //Ne pas modifier l'état du parent - - //On vient de cocher un élément dont le parent est exclu - }else if(parentAttribut.estExclu() && this.estCoche()){ - - //marquer le parent comme coché - parentAttribut.etat = 'coche'; - parentAttribut.parent.parent.majClasse(); - parentAttribut.parent.parent.majEtatOutilsEdition(); - - }else if(parent.auMoinsUnEnfantExclu(this.nomAttribut)){ - //Ne pas modifier l'état du parent - - }else if(parentAttribut.etat == 'coche' && parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ - - //Ne pas modifier l'état du parent - - //Tous les enfants ayant le même attribut sont coché - }else if(parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ - - //Mettre le parent à l'état "tous les enfants sont cochés" - parentAttribut.etat = 'complet'; - - //Au moins un enfant ayant le même attribut est coché - }else if(parent.enfantCochePartiel(this.nomAttribut)){ - - parentAttribut.etat = 'partiel'; - - //Aucun enfant coché - }else{ - - parentAttribut.etat = 'decoche'; - } - - parentAttribut.obtenirReference().prop('checked', false); - - parentAttribut.majAffichageAttribut(); - parent.majEtatOutilsEdition(); - parent.rafraichirFleches(); - parentAttribut.changerEtatParents(); - - parent.majOrdre(); - -} - -/** - * @return string Libellé associé à l'attribut - */ -Attribut.prototype.getTitle = function() { - var title = ''; - switch (this.nomAttribut) { - case 'visible': - title = 'Visible'; - break; - case 'active': - title = 'Actif'; - break; - case 'lecture': - title = 'Lecture'; - break; - case 'analyse': - title = 'Analyse'; - break; - case 'ecriture': - title = 'Écriture'; - break; - case 'export': - title = 'Export'; - break; - case 'association': - title = 'Association'; - default: - break; - } - return title; - -} - -/** - * - * @returns string Séparateur associé au nom de l'attribut - */ -Attribut.prototype.getSeparateur = function() { - var separateur = ''; - switch (this.nomAttribut) { - case 'visible': - separateur = 'V'; - break; - case 'active': - separateur = 'A'; - break; - case 'lecture': - separateur = 'L'; - break; - case 'analyse': - separateur = 'A'; - break; - case 'ecriture': - separateur = 'E'; - break; - case 'export': - separateur = 'P'; - break; - case 'association': - separateur = 'S'; - break; - default: - break; - } - return separateur; - -} - -/** - * Exclu l'attribut et réperture sur les enfants de son groupe/couche - */ -Attribut.prototype.exclure = function(){ - - this.etat = 'exclu'; - this.majAffichageAttribut(); - this.parent.parent.majClasse(); - - //Répercuter l'exclusion jusqu'aux couches - var parent = this.parent.parent; - if(parent.estGroupe()){ - var enfants = parent.enfants; - for(id in enfants){ - - enfants[id].obtenirAttribut(this.nomAttribut).exclure(); - - } - } -} - -/** - * Fait passer l'état de exclu à coché - */ -Attribut.prototype.deExcluACoche = function(){ - - this.etat = 'coche'; - this.majAffichageAttribut(); - this.parent.parent.majClasse(); - - //Répercuter la déexclusion à tous les enfants - var parent = this.parent.parent; - if(parent.estGroupe()){ - var enfants = parent.enfants; - for(id in enfants){ - - enfants[id].obtenirAttribut(this.nomAttribut).deExcluACoche(); - - } - } -} - -Attribut.prototype.deExclure = function(){ - this.etat = 'decoche'; - this.parent.parent.obtenirReference().find('li.exclu').removeClass('exclu'); -} - -//L'item est bien coché -Attribut.prototype.estCoche = function(){ - return this.etat == 'coche'; -} - -//L'item n'est pas coché -Attribut.prototype.estDecoche = function(){ - return this.etat == 'decoche'; -} - -//Au moins un enfant de cet item est coché, intermédiaire ou complet -Attribut.prototype.estPartiel = function(){ - return this.etat == 'partiel'; -} - -//Tous les enfants de cet item sont cochés, itermédiaires ou complets -Attribut.prototype.estComplet = function(){ - return this.etat == 'complet'; -} - -//L'item est exclu -Attribut.prototype.estExclu = function(){ - return this.etat == 'exclu'; -} - -Attribut.prototype.estCommun = function(){ - return this.commun; -} - -Attribut.prototype.estUnAttributDeGroupe = function(){ - - return (this.parent.parent.estGroupe()); -} - -/** - * Retourne une référence sur l'arbo qui contient l'attribut - */ -Attribut.prototype.obtenirArbo = function(){ - - return this.parent ? this.parent.obtenirArbo() : ''; -} diff --git a/pilotage/public/js/arborescence/Attributs.js b/pilotage/public/js/arborescence/Attributs.js deleted file mode 100644 index 3558f2ea..00000000 --- a/pilotage/public/js/arborescence/Attributs.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Représente une liste d'attributs. - */ - -/** - * Construit la liste d'attributs en fonction du nom et de leur état - * @param {} attributs ex : {'visible':true, 'active':false} - */ -function Attributs(attributs) { - - this.attributs = {}; - - for (nomAttribut in attributs) { - this.ajouterAttribut(new Attribut(nomAttribut, attributs[nomAttribut]['valeur'], attributs[nomAttribut]['association'])); - } -} - -Attributs.prototype.parent = ''; //Défini lors de Couche.ajouterAttributs() -Attributs.prototype.nbAttributs = 0; - -Attributs.prototype.init = function(){ - var attribut; - var etat; - for(nomAttribut in this.attributs){ - attribut = this.attributs[nomAttribut]; - etat = attribut.init('decoche'); - attribut.etat = etat; - - } - -} - -Attributs.prototype.ajouterAttribut = function(attribut){ - attribut.parent = this; - this.attributs[attribut.nomAttribut] = attribut; - this.nbAttributs++; -} - -/* - * Permet d'accéder à un attribut sans faire attributs.attributs[nomAttribut] - * @param string nomAttribut - * @returns - */ -Attributs.prototype.obtenirAttribut = function(nomAttribut) { - return this.attributs[nomAttribut] != undefined ? this.attributs[nomAttribut] : false; -} - -/** - * Nombre d'attributs activés, soit coché, intermédiaire ou complet - * @returns int - */ -Attributs.prototype.nbAttributsActives = function() { - var nbCoche = 0; - var attribut; - for (id in this.attributs) { - attribut = this.attributs[id]; - if (id != 'commune' && (attribut.estCoche() || attribut.estPartiel() || attribut.estComplet())) { - nbCoche++; - } - } - return nbCoche; -} - -/** - * Retourne une référence sur l'arbo qui contient l'attribut - */ -Attributs.prototype.obtenirArbo = function(){ - - return this.parent ? this.parent.obtenirArbo() : ''; -} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Colonne.js b/pilotage/public/js/arborescence/Colonne.js deleted file mode 100644 index 11c4a1ad..00000000 --- a/pilotage/public/js/arborescence/Colonne.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * Colonne représente un champ de BD. Est rataché à une Couche - */ - -/** - * - * @param {type} id Ex : 12_13_19 - * @param string libelle Nom du champ - * @param bool estCochee Est exclus - * @returns {Colonne} - */ -function Colonne(id, libelle, estCochee) { - this.id = 'colonne_' + id; - this.name = 'C' + 'X' + id; - this.libelle = libelle; - this.estCochee = estCochee; - - var spl = id.split('_'); - this.idDeLaColonne = spl[spl.length-1]; //Ex : 19 - -} - -Colonne.prototype.parent = ''; //Initialisé lors de Couche.ajouterColonne() -Colonne.prototype.reference = undefined; - -Colonne.prototype.getClassName = function(){ - return 'Colonne'; -} - -/** - * - */ -Colonne.prototype.init = function(){ - - this.updateInput(); - this.updateLabel(); - -} - -Colonne.prototype.click = function(){ - - //Récupérer l'état actuelle se sa cch - var cch = this.obtenirReference(); - var cchEstCoche = cch.prop('checked'); - - if(cchEstCoche && (this.getCoucheParent().nbAttributsActives() == 0)){ - - //Annuler l'exclusion - cch.prop('checked', false); - alert("Il faut d'abord associer la couche avant d'en exclure une colonne."); - return; - } - - this.estCochee = cchEstCoche; - this.updateLabel(); - -} - -Colonne.prototype.updateInput = function(){ - - this.obtenirReference().prop('checked', this.estCochee); -} - -Colonne.prototype.updateLabel = function(){ - var label = this.getLabel(); - if(this.estCochee){ - label.css('text-decoration', 'line-through'); - }else{ - label.css('text-decoration', ''); - } -} - -Colonne.prototype.getCoucheParent = function(){ - - return this.parent; - -} - -Colonne.prototype.getLabel = function(){ - var arbo = this.obtenirArbo(); - return arbo.obtenirReference().find('label[for="' + this.id + '"]'); -} - -/** - * Récupère une référence jQuery sur la colonne - */ -Colonne.prototype.obtenirReference = function(){ - if(this.reference == undefined){ - this.reference = $(document.getElementById(this.id)); - } - return this.reference; -} - -Colonne.prototype.decocher = function(){ - - var input = this.obtenirReference(); - if(input.prop('checked')){ - input.click(); - } - -} - -/** - * Ajoute le contenu de la colonne au HTML qui va construire l'arborescence - */ -Colonne.prototype.afficher = function() { - - var checked = this.estCochee ? "checked" : ''; - var arbo = this.obtenirArbo(); - arbo.ecrire(['
  • ' - , '' - , '' - , '' - , '
  • '].join('')); - -} - -/** - * Indique si le terme est contenu la colonne - * @param string terme - * @returns bool - */ -Colonne.prototype.contientLeTerme = function(terme) { - return indexOfRegExp(this.libelle, terme); -} - -/** - * Retourne une référence sur l'arbo qui contient la colonne - */ -Colonne.prototype.obtenirArbo = function(){ - return this.parent ? this.parent.obtenirArbo() : false; -} - - - -/** - * Fait ajuster l'état des colonnes ayant le même id - */ -Colonne.prototype.majEtatColonnesAvecLeMemeId = function(){ - - var colonnes = this.obtenirArbo().colonnes; - var colonne; - - for(indColonne in colonnes){ - - colonne = colonnes[indColonne]; - - //La colonne correspond et ce n'est pas celle qu'on a cliqués originalement - if(this.idDeLaColonne == colonne.idDeLaColonne && this.id != colonne.id){ - - //La colonne peut être cochée - if(colonne.parent.estActive()){ - var inputColonne = colonne.obtenirReference() - inputColonne.prop('checked', this.estCochee); - colonne.click(); - } - } - - } - - -} - diff --git a/pilotage/public/js/arborescence/Couche.js b/pilotage/public/js/arborescence/Couche.js deleted file mode 100644 index 569a9440..00000000 --- a/pilotage/public/js/arborescence/Couche.js +++ /dev/null @@ -1,406 +0,0 @@ -/** - * Représente une couche. Couche contient généralement des colonnes (Colonne) - * et est contenu dans un Groupe - */ - -/** - * Classe couche - * @param string id - * @param string libelle - * @param string url - * @param int ordre - * @param {} attributs - * @returns {Couche} - */ -function Couche(id, libelle, url, ordre, attributs) { - - this.id = 'couche_' + id; - this.no = id; - this.libelle = $('
    ').html(libelle).text(); - this.url = url; - this.ordre = ordre; - this.enfants = {}; - this.ajouterAttributs(new Attributs(attributs)); - -} - -Couche.prototype.nbEnfants = 0; -Couche.prototype.parent = ''; -Couche.prototype.attributs = null; -Couche.prototype.reference = undefined; //référence jQuery - -Couche.prototype.init = function(){ - - //Initialiser les colonnes - for(cle in this.enfants){ - - this.enfants[cle].init(); - - } - - this.majEtatOutilsEdition(); - this.majClasse(); - -} - -Couche.prototype.obtenirReference = function(){ - - if(this.reference == undefined){ - this.reference = $(document.getElementById(this.id)); - } - return this.reference; -} - -/** - * - * @param Attributs attributs - */ -Couche.prototype.ajouterAttributs = function(attributs){ - - this.attributs = attributs; - this.attributs.parent = this; - -} - -Couche.prototype.getClassName = function(){ - return 'Couche'; -} - -Couche.prototype.obtenirLibelle = function(){ - return this.libelle; -} - -Couche.prototype.definirLibelle = function(libelle){ - - var arbo = this.obtenirArbo(); - this.libelle = libelle; - - var libelleEchappe = $('
    ').text(libelle).html(); - arbo.obtenirReference().find('#CT' + this.no + '').val(libelleEchappe); - arbo.obtenirReference().find('#libelle_' + this.id).html(libelleEchappe); - -} - -/** - * Place la couche et ses équivalent dans le bon ordre - */ -Couche.prototype.trier = function(){ - var arbo = this.obtenirArbo(); - var parent = this.obtenirReference().parent(); - var liste = parent.children('li'); - - liste.sort(arbo.fonctionDeTri); - - liste.appendTo(parent); - - this.parent.rafraichirFleches(); - -} - -/* - * Retourne la couche suivante dans la liste en se basant sur l'ordre - * @returns {Couche} - */ -Couche.prototype.suivant = function(){ - - var parent = this.parent; - var suivant = false; - - var autre; - for(cle in parent.enfants){ - autre = parent.enfants[cle]; - if(this.ordre < autre.ordre && (!suivant || autre.ordre < suivant.ordre)){ - - suivant = autre; - } - - } - return suivant; - -} - -/* - * Retourne la couche précédante dans la liste en se basant sur l'ordre - * @returns {Couche} - */ -Couche.prototype.precedant = function(){ - - var parent = this.parent; - var precedant = false; - - var autre; - for(cle in parent.enfants){ - autre = parent.enfants[cle]; - if(this.ordre > autre.ordre && (!precedant || autre.ordre > precedant.ordre)){ - - precedant = autre; - } - - } - return precedant; - -} - -/** - * Échange l'ordre de deux couches - */ -Couche.prototype.echangerOrdre = function(autre){ - - //Échanger l'ordre des deux groupes - var ordre = this.ordre; - this.definirOrdre(autre.ordre); - autre.definirOrdre(ordre); - - this.obtenirArbo().trierCouches(this.parent); - -} - -Couche.prototype.majClasse = function(){ - - var attributVisible = this.obtenirAttribut('visible'); - if(attributVisible && attributVisible.estExclu()){ - this.obtenirReference().addClass('exclu'); - }else{ - this.obtenirReference().removeClass('exclu'); - } -} - -Couche.prototype.afficher = function() { - - var arbo = this.obtenirArbo(); - - arbo.ecrire('
  • ' - + ''); - this.afficherAttributs(); - if (this.url) { - arbo.ecrire(''); - } - arbo.ecrire('' + this.libelle + ''); - if (this.url) { - arbo.ecrire(''); - } - - if(arbo.estEnModeEdition()){ - - //Icône d'édition - arbo.ecrire(['' - , '' - , '' - , '' - , '' - , ''].join('')); - - } - - if (this.nbEnfants > 0) { - arbo.ecrire('
      '); - var colonne; - for (nomColonne in this.enfants) { - colonne = this.enfants[nomColonne]; - colonne.afficher(); - - } - arbo.ecrire('
    '); - } - arbo.ecrire('
  • '); - -} - -/** - * Permet d'accéder aux attributs sans devoir faire this.attributs.attributs - */ -Couche.prototype.obtenirAttributs = function() { - - return this.attributs.attributs; -} - -Couche.prototype.afficherAttributs = function() { - - var attributs = this.obtenirAttributs(); - var attribut, checked, id, title, separateurAttribut, name; - var arbo = this.obtenirArbo(); - for (nomAttribut in attributs) { - - if (nomAttribut != 'commune'){ - - attribut = this.obtenirAttribut(nomAttribut); - checked = attribut.estCoche() ? 'checked' : ''; - id = this.id + '_' + nomAttribut; - title = attribut.getTitle(); - separateurAttribut = attribut.getSeparateur(); - name = 'C' + separateurAttribut + this.no; - - arbo.ecrire(['' , - '', - ''+ - '', - ''].join('')); - } - } -} - -Couche.prototype.ajouterColonne = function(colonne) { - - colonne.parent = this; - this.enfants[colonne.libelle] = colonne; - this.nbEnfants++; - - this.obtenirArbo().colonnes.ajouterElement(colonne); - -} - -Couche.prototype.ajusterOrdre = function(){ - - if(!this.obtenirArbo().estEnModeEdition()){ - return; - } - - if(this.ordre == 0){ - return; - } - - if(this.ordreDejaUtilise()){ - this.ordre = this.ordreMax() + 1; - } -} - -Couche.prototype.ordreDejaUtilise = function(){ - - var enfants = this.parent.enfants; - for(cle in enfants){ - if(this.ordre == enfants[cle]){ - return true; - } - } - return false; -} - -Couche.prototype.ordreMax = function(){ - - var max = 1; - var enfants = this.parent.enfants; - for(cle in enfants){ - if(enfants[cle].ordre > max){ - max = enfants[cle].ordre; - } - } - return max; -} - -Couche.prototype.definirOrdre = function(ordre){ - this.ordre = ordre; - this.getOrdreInput().val(ordre); -} - -Couche.prototype.getOrdreInput = function(ordre){ - - return $(document.getElementById('CO' + this.no)); - -} - -/** - * Indique si le terme est contenu dans l'iten ou dans un des enfants - */ -Couche.prototype.contientLeTerme = function(terme) { - var contient = indexOfRegExp(this.libelle, terme); - - if (!contient) { - - if (this.nbEnfants > 0) { - - //Vérifier dans les enfants - for (idColonne in this.enfants) { - contient = this.enfants[idColonne].contientLeTerme(terme); - - if (contient) { - return contient; - } - } - } - } - - return contient; -} - -/** - * Ajuste l'état des boutons et des inputs lié au groupe ou à la couche de l'attribut -*/ -Couche.prototype.majEtatOutilsEdition = function(){ - - var arbo = this.obtenirArbo(); - - if(arbo.estEnModeEdition()){ - - var id = this.id; - var activer = this.nbAttributsActives() > 0; - var item = this.obtenirReference(); - - //Libellé et ordre signifiant "rien" - var libelle = ''; - var ordre = 0; - - if(activer){ - - libelle = $('
    ').text(this.libelle).html(); - ordre = this.ordre; - item.children('.action').addClass('afficher').removeClass('masquer').show(); - }else{ - item.children('.action').addClass('masquer').removeClass('afficher').hide(); - this.ordre = 0; - } - - item.children('#CT' + this.no).val(libelle); - item.children('#CO' + this.no).val(ordre); - - } -} - -Couche.prototype.decocherColonnes = function(){ - - var colonnes = this.enfants; - for(id in colonnes){ - - //Il n'est pas possible d'exclure une colonne qui fait partie d'une couche pas dans le contexte - colonnes[id].decocher(); - - } -} - -Couche.prototype.obtenirAttribut = function(nomAttribut) { - return this.attributs.obtenirAttribut(nomAttribut); -} - -Couche.prototype.nbAttributsActives = function(){ - - return this.attributs.nbAttributsActives(); -} - -Couche.prototype.estActive = function(){ - return this.nbAttributsActives() > 0; -} - -/** - * Indique si la couche est à la racine - * @return bool Devrait toujours retourner faux - */ -Couche.prototype.estALaRacine = function(){ - - return this.parent.estArbo(); -} - -Couche.prototype.estCouche = function(){ - return true; -} - -Couche.prototype.estGroupe = function(){ - return false; -} - -Couche.prototype.estArbo = function(){ - return false; -} - -Couche.prototype.obtenirArbo = function(){ - - return this.parent ? this.parent.obtenirArbo() : ''; -} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Groupe.js b/pilotage/public/js/arborescence/Groupe.js deleted file mode 100644 index db1ab37e..00000000 --- a/pilotage/public/js/arborescence/Groupe.js +++ /dev/null @@ -1,533 +0,0 @@ -/** - * Représente un groupe. - */ - -/** - * Classe groupe - * @param string id - * @param string no - * @param string libelle - * @param string url - * @param int ordre - * @param {} attributs - * @returns {Couche} - */ -function Groupe(id, no, libelle, url, ordre, attributs) { - - this.id = 'groupe_' + id; //Identifiant unique du champ - this.no = no; // Ex : tous les groupes Carte de glace ont le même no - this.libelle = $('
    ').html(libelle).text(); - this.url = url; - this.ordre = ordre; - this.enfants = {}; - this.ajouterAttributs(new Attributs(attributs)); -} - -Groupe.prototype.nbEnfants = 0; -Groupe.prototype.parent = ''; //Initialisé lors de Groupe.ajouterGroupe() -Groupe.prototype.attributs = null; -Groupe.prototype.reference = undefined; //référence jQuery -Groupe.prototype._estGroupeDeGroupe = undefined; //Contient des groupes ou des couches - -Groupe.prototype.getClassName = function(){ - return 'Groupe'; -} - -/** - * - * @param Attributs attributs - */ -Groupe.prototype.ajouterAttributs = function(attributs){ - this.attributs = attributs; - this.attributs.parent = this; -} - -Groupe.prototype.init = function(){ - - var arbo = this.obtenirArbo(); - - for(cle in this.enfants){ - this.enfants[cle].init(); - } - - if(arbo.estEnModeEdition()){ - - //S'assurer que l'ordre d'affichage corresponde à ce qu'on a dans la BD - this.trier(); - - this.majEtatOutilsEdition(); - this.majClasse(); - this.rafraichirFleches(); - - //Décaller l'activation du tri pour accélérer l'affichage initial - setTimeout(function(that){ - - //Activer le tri glisser/déposer des enfants de ce groupe - that.obtenirReference().children('ul').sortable({ - placeholder: "ui-state-highlight", - axis:'y', - connectWith:'> ul', - items: "> li:has(.afficher)", - cancel:"> li:not(:has(.afficher))", - cursor:"n-resize", - handle:'.action-deplacer', - update:$.proxy(function(event, ui){ - - this.obtenirArbo().estModifie = true; - this.majOrdre(); - this.trier(); - - }, that) - }); - },0,this); - - } - -} - -/** - * Récupère une référence jQuery sur le groupe - */ -Groupe.prototype.obtenirReference = function(){ - - if(this.reference == undefined){ - this.reference = $(document.getElementById(this.id)); - } - return this.reference; -} - -/** - * Met à jour l'ordre des enfants en se basant sur leur ordre dans le DOM - */ -Groupe.prototype.majOrdre = function(){ - - var arbo = this.obtenirArbo(); - - this.obtenirReference().find(' > ul > li').each($.proxy(Arborescence._majOrdre, arbo)); - -} - -Groupe.prototype.majClasse = function(){ - - var attributVisible = this.obtenirAttribut('visible'); - if(attributVisible && attributVisible.estExclu()){ - this.obtenirReference().addClass('exclu'); - }else{ - this.obtenirReference().removeClass('exclu'); - } -} - -/** - * Indique si le groupe contient des/un groupe - * @returns bool - */ -Groupe.prototype.estGroupeDeGroupe = function(){ - - if(this._estGroupeDeGroupe != undefined){ - return this._estGroupeDeGroupe; - } - - if(this.enfants == 0){ - this._estGroupeDeGroupe = true; - - }else{ - //TODO Vérifier si on peut tester le premier seulement --> [0]... - for(cle in this.enfants){ - this._estGroupeDeGroupe = this.enfants[cle].estGroupe(); - break; - } - } - - return this._estGroupeDeGroupe; - -} - -/** - * Tri les éléments contenus dans le groupe - */ -Groupe.prototype.trier = function(){ - - if(this.estGroupeDeGroupe()){ - this.obtenirArbo().trierGroupes(this); - }else{ - this.obtenirArbo().trierCouches(this); - } -} - -Groupe.prototype.obtenirAttributs = function() { - return this.attributs.attributs; -} - -Groupe.prototype.obtenirAttribut = function(nomAttribut) { - return this.attributs.obtenirAttribut(nomAttribut); -} - -Groupe.prototype.ajouterGroupe = function(groupe) { - - var arbo = this.obtenirArbo(); - - groupe.parent = this; - this.enfants[groupe.id] = groupe; - this.nbEnfants++; - - groupe.ajusterOrdre(); - arbo.groupes.ajouterElement(groupe); - - arbo.ajouterAttributsALaListe(groupe.obtenirAttributs()); - -} - -Groupe.prototype.ajouterCouche = function(couche) { - - var arbo = this.obtenirArbo(); - couche.parent = this; - this.enfants[couche.id] = couche; - this.nbEnfants++; - - couche.ajusterOrdre(); - arbo.couches.ajouterElement(couche); - - arbo.ajouterAttributsALaListe(couche.obtenirAttributs()); - -} - -Groupe.prototype.obtenirLibelle = function(){ - return this.libelle; -} - -Groupe.prototype.definirLibelle = function(libelle){ - var arbo = this.obtenirArbo(); - - this.libelle = libelle; - - var libelleEchappe = $('
    ').text(libelle).html(); - arbo.obtenirReference().find('#GT' + this.no).val(libelleEchappe); - arbo.obtenirReference().find('#libelle_' + this.id).html(libelleEchappe); - -} - -//TODO le contenu de cette fonction devrait peut être aller ailleurs. Le code qui masque est où? -Groupe.prototype.rafraichirFleches = function(){ - - var arbo = this.obtenirArbo(); - var liste = this.obtenirReference().find('> ul > li'); - - //Cacher les flèches des items non activées - liste.children('.masquer.action-monter').hide(); - liste.children('.masquer.action-descendre').hide(); - liste.children('.masquer.action-deplacer').hide(); - - //Afficher la flèche monter de tous les activés, sauf le premier - liste.children('.afficher.action-monter').show().first().hide(); - - //Afficher la flèche descendre de tous les activés, sauf le dernier - liste.children('.afficher.action-descendre').show().last().hide(); - -} - -Groupe.prototype.suivant = function(){ - - var parent = this.parent; - var suivant = false; - - var autre; - for(cle in parent.enfants){ - autre = parent.enfants[cle]; - if(this.ordre < autre.ordre && (!suivant || autre.ordre < suivant.ordre)){ - - suivant = autre; - } - - } - return suivant; -} - -Groupe.prototype.precedant = function(){ - - var parent = this.parent; - var precedant = false; - - var autre; - for(cle in parent.enfants){ - autre = parent.enfants[cle]; - if(this.ordre > autre.ordre && (!precedant || autre.ordre > precedant.ordre)){ - - precedant = autre; - } - - } - return precedant; -} - -Groupe.prototype.echangerOrdre = function(autre){ - - //Échanger l'ordre des deux groupes - var ordre = this.ordre; - this.definirOrdre(autre.ordre); - autre.definirOrdre(ordre); - - this.obtenirArbo().trierGroupes(this.parent); - -} - -Groupe.prototype.definirOrdre = function(ordre){ - this.ordre = ordre; - this.getOrdreInput().val(ordre); -} - -Groupe.prototype.getOrdreInput = function(){ - return $(document.getElementById('GO' + this.no)); - -} - -Groupe.prototype.afficher = function() { - - var arbo = this.obtenirArbo(); - - arbo.ecrire('
  • ' - + ''); - this.afficherAttributs(); - if (this.url) { - - arbo.ecrire(''); - } - arbo.ecrire('' + this.libelle + ''); - if (this.url) { - - arbo.ecrire(''); - } - - if(this.obtenirArbo().estEnModeEdition()){ - - //Icône d'édition - arbo.ecrire(['' - , '' - , '' - , '' - , '' - , ''].join('')); - } - - if (this.nbEnfants > 0) { - arbo.ecrire('
      '); - for (id in this.enfants) { - this.enfants[id].afficher(); - } - arbo.ecrire('
    '); - } - arbo.ecrire('
  • '); -} - -Groupe.prototype.afficherAttributs = function() { - - var attribut, checked, id, title, name; - var arbo = this.obtenirArbo(); - - for (nomAttribut in this.obtenirAttributs()) { - attribut = this.obtenirAttribut(nomAttribut); - checked = ''; - id = this.id + '_' + nomAttribut; - title = attribut.getTitle(); - name = 'G' + attribut.getSeparateur() + this.no; - - if (attribut.estCoche()) { - checked = 'checked'; - } - - arbo.ecrire(['' - , '' - , '' - , '' - , ''].join('')); - - } -} - -/** - * Indique si tous les enfants directs (groupes ou couches) d'un - * groupe sont cochés, complets ou exclus, pour un attribut donné - * @param string nomAttribut Nom de l'attribut à vérifier - */ -Groupe.prototype.enfantsDirectsTousCochesOuCompletOuExclu = function(nomAttribut) { - - if (this.nbEnfants > 0) { - - var element; - var attribut; - for (id in this.enfants) { - - element = this.enfants[id]; - attribut = element.obtenirAttribut(nomAttribut); - - //N'est pas coché ou complet - if (!(attribut.estCoche() || attribut.estComplet() || attribut.estExclu()) ) { - return false; - } - } - } - return true; -} - -Groupe.prototype.auMoinsUnEnfantExclu = function(nomAttribut){ - - if (this.nbEnfants > 0) { - - var element; - var attribut; - for (id in this.enfants) { - - element = this.enfants[id]; - attribut = element.obtenirAttribut(nomAttribut); - - //N'est pas coché ou complet - if (attribut.estExclu()) { - return true; - } - } - } - return false; -} - -/** - * Indique si tous les enfants directs (groupes ou couches) d'un - * groupe sont coché, pour un attribut donné - * @param string nomAttribut Nom de l'attribut à vérifier - */ -Groupe.prototype.enfantCochePartiel = function(nomAttribut) { - - if (this.nbEnfants > 0) { - - var element; - for (id in this.enfants) { - - element = this.enfants[id]; - if (element.obtenirAttribut(nomAttribut).estCoche() || element.obtenirAttribut(nomAttribut).estComplet() || element.obtenirAttribut(nomAttribut).estPartiel()) { - return true; - } - - } - } - return false; -} - -/** - * S'assurer que l'ordre du groupe n'est pas déjà utilisé par un autre - * @returns {undefined} - */ -Groupe.prototype.ajusterOrdre = function(){ - - if(!this.obtenirArbo().estEnModeEdition()){ - return; - } - - if(this.ordre == 0){ - return; - } - - if(this.ordreDejaUtilise()){ - this.ordre = this.ordreMax() + 1; - } - -} - -Groupe.prototype.ordreDejaUtilise = function(){ - - for(cle in this.parent.enfants){ - if(this.ordre == this.parent.enfants[cle]){ - return true; - } - } - return false; -} - -Groupe.prototype.ordreMax = function(){ - - var max = 1; - var enfants = this.parent.enfants; - for(cle in enfants){ - if(enfants[cle].ordre > max){ - max = enfants[cle].ordre; - } - } - return max; -} - -//Indique si le terme est contenu dans l'iten ou dans un des enfants -Groupe.prototype.contientLeTerme = function(terme) { - var contient = indexOfRegExp(this.libelle, terme); - - if (!contient) { - - if (this.nbEnfants > 0) { - - //Vérifier dans les enfants - for (idEnfant in this.enfants) { - contient = this.enfants[idEnfant].contientLeTerme(terme); - - if (contient) { - return contient; - } - } - } - } - - return contient; -} - -/** - * Ajuste l'état des boutons et des inputs lié au groupe ou à la couche de l'attribut -*/ -Groupe.prototype.majEtatOutilsEdition = function(){ - - var arbo = this.obtenirArbo(); - - if(arbo.estEnModeEdition()){ - - var id = this.id; - var activer = this.attributs.nbAttributsActives() > 0; - var item = this.obtenirReference(); - - //Libellé et ordre signifiant "rien" - var libelle = ''; - var ordre = 0; - - if(activer){ - - libelle = $('
    ').text(this.libelle).html(); - ordre = this.ordre; - item.children('.action').addClass('afficher').removeClass('masquer').show(); - }else{ - item.children('.action').addClass('masquer').removeClass('afficher').hide(); - - } - - item.children('#GT' + this.no).val(libelle); - item.children('#GO' + this.no).val(ordre); - - } -} - -Groupe.prototype.estALaRacine = function(){ - - return this.parent.estArbo(); -} - -Groupe.prototype.estCouche = function(){ - return false; -} - -Groupe.prototype.estGroupe = function(){ - return true; -} - -Groupe.prototype.estArbo = function(){ - return false; -} - -/** - * Retourne une référence sur l'arbo qui contient le groupe - */ -Groupe.prototype.obtenirArbo = function(){ - - return this.parent ? this.parent.obtenirArbo() : ''; -} diff --git a/pilotage/public/js/arborescence/ListeElement.js b/pilotage/public/js/arborescence/ListeElement.js deleted file mode 100644 index 605d6da0..00000000 --- a/pilotage/public/js/arborescence/ListeElement.js +++ /dev/null @@ -1,48 +0,0 @@ -function ListeElement(){ - - this.index = []; -} - -//Stocke un élément -ListeElement.prototype.ajouterElement = function(element){ - - var hash; - if(element.getClassName() == "Attribut"){ - hash = this.obtenirHash(element.parent.parent.id); - }else{ - hash = this.obtenirHash(element.id); - } - - if(this.index[hash] == undefined){ - this.index[hash] = []; - } - - this.index[hash].push(element); -} - -//Retourne un élément -ListeElement.prototype.obtenirElement = function(id){ - - var hash = this.index[this.obtenirHash(id)]; - for(ind in hash){ - if(hash[ind].id == id){ - return hash[ind]; - } - } - return false; - -} - -ListeElement.prototype.obtenirHash = function(str){ - var hash = 0; - if (str.length == 0){ - return hash; - } - for (i = 0; i < str.length; i++) { - char = str.charCodeAt(i); - hash = ((hash<<5)-hash)+char; - hash = hash & hash; - } - return hash; - -} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/tree.js b/pilotage/public/js/arborescence/tree.js deleted file mode 100644 index 6a448cff..00000000 --- a/pilotage/public/js/arborescence/tree.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Gère le comportement et l'affichage de l'outil css-treeview. - */ - -/** -* Ouvrir toute l'arboresence -* @returns {undefined} -*/ -function ouvrirArborescence(){ - var terme = $('#terme').val(); - - _ouvrirArborescence(arbo.obtenirElements(), terme); - - return false; - -} - -/** -* -* @param {type} items Items à parcourir -* @param {type} terme Terme à considérer -*/ -function _ouvrirArborescence(items, terme){ - - var item; - for(cle in items){ - item = items[cle]; - if(doitEtreOuvert(item, terme)){ - ouvrirItem(item); - } - //si a des enfants - if(item.nbEnfants > 0){ - _ouvrirArborescence(item.enfants, terme); - } - } -} - -/** -* Ouvrir les items cochés de l'arborescence -*/ -function ouvrirArborescenceCoche(){ - - var items = arbo.obtenirElements(); - _ouvrirArborescenceCoche(items); - -} - -/** -* Ouvrir les items cochés de l'arborescence -* @param {type} items Items à parcourir -*/ -function _ouvrirArborescenceCoche(items){ - - var item; - for(cle in items){ - item = items[cle]; - - //C'est un groupe ou une couche, et l'item est coché ou bien un enfant est coché - if(item.attributs && item.attributs.nbAttributsActives() > 0){ - ouvrirItem(item); - } - - //si a des enfants - if(item.nbEnfants > 0){ - _ouvrirArborescenceCoche(item.enfants); - } - } -} - -/** - * TODO Remplacer par une fonction ouvrirParent() ? - * Ouvre le dossier et ouvre tous les ancêtres - * @param jQuery item Item à ouvrir - */ -function ouvrirItem(item){ - - //TODO Remplacer par item.ouvrir(), soir Couche.ouvrir() et Groupe.ouvrir() ?? - //ouvrir l'item - $('#arborescence input[data-expander-pour-id="' + item.id + '"]').prop('checked', 'checked'); - - if(item.parent && item.parent.estArbo()){ - ouvrirItem(item.parent); - } -} - -/** - * Fermer toute l'arborescence - */ -function fermerArborescence(){ - $('#arborescence .expander').each(function(){ - $(this).prop('checked', false); - }); - -} - -function selectionnerCommun(){ - _selectionnerCommun(arbo.obtenirElements()); - - return false; -} - -function _selectionnerCommun(items){ - var item; - var commune; - for(cle in items){ - item = items[cle]; - commune = item.attributs.obtenirAttribut('commune'); - if(commune && commune.estCoche()){ - selectionnerItem(item); - } - //si a des enfants - if(item.nbEnfants > 0 && item.estGroupe()){ - _selectionnerCommun(item.enfants); - } - } -} - -function selectionnerItem(item){ - //ouvrir l'item - $('#' + item.id + '_visible').click(); - if(item.parent){ - ouvrirItem(item.parent); - } -} - -/** - * Indique si un dossier doit être ouvert - * @param {type} item - * @param {type} terme - * @returns {Boolean} - */ -function doitEtreOuvert(item, terme){ - - //On veut que le texte spécifié soit présent - if(terme){ - - //Indiquer si le texte est présent - return item.contientLeTerme(terme); - - } - - return true; -} - -/** - * Initialise l'affichage et l'état de l'arborescence - * @returns {undefined} - */ -function initComposantesArbo(){ - - //Initialiser l'état pour ceux qui sont déjà coché - $("#ouvrirArborescence").on('click', ouvrirArborescence); - $("#fermerArborescence").on('click', fermerArborescence); - $("#selectionnerCommun").on('click', selectionnerCommun); - $("#terme").on('keypress', function(event){ - if ( event.which == 13 ) { - $("#ouvrirArborescence").click(); - } - - }); - -} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/util.js b/pilotage/public/js/arborescence/util.js deleted file mode 100644 index 062ee0a6..00000000 --- a/pilotage/public/js/arborescence/util.js +++ /dev/null @@ -1,214 +0,0 @@ -function get_html_translation_table(table, quote_style) { - - var entities = {}, - hash_map = {}, - decimal; - var constMappingTable = {}, - constMappingQuoteStyle = {}; - var useTable = {}, - useQuoteStyle = {}; - - // Translate arguments - constMappingTable[0] = 'HTML_SPECIALCHARS'; - constMappingTable[1] = 'HTML_ENTITIES'; - constMappingQuoteStyle[0] = 'ENT_NOQUOTES'; - constMappingQuoteStyle[2] = 'ENT_COMPAT'; - constMappingQuoteStyle[3] = 'ENT_QUOTES'; - - useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS'; - useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : - 'ENT_COMPAT'; - - if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') { - throw new Error('Table: ' + useTable + ' not supported'); - // return false; - } - - entities['38'] = '&'; - if (useTable === 'HTML_ENTITIES') { - entities['160'] = ' '; - entities['161'] = '¡'; - entities['162'] = '¢'; - entities['163'] = '£'; - entities['164'] = '¤'; - entities['165'] = '¥'; - entities['166'] = '¦'; - entities['167'] = '§'; - entities['168'] = '¨'; - entities['169'] = '©'; - entities['170'] = 'ª'; - entities['171'] = '«'; - entities['172'] = '¬'; - entities['173'] = '­'; - entities['174'] = '®'; - entities['175'] = '¯'; - entities['176'] = '°'; - entities['177'] = '±'; - entities['178'] = '²'; - entities['179'] = '³'; - entities['180'] = '´'; - entities['181'] = 'µ'; - entities['182'] = '¶'; - entities['183'] = '·'; - entities['184'] = '¸'; - entities['185'] = '¹'; - entities['186'] = 'º'; - entities['187'] = '»'; - entities['188'] = '¼'; - entities['189'] = '½'; - entities['190'] = '¾'; - entities['191'] = '¿'; - entities['192'] = 'À'; - entities['193'] = 'Á'; - entities['194'] = 'Â'; - entities['195'] = 'Ã'; - entities['196'] = 'Ä'; - entities['197'] = 'Å'; - entities['198'] = 'Æ'; - entities['199'] = 'Ç'; - entities['200'] = 'È'; - entities['201'] = 'É'; - entities['202'] = 'Ê'; - entities['203'] = 'Ë'; - entities['204'] = 'Ì'; - entities['205'] = 'Í'; - entities['206'] = 'Î'; - entities['207'] = 'Ï'; - entities['208'] = 'Ð'; - entities['209'] = 'Ñ'; - entities['210'] = 'Ò'; - entities['211'] = 'Ó'; - entities['212'] = 'Ô'; - entities['213'] = 'Õ'; - entities['214'] = 'Ö'; - entities['215'] = '×'; - entities['216'] = 'Ø'; - entities['217'] = 'Ù'; - entities['218'] = 'Ú'; - entities['219'] = 'Û'; - entities['220'] = 'Ü'; - entities['221'] = 'Ý'; - entities['222'] = 'Þ'; - entities['223'] = 'ß'; - entities['224'] = 'à'; - entities['225'] = 'á'; - entities['226'] = 'â'; - entities['227'] = 'ã'; - entities['228'] = 'ä'; - entities['229'] = 'å'; - entities['230'] = 'æ'; - entities['231'] = 'ç'; - entities['232'] = 'è'; - entities['233'] = 'é'; - entities['234'] = 'ê'; - entities['235'] = 'ë'; - entities['236'] = 'ì'; - entities['237'] = 'í'; - entities['238'] = 'î'; - entities['239'] = 'ï'; - entities['240'] = 'ð'; - entities['241'] = 'ñ'; - entities['242'] = 'ò'; - entities['243'] = 'ó'; - entities['244'] = 'ô'; - entities['245'] = 'õ'; - entities['246'] = 'ö'; - entities['247'] = '÷'; - entities['248'] = 'ø'; - entities['249'] = 'ù'; - entities['250'] = 'ú'; - entities['251'] = 'û'; - entities['252'] = 'ü'; - entities['253'] = 'ý'; - entities['254'] = 'þ'; - entities['255'] = 'ÿ'; - } - - if (useQuoteStyle !== 'ENT_NOQUOTES') { - entities['34'] = '"'; - } - if (useQuoteStyle === 'ENT_QUOTES') { - entities['39'] = '''; - } - entities['60'] = '<'; - entities['62'] = '>'; - - // ascii decimals to real symbols - for (decimal in entities) { - if (entities.hasOwnProperty(decimal)) { - hash_map[String.fromCharCode(decimal)] = entities[decimal]; - } - } - - return hash_map; -} - - -function html_entity_decode(string, quote_style) { - - var hash_map = {}, - symbol = '', - tmp_str = '', - entity = ''; - tmp_str = string.toString(); - - if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) { - return false; - } - - // fix & problem - // http://phpjs.org/functions/get_html_translation_table:416#comment_97660 - delete(hash_map['&']); - hash_map['&'] = '&'; - - for (symbol in hash_map) { - entity = hash_map[symbol]; - tmp_str = tmp_str.split(entity) - .join(symbol); - } - tmp_str = tmp_str.split(''') - .join("'"); - - return tmp_str; -} - - -var removeDiacritics = (function() { - var diacritics = {"\u24B6": "A", "\uFF21": "A", "\u00C0": "A", "\u00C1": "A", "\u00C2": "A", "\u1EA6": "A", "\u1EA4": "A", "\u1EAA": "A", "\u1EA8": "A", "\u00C3": "A", "\u0100": "A", "\u0102": "A", "\u1EB0": "A", "\u1EAE": "A", "\u1EB4": "A", "\u1EB2": "A", "\u0226": "A", "\u01E0": "A", "\u00C4": "A", "\u01DE": "A", "\u1EA2": "A", "\u00C5": "A", "\u01FA": "A", "\u01CD": "A", "\u0200": "A", "\u0202": "A", "\u1EA0": "A", "\u1EAC": "A", "\u1EB6": "A", "\u1E00": "A", "\u0104": "A", "\u023A": "A", "\u2C6F": "A", "\uA732": "AA", "\u00C6": "AE", "\u01FC": "AE", "\u01E2": "AE", "\uA734": "AO", "\uA736": "AU", "\uA738": "AV", "\uA73A": "AV", "\uA73C": "AY", "\u24B7": "B", "\uFF22": "B", "\u1E02": "B", "\u1E04": "B", "\u1E06": "B", "\u0243": "B", "\u0182": "B", "\u0181": "B", "\u24B8": "C", "\uFF23": "C", "\u0106": "C", "\u0108": "C", "\u010A": "C", "\u010C": "C", "\u00C7": "C", "\u1E08": "C", "\u0187": "C", "\u023B": "C", "\uA73E": "C", "\u24B9": "D", "\uFF24": "D", "\u1E0A": "D", "\u010E": "D", "\u1E0C": "D", "\u1E10": "D", "\u1E12": "D", "\u1E0E": "D", "\u0110": "D", "\u018B": "D", "\u018A": "D", "\u0189": "D", "\uA779": "D", "\u01F1": "DZ", "\u01C4": "DZ", "\u01F2": "Dz", "\u01C5": "Dz", "\u24BA": "E", "\uFF25": "E", "\u00C8": "E", "\u00C9": "E", "\u00CA": "E", "\u1EC0": "E", "\u1EBE": "E", "\u1EC4": "E", "\u1EC2": "E", "\u1EBC": "E", "\u0112": "E", "\u1E14": "E", "\u1E16": "E", "\u0114": "E", "\u0116": "E", "\u00CB": "E", "\u1EBA": "E", "\u011A": "E", "\u0204": "E", "\u0206": "E", "\u1EB8": "E", "\u1EC6": "E", "\u0228": "E", "\u1E1C": "E", "\u0118": "E", "\u1E18": "E", "\u1E1A": "E", "\u0190": "E", "\u018E": "E", "\u24BB": "F", "\uFF26": "F", "\u1E1E": "F", "\u0191": "F", "\uA77B": "F", "\u24BC": "G", "\uFF27": "G", "\u01F4": "G", "\u011C": "G", "\u1E20": "G", "\u011E": "G", "\u0120": "G", "\u01E6": "G", "\u0122": "G", "\u01E4": "G", "\u0193": "G", "\uA7A0": "G", "\uA77D": "G", "\uA77E": "G", "\u24BD": "H", "\uFF28": "H", "\u0124": "H", "\u1E22": "H", "\u1E26": "H", "\u021E": "H", "\u1E24": "H", "\u1E28": "H", "\u1E2A": "H", "\u0126": "H", "\u2C67": "H", "\u2C75": "H", "\uA78D": "H", "\u24BE": "I", "\uFF29": "I", "\u00CC": "I", "\u00CD": "I", "\u00CE": "I", "\u0128": "I", "\u012A": "I", "\u012C": "I", "\u0130": "I", "\u00CF": "I", "\u1E2E": "I", "\u1EC8": "I", "\u01CF": "I", "\u0208": "I", "\u020A": "I", "\u1ECA": "I", "\u012E": "I", "\u1E2C": "I", "\u0197": "I", "\u24BF": "J", "\uFF2A": "J", "\u0134": "J", "\u0248": "J", "\u24C0": "K", "\uFF2B": "K", "\u1E30": "K", "\u01E8": "K", "\u1E32": "K", "\u0136": "K", "\u1E34": "K", "\u0198": "K", "\u2C69": "K", "\uA740": "K", "\uA742": "K", "\uA744": "K", "\uA7A2": "K", "\u24C1": "L", "\uFF2C": "L", "\u013F": "L", "\u0139": "L", "\u013D": "L", "\u1E36": "L", "\u1E38": "L", "\u013B": "L", "\u1E3C": "L", "\u1E3A": "L", "\u0141": "L", "\u023D": "L", "\u2C62": "L", "\u2C60": "L", "\uA748": "L", "\uA746": "L", "\uA780": "L", "\u01C7": "LJ", "\u01C8": "Lj", "\u24C2": "M", "\uFF2D": "M", "\u1E3E": "M", "\u1E40": "M", "\u1E42": "M", "\u2C6E": "M", "\u019C": "M", "\u24C3": "N", "\uFF2E": "N", "\u01F8": "N", "\u0143": "N", "\u00D1": "N", "\u1E44": "N", "\u0147": "N", "\u1E46": "N", "\u0145": "N", "\u1E4A": "N", "\u1E48": "N", "\u0220": "N", "\u019D": "N", "\uA790": "N", "\uA7A4": "N", "\u01CA": "NJ", "\u01CB": "Nj", "\u24C4": "O", "\uFF2F": "O", "\u00D2": "O", "\u00D3": "O", "\u00D4": "O", "\u1ED2": "O", "\u1ED0": "O", "\u1ED6": "O", "\u1ED4": "O", "\u00D5": "O", "\u1E4C": "O", "\u022C": "O", "\u1E4E": "O", "\u014C": "O", "\u1E50": "O", "\u1E52": "O", "\u014E": "O", "\u022E": "O", "\u0230": "O", "\u00D6": "O", "\u022A": "O", "\u1ECE": "O", "\u0150": "O", "\u01D1": "O", "\u020C": "O", "\u020E": "O", "\u01A0": "O", "\u1EDC": "O", "\u1EDA": "O", "\u1EE0": "O", "\u1EDE": "O", "\u1EE2": "O", "\u1ECC": "O", "\u1ED8": "O", "\u01EA": "O", "\u01EC": "O", "\u00D8": "O", "\u01FE": "O", "\u0186": "O", "\u019F": "O", "\uA74A": "O", "\uA74C": "O", "\u0152": "OE", "\u01A2": "OI", "\uA74E": "OO", "\u0222": "OU", "\u24C5": "P", "\uFF30": "P", "\u1E54": "P", "\u1E56": "P", "\u01A4": "P", "\u2C63": "P", "\uA750": "P", "\uA752": "P", "\uA754": "P", "\u24C6": "Q", "\uFF31": "Q", "\uA756": "Q", "\uA758": "Q", "\u024A": "Q", "\u24C7": "R", "\uFF32": "R", "\u0154": "R", "\u1E58": "R", "\u0158": "R", "\u0210": "R", "\u0212": "R", "\u1E5A": "R", "\u1E5C": "R", "\u0156": "R", "\u1E5E": "R", "\u024C": "R", "\u2C64": "R", "\uA75A": "R", "\uA7A6": "R", "\uA782": "R", "\u24C8": "S", "\uFF33": "S", "\u015A": "S", "\u1E64": "S", "\u015C": "S", "\u1E60": "S", "\u0160": "S", "\u1E66": "S", "\u1E62": "S", "\u1E68": "S", "\u0218": "S", "\u015E": "S", "\u2C7E": "S", "\uA7A8": "S", "\uA784": "S", "\u1E9E": "SS", "\u24C9": "T", "\uFF34": "T", "\u1E6A": "T", "\u0164": "T", "\u1E6C": "T", "\u021A": "T", "\u0162": "T", "\u1E70": "T", "\u1E6E": "T", "\u0166": "T", "\u01AC": "T", "\u01AE": "T", "\u023E": "T", "\uA786": "T", "\uA728": "TZ", "\u24CA": "U", "\uFF35": "U", "\u00D9": "U", "\u00DA": "U", "\u00DB": "U", "\u0168": "U", "\u1E78": "U", "\u016A": "U", "\u1E7A": "U", "\u016C": "U", "\u00DC": "U", "\u01DB": "U", "\u01D7": "U", "\u01D5": "U", "\u01D9": "U", "\u1EE6": "U", "\u016E": "U", "\u0170": "U", "\u01D3": "U", "\u0214": "U", "\u0216": "U", "\u01AF": "U", "\u1EEA": "U", "\u1EE8": "U", "\u1EEE": "U", "\u1EEC": "U", "\u1EF0": "U", "\u1EE4": "U", "\u1E72": "U", "\u0172": "U", "\u1E76": "U", "\u1E74": "U", "\u0244": "U", "\u24CB": "V", "\uFF36": "V", "\u1E7C": "V", "\u1E7E": "V", "\u01B2": "V", "\uA75E": "V", "\u0245": "V", "\uA760": "VY", "\u24CC": "W", "\uFF37": "W", "\u1E80": "W", "\u1E82": "W", "\u0174": "W", "\u1E86": "W", "\u1E84": "W", "\u1E88": "W", "\u2C72": "W", "\u24CD": "X", "\uFF38": "X", "\u1E8A": "X", "\u1E8C": "X", "\u24CE": "Y", "\uFF39": "Y", "\u1EF2": "Y", "\u00DD": "Y", "\u0176": "Y", "\u1EF8": "Y", "\u0232": "Y", "\u1E8E": "Y", "\u0178": "Y", "\u1EF6": "Y", "\u1EF4": "Y", "\u01B3": "Y", "\u024E": "Y", "\u1EFE": "Y", "\u24CF": "Z", "\uFF3A": "Z", "\u0179": "Z", "\u1E90": "Z", "\u017B": "Z", "\u017D": "Z", "\u1E92": "Z", "\u1E94": "Z", "\u01B5": "Z", "\u0224": "Z", "\u2C7F": "Z", "\u2C6B": "Z", "\uA762": "Z", "\u24D0": "a", "\uFF41": "a", "\u1E9A": "a", "\u00E0": "a", "\u00E1": "a", "\u00E2": "a", "\u1EA7": "a", "\u1EA5": "a", "\u1EAB": "a", "\u1EA9": "a", "\u00E3": "a", "\u0101": "a", "\u0103": "a", "\u1EB1": "a", "\u1EAF": "a", "\u1EB5": "a", "\u1EB3": "a", "\u0227": "a", "\u01E1": "a", "\u00E4": "a", "\u01DF": "a", "\u1EA3": "a", "\u00E5": "a", "\u01FB": "a", "\u01CE": "a", "\u0201": "a", "\u0203": "a", "\u1EA1": "a", "\u1EAD": "a", "\u1EB7": "a", "\u1E01": "a", "\u0105": "a", "\u2C65": "a", "\u0250": "a", "\uA733": "aa", "\u00E6": "ae", "\u01FD": "ae", "\u01E3": "ae", "\uA735": "ao", "\uA737": "au", "\uA739": "av", "\uA73B": "av", "\uA73D": "ay", "\u24D1": "b", "\uFF42": "b", "\u1E03": "b", "\u1E05": "b", "\u1E07": "b", "\u0180": "b", "\u0183": "b", "\u0253": "b", "\u24D2": "c", "\uFF43": "c", "\u0107": "c", "\u0109": "c", "\u010B": "c", "\u010D": "c", "\u00E7": "c", "\u1E09": "c", "\u0188": "c", "\u023C": "c", "\uA73F": "c", "\u2184": "c", "\u24D3": "d", "\uFF44": "d", "\u1E0B": "d", "\u010F": "d", "\u1E0D": "d", "\u1E11": "d", "\u1E13": "d", "\u1E0F": "d", "\u0111": "d", "\u018C": "d", "\u0256": "d", "\u0257": "d", "\uA77A": "d", "\u01F3": "dz", "\u01C6": "dz", "\u24D4": "e", "\uFF45": "e", "\u00E8": "e", "\u00E9": "e", "\u00EA": "e", "\u1EC1": "e", "\u1EBF": "e", "\u1EC5": "e", "\u1EC3": "e", "\u1EBD": "e", "\u0113": "e", "\u1E15": "e", "\u1E17": "e", "\u0115": "e", "\u0117": "e", "\u00EB": "e", "\u1EBB": "e", "\u011B": "e", "\u0205": "e", "\u0207": "e", "\u1EB9": "e", "\u1EC7": "e", "\u0229": "e", "\u1E1D": "e", "\u0119": "e", "\u1E19": "e", "\u1E1B": "e", "\u0247": "e", "\u025B": "e", "\u01DD": "e", "\u24D5": "f", "\uFF46": "f", "\u1E1F": "f", "\u0192": "f", "\uA77C": "f", "\u24D6": "g", "\uFF47": "g", "\u01F5": "g", "\u011D": "g", "\u1E21": "g", "\u011F": "g", "\u0121": "g", "\u01E7": "g", "\u0123": "g", "\u01E5": "g", "\u0260": "g", "\uA7A1": "g", "\u1D79": "g", "\uA77F": "g", "\u24D7": "h", "\uFF48": "h", "\u0125": "h", "\u1E23": "h", "\u1E27": "h", "\u021F": "h", "\u1E25": "h", "\u1E29": "h", "\u1E2B": "h", "\u1E96": "h", "\u0127": "h", "\u2C68": "h", "\u2C76": "h", "\u0265": "h", "\u0195": "hv", "\u24D8": "i", "\uFF49": "i", "\u00EC": "i", "\u00ED": "i", "\u00EE": "i", "\u0129": "i", "\u012B": "i", "\u012D": "i", "\u00EF": "i", "\u1E2F": "i", "\u1EC9": "i", "\u01D0": "i", "\u0209": "i", "\u020B": "i", "\u1ECB": "i", "\u012F": "i", "\u1E2D": "i", "\u0268": "i", "\u0131": "i", "\u24D9": "j", "\uFF4A": "j", "\u0135": "j", "\u01F0": "j", "\u0249": "j", "\u24DA": "k", "\uFF4B": "k", "\u1E31": "k", "\u01E9": "k", "\u1E33": "k", "\u0137": "k", "\u1E35": "k", "\u0199": "k", "\u2C6A": "k", "\uA741": "k", "\uA743": "k", "\uA745": "k", "\uA7A3": "k", "\u24DB": "l", "\uFF4C": "l", "\u0140": "l", "\u013A": "l", "\u013E": "l", "\u1E37": "l", "\u1E39": "l", "\u013C": "l", "\u1E3D": "l", "\u1E3B": "l", "\u0142": "l", "\u019A": "l", "\u026B": "l", "\u2C61": "l", "\uA749": "l", "\uA781": "l", "\uA747": "l", "\u01C9": "lj", "\u24DC": "m", "\uFF4D": "m", "\u1E3F": "m", "\u1E41": "m", "\u1E43": "m", "\u0271": "m", "\u026F": "m", "\u24DD": "n", "\uFF4E": "n", "\u01F9": "n", "\u0144": "n", "\u00F1": "n", "\u1E45": "n", "\u0148": "n", "\u1E47": "n", "\u0146": "n", "\u1E4B": "n", "\u1E49": "n", "\u019E": "n", "\u0272": "n", "\u0149": "n", "\uA791": "n", "\uA7A5": "n", "\u01CC": "nj", "\u24DE": "o", "\uFF4F": "o", "\u00F2": "o", "\u00F3": "o", "\u00F4": "o", "\u1ED3": "o", "\u1ED1": "o", "\u1ED7": "o", "\u1ED5": "o", "\u00F5": "o", "\u1E4D": "o", "\u022D": "o", "\u1E4F": "o", "\u014D": "o", "\u1E51": "o", "\u1E53": "o", "\u014F": "o", "\u022F": "o", "\u0231": "o", "\u00F6": "o", "\u022B": "o", "\u1ECF": "o", "\u0151": "o", "\u01D2": "o", "\u020D": "o", "\u020F": "o", "\u01A1": "o", "\u1EDD": "o", "\u1EDB": "o", "\u1EE1": "o", "\u1EDF": "o", "\u1EE3": "o", "\u1ECD": "o", "\u1ED9": "o", "\u01EB": "o", "\u01ED": "o", "\u00F8": "o", "\u01FF": "o", "\u0254": "o", "\uA74B": "o", "\uA74D": "o", "\u0275": "o", "\u0153": "oe", "\u0276": "oe", "\u01A3": "oi", "\u0223": "ou", "\uA74F": "oo", "\u24DF": "p", "\uFF50": "p", "\u1E55": "p", "\u1E57": "p", "\u01A5": "p", "\u1D7D": "p", "\uA751": "p", "\uA753": "p", "\uA755": "p", "\u24E0": "q", "\uFF51": "q", "\u024B": "q", "\uA757": "q", "\uA759": "q", "\u24E1": "r", "\uFF52": "r", "\u0155": "r", "\u1E59": "r", "\u0159": "r", "\u0211": "r", "\u0213": "r", "\u1E5B": "r", "\u1E5D": "r", "\u0157": "r", "\u1E5F": "r", "\u024D": "r", "\u027D": "r", "\uA75B": "r", "\uA7A7": "r", "\uA783": "r", "\u24E2": "s", "\uFF53": "s", "\u015B": "s", "\u1E65": "s", "\u015D": "s", "\u1E61": "s", "\u0161": "s", "\u1E67": "s", "\u1E63": "s", "\u1E69": "s", "\u0219": "s", "\u015F": "s", "\u023F": "s", "\uA7A9": "s", "\uA785": "s", "\u017F": "s", "\u1E9B": "s", "\u00DF": "ss", "\u24E3": "t", "\uFF54": "t", "\u1E6B": "t", "\u1E97": "t", "\u0165": "t", "\u1E6D": "t", "\u021B": "t", "\u0163": "t", "\u1E71": "t", "\u1E6F": "t", "\u0167": "t", "\u01AD": "t", "\u0288": "t", "\u2C66": "t", "\uA787": "t", "\uA729": "tz", "\u24E4": "u", "\uFF55": "u", "\u00F9": "u", "\u00FA": "u", "\u00FB": "u", "\u0169": "u", "\u1E79": "u", "\u016B": "u", "\u1E7B": "u", "\u016D": "u", "\u00FC": "u", "\u01DC": "u", "\u01D8": "u", "\u01D6": "u", "\u01DA": "u", "\u1EE7": "u", "\u016F": "u", "\u0171": "u", "\u01D4": "u", "\u0215": "u", "\u0217": "u", "\u01B0": "u", "\u1EEB": "u", "\u1EE9": "u", "\u1EEF": "u", "\u1EED": "u", "\u1EF1": "u", "\u1EE5": "u", "\u1E73": "u", "\u0173": "u", "\u1E77": "u", "\u1E75": "u", "\u0289": "u", "\u24E5": "v", "\uFF56": "v", "\u1E7D": "v", "\u1E7F": "v", "\u028B": "v", "\uA75F": "v", "\u028C": "v", "\uA761": "vy", "\u24E6": "w", "\uFF57": "w", "\u1E81": "w", "\u1E83": "w", "\u0175": "w", "\u1E87": "w", "\u1E85": "w", "\u1E98": "w", "\u1E89": "w", "\u2C73": "w", "\u24E7": "x", "\uFF58": "x", "\u1E8B": "x", "\u1E8D": "x", "\u24E8": "y", "\uFF59": "y", "\u1EF3": "y", "\u00FD": "y", "\u0177": "y", "\u1EF9": "y", "\u0233": "y", "\u1E8F": "y", "\u00FF": "y", "\u1EF7": "y", "\u1E99": "y", "\u1EF5": "y", "\u01B4": "y", "\u024F": "y", "\u1EFF": "y", "\u24E9": "z", "\uFF5A": "z", "\u017A": "z", "\u1E91": "z", "\u017C": "z", "\u017E": "z", "\u1E93": "z", "\u1E95": "z", "\u01B6": "z", "\u0225": "z", "\u0240": "z", "\u2C6C": "z", "\uA763": "z", "\uFF10": "0", "\u2080": "0", "\u24EA": "0", "\u2070": "0", "\u00B9": "1", "\u2474": "1", "\u2081": "1", "\u2776": "1", "\u24F5": "1", "\u2488": "1", "\u2460": "1", "\uFF11": "1", "\u00B2": "2", "\u2777": "2", "\u2475": "2", "\uFF12": "2", "\u2082": "2", "\u24F6": "2", "\u2461": "2", "\u2489": "2", "\u00B3": "3", "\uFF13": "3", "\u248A": "3", "\u2476": "3", "\u2083": "3", "\u2778": "3", "\u24F7": "3", "\u2462": "3", "\u24F8": "4", "\u2463": "4", "\u248B": "4", "\uFF14": "4", "\u2074": "4", "\u2084": "4", "\u2779": "4", "\u2477": "4", "\u248C": "5", "\u2085": "5", "\u24F9": "5", "\u2478": "5", "\u277A": "5", "\u2464": "5", "\uFF15": "5", "\u2075": "5", "\u2479": "6", "\u2076": "6", "\uFF16": "6", "\u277B": "6", "\u2086": "6", "\u2465": "6", "\u24FA": "6", "\u248D": "6", "\uFF17": "7", "\u2077": "7", "\u277C": "7", "\u24FB": "7", "\u248E": "7", "\u2087": "7", "\u247A": "7", "\u2466": "7", "\u2467": "8", "\u248F": "8", "\u24FC": "8", "\u247B": "8", "\u2078": "8", "\uFF18": "8", "\u277D": "8", "\u2088": "8", "\u24FD": "9", "\uFF19": "9", "\u2490": "9", "\u277E": "9", "\u247C": "9", "\u2089": "9", "\u2468": "9", "\u2079": "9"}; - return function(str) { - var chars = str.split(''), - i = chars.length - 1, - alter = false, - ch; - for (; i >= 0; i--) { - ch = chars[i]; - if (diacritics.hasOwnProperty(ch)) { - chars[i] = diacritics[ch]; - alter = true; - } - } - if (alter) { - str = chars.join(''); - } - return str; - } -})(); - - - -function indexOfRegExp(chaine, cherche) { - - //Récupérer la version sans entitées html du texte - chaine = html_entity_decode(chaine, ''); - - //Enlever les accents - cherche = removeDiacritics(cherche); - chaine = removeDiacritics(chaine); - - //Échapper les caractères spéciaux dans l'expression régulière - cherche = cherche.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - cherche = cherche.replace(/\$/g, '$$$$'); - - var regExp = new RegExp(cherche, 'i'); - return chaine.match(regExp); -} \ No newline at end of file diff --git a/pilotage/public/js/bootstrap-datetimepicker.fr.js b/pilotage/public/js/bootstrap-datetimepicker.fr.js deleted file mode 100644 index ccb27186..00000000 --- a/pilotage/public/js/bootstrap-datetimepicker.fr.js +++ /dev/null @@ -1,56 +0,0 @@ -(function (factory) { - if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else if (typeof exports === 'object') { - module.exports = factory(require('../moment')); // Node - } else { - factory(window.moment); // Browser global - } -}(function (moment) { - return moment.lang('fr', { - months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), - monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), - weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), - weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), - weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), - longDateFormat : { - LT : "HH:mm", - L : "DD/MM/YYYY", - LL : "D MMMM YYYY", - LLL : "D MMMM YYYY LT", - LLLL : "dddd D MMMM YYYY LT" - }, - calendar : { - sameDay: "[Aujourd'hui à] LT", - nextDay: '[Demain à] LT', - nextWeek: 'dddd [à] LT', - lastDay: '[Hier à] LT', - lastWeek: 'dddd [dernier à] LT', - sameElse: 'L' - }, - relativeTime : { - future : "dans %s", - past : "il y a %s", - s : "quelques secondes", - m : "une minute", - mm : "%d minutes", - h : "une heure", - hh : "%d heures", - d : "un jour", - dd : "%d jours", - M : "un mois", - MM : "%d mois", - y : "un an", - yy : "%d ans" - }, - ordinal : function (number) { - return number + (number === 1 ? 'er' : ''); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); -})); - - diff --git a/pilotage/public/js/bootstrap-datetimepicker.js b/pilotage/public/js/bootstrap-datetimepicker.js deleted file mode 100644 index ba247570..00000000 --- a/pilotage/public/js/bootstrap-datetimepicker.js +++ /dev/null @@ -1,1166 +0,0 @@ -/* -Version 3.0.0 -========================================================= -bootstrap-datetimepicker.js -https://github.com/Eonasdan/bootstrap-datetimepicker -========================================================= -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Peterson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -; (function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD is used - Register as an anonymous module. - define(['jquery', 'moment'], factory); - } else { - // AMD is not used - Attempt to fetch dependencies from scope. - if (!jQuery) { - throw 'bootstrap-datetimepicker requires jQuery to be loaded first'; - } else if (!moment) { - throw 'bootstrap-datetimepicker requires moment.js to be loaded first'; - } else { - factory(jQuery, moment); - } - } -} - -(function ($, moment) { - if (typeof moment === 'undefined') { - alert("momentjs is requried"); - throw new Error('momentjs is required'); - }; - - var dpgId = 0, - - pMoment = moment, - -// ReSharper disable once InconsistentNaming - DateTimePicker = function (element, options) { - var defaults = { - pickDate: true, - pickTime: true, - useMinutes: true, - useSeconds: false, - useCurrent: true, - minuteStepping: 1, - minDate: new pMoment({ y: 1900 }), - maxDate: new pMoment().add(100, "y"), - showToday: true, - collapse: true, - language: "en", - defaultDate: "", - disabledDates: false, - enabledDates: false, - icons: {}, - useStrict: false, - direction: "auto", - sideBySide: false, - daysOfWeekDisabled: false - }, - - icons = { - time: 'glyphicon glyphicon-time', - date: 'glyphicon glyphicon-calendar', - up: 'glyphicon glyphicon-chevron-up', - down: 'glyphicon glyphicon-chevron-down' - }, - - picker = this, - - init = function () { - - var icon = false, i, dDate, longDateFormat; - picker.options = $.extend({}, defaults, options); - picker.options.icons = $.extend({}, icons, picker.options.icons); - - picker.element = $(element); - - dataToOptions(); - - if (!(picker.options.pickTime || picker.options.pickDate)) - throw new Error('Must choose at least one picker'); - - picker.id = dpgId++; - pMoment.lang(picker.options.language); - picker.date = pMoment(); - picker.unset = false; - picker.isInput = picker.element.is('input'); - picker.component = false; - - if (picker.element.hasClass('input-group')) { - if (picker.element.find('.datepickerbutton').size() == 0) {//in case there is more then one 'input-group-addon' Issue #48 - picker.component = picker.element.find("[class^='input-group-']"); - } - else { - picker.component = picker.element.find('.datepickerbutton'); - } - } - picker.format = picker.options.format; - - longDateFormat = pMoment()._lang._longDateFormat; - - if (!picker.format) { - picker.format = (picker.options.pickDate ? longDateFormat.L : ''); - if (picker.options.pickDate && picker.options.pickTime) picker.format += ' '; - picker.format += (picker.options.pickTime ? longDateFormat.LT : ''); - if (picker.options.useSeconds) { - if (~longDateFormat.LT.indexOf(' A')) { - picker.format = picker.format.split(" A")[0] + ":ss A"; - } - else { - picker.format += ':ss'; - } - } - } - picker.use24hours = picker.format.toLowerCase().indexOf("a") < 1; - - if (picker.component) icon = picker.component.find('span'); - - if (picker.options.pickTime) { - if (icon) icon.addClass(picker.options.icons.time); - } - if (picker.options.pickDate) { - if (icon) { - icon.removeClass(picker.options.icons.time); - icon.addClass(picker.options.icons.date); - } - } - - picker.widget = $(getTemplate()).appendTo('body'); - - if (picker.options.useSeconds && !picker.use24hours) { - picker.widget.width(300); - } - - picker.minViewMode = picker.options.minViewMode || 0; - if (typeof picker.minViewMode === 'string') { - switch (picker.minViewMode) { - case 'months': - picker.minViewMode = 1; - break; - case 'years': - picker.minViewMode = 2; - break; - default: - picker.minViewMode = 0; - break; - } - } - picker.viewMode = picker.options.viewMode || 0; - if (typeof picker.viewMode === 'string') { - switch (picker.viewMode) { - case 'months': - picker.viewMode = 1; - break; - case 'years': - picker.viewMode = 2; - break; - default: - picker.viewMode = 0; - break; - } - } - - picker.options.disabledDates = indexGivenDates(picker.options.disabledDates); - picker.options.enabledDates = indexGivenDates(picker.options.enabledDates); - - picker.startViewMode = picker.viewMode; - picker.setMinDate(picker.options.minDate); - picker.setMaxDate(picker.options.maxDate); - fillDow(); - fillMonths(); - fillHours(); - fillMinutes(); - fillSeconds(); - update(); - showMode(); - attachDatePickerEvents(); - if (picker.options.defaultDate !== "" && getPickerInput().val() == "") picker.setValue(picker.options.defaultDate); - if (picker.options.minuteStepping !== 1) { - var rInterval = picker.options.minuteStepping; - picker.date.minutes((Math.round(picker.date.minutes() / rInterval) * rInterval) % 60).seconds(0); - } - }, - - getPickerInput = function () { - if (picker.isInput) { - return picker.element; - } else { - return dateStr = picker.element.find('input'); - } - }, - - dataToOptions = function () { - var eData - if (picker.element.is('input')) { - eData = picker.element.data(); - } - else { - eData = picker.element.data(); - } - if (eData.dateFormat !== undefined) picker.options.format = eData.dateFormat; - if (eData.datePickdate !== undefined) picker.options.pickDate = eData.datePickdate; - if (eData.datePicktime !== undefined) picker.options.pickTime = eData.datePicktime; - if (eData.dateUseminutes !== undefined) picker.options.useMinutes = eData.dateUseminutes; - if (eData.dateUseseconds !== undefined) picker.options.useSeconds = eData.dateUseseconds; - if (eData.dateUsecurrent !== undefined) picker.options.useCurrent = eData.dateUsecurrent; - if (eData.dateMinutestepping !== undefined) picker.options.minuteStepping = eData.dateMinutestepping; - if (eData.dateMindate !== undefined) picker.options.minDate = eData.dateMindate; - if (eData.dateMaxdate !== undefined) picker.options.maxDate = eData.dateMaxdate; - if (eData.dateShowtoday !== undefined) picker.options.showToday = eData.dateShowtoday; - if (eData.dateCollapse !== undefined) picker.options.collapse = eData.dateCollapse; - if (eData.dateLanguage !== undefined) picker.options.language = eData.dateLanguage; - if (eData.dateDefaultdate !== undefined) picker.options.defaultDate = eData.dateDefaultdate; - if (eData.dateDisableddates !== undefined) picker.options.disabledDates = eData.dateDisableddates; - if (eData.dateEnableddates !== undefined) picker.options.enabledDates = eData.dateEnableddates; - if (eData.dateIcons !== undefined) picker.options.icons = eData.dateIcons; - if (eData.dateUsestrict !== undefined) picker.options.useStrict = eData.dateUsestrict; - if (eData.dateDirection !== undefined) picker.options.direction = eData.dateDirection; - if (eData.dateSidebyside !== undefined) picker.options.sideBySide = eData.dateSidebyside; - }, - - place = function () { - var position = 'absolute', - offset = picker.component ? picker.component.offset() : picker.element.offset(), $window = $(window); - picker.width = picker.component ? picker.component.outerWidth() : picker.element.outerWidth(); - offset.top = offset.top + picker.element.outerHeight(); - - var placePosition; - if (picker.options.direction === 'up') { - placePosition = 'top' - } else if (picker.options.direction === 'bottom') { - placePosition = 'bottom' - } else if (picker.options.direction === 'auto') { - if (offset.top + picker.widget.height() > $window.height() + $window.scrollTop() && picker.widget.height() + picker.element.outerHeight() < offset.top) { - placePosition = 'top'; - } else { - placePosition = 'bottom'; - } - }; - if (placePosition === 'top') { - offset.top -= picker.widget.height() + picker.element.outerHeight() + 15; - picker.widget.addClass('top').removeClass('bottom'); - } else { - offset.top += 1; - picker.widget.addClass('bottom').removeClass('top'); - } - - if (picker.options.width !== undefined) { - picker.widget.width(picker.options.width); - } - - if (picker.options.orientation === 'left') { - picker.widget.addClass('left-oriented'); - offset.left = offset.left - picker.widget.width() + 20; - } - - if (isInFixed()) { - position = 'fixed'; - offset.top -= $window.scrollTop(); - offset.left -= $window.scrollLeft(); - } - - if ($window.width() < offset.left + picker.widget.outerWidth()) { - offset.right = $window.width() - offset.left - picker.width; - offset.left = 'auto'; - picker.widget.addClass('pull-right'); - } else { - offset.right = 'auto'; - picker.widget.removeClass('pull-right'); - } - - picker.widget.css({ - position: position, - top: offset.top, - left: offset.left, - right: offset.right - }); - }, - - notifyChange = function (oldDate, eventType) { - if (pMoment(picker.date).isSame(pMoment(oldDate))) return; - picker.element.trigger({ - type: 'dp.change', - date: pMoment(picker.date), - oldDate: pMoment(oldDate) - }); - - if (eventType !== 'change') - picker.element.change(); - }, - - notifyError = function (date) { - picker.element.trigger({ - type: 'dp.error', - date: pMoment(date) - }); - }, - - update = function (newDate) { - pMoment.lang(picker.options.language); - var dateStr = newDate; - if (!dateStr) { - dateStr = getPickerInput().val() - if (dateStr) picker.date = pMoment(dateStr, picker.format, picker.options.useStrict); - if (!picker.date) picker.date = pMoment(); - } - picker.viewDate = pMoment(picker.date).startOf("month"); - fillDate(); - fillTime(); - }, - - fillDow = function () { - pMoment.lang(picker.options.language); - var html = $(''), weekdaysMin = pMoment.weekdaysMin(), i; - if (pMoment()._lang._week.dow == 0) { // starts on Sunday - for (i = 0; i < 7; i++) { - html.append('' + weekdaysMin[i] + ''); - } - } else { - for (i = 1; i < 8; i++) { - if (i == 7) { - html.append('' + weekdaysMin[0] + ''); - } else { - html.append('' + weekdaysMin[i] + ''); - } - } - } - picker.widget.find('.datepicker-days thead').append(html); - }, - - fillMonths = function () { - pMoment.lang(picker.options.language); - var html = '', i = 0, monthsShort = pMoment.monthsShort(); - while (i < 12) { - html += '' + monthsShort[i++] + ''; - } - picker.widget.find('.datepicker-months td').append(html); - }, - - fillDate = function () { - pMoment.lang(picker.options.language); - var year = picker.viewDate.year(), - month = picker.viewDate.month(), - startYear = picker.options.minDate.year(), - startMonth = picker.options.minDate.month(), - endYear = picker.options.maxDate.year(), - endMonth = picker.options.maxDate.month(), - prevMonth, nextMonth, html = [], row, clsName, i, days, yearCont, currentYear, months = pMoment.months(); - - picker.widget.find('.datepicker-days').find('.disabled').removeClass('disabled'); - picker.widget.find('.datepicker-months').find('.disabled').removeClass('disabled'); - picker.widget.find('.datepicker-years').find('.disabled').removeClass('disabled'); - - picker.widget.find('.datepicker-days th:eq(1)').text( - months[month] + ' ' + year); - - prevMonth = pMoment(picker.viewDate).subtract("months", 1); - days = prevMonth.daysInMonth(); - prevMonth.date(days).startOf('week'); - if ((year == startYear && month <= startMonth) || year < startYear) { - picker.widget.find('.datepicker-days th:eq(0)').addClass('disabled'); - } - if ((year == endYear && month >= endMonth) || year > endYear) { - picker.widget.find('.datepicker-days th:eq(2)').addClass('disabled'); - } - - nextMonth = pMoment(prevMonth).add(42, "d"); - while (prevMonth.isBefore(nextMonth)) { - if (prevMonth.weekday() === pMoment().startOf('week').weekday()) { - row = $(''); - html.push(row); - } - clsName = ''; - if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) { - clsName += ' old'; - } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) { - clsName += ' new'; - } - if (prevMonth.isSame(pMoment({ y: picker.date.year(), M: picker.date.month(), d: picker.date.date() }))) { - clsName += ' active'; - } - if (isInDisableDates(prevMonth) || !isInEnableDates(prevMonth)) { - clsName += ' disabled'; - } - if (picker.options.showToday === true) { - if (prevMonth.isSame(pMoment(), 'day')) { - clsName += ' today'; - } - } - if (picker.options.daysOfWeekDisabled) { - for (i in picker.options.daysOfWeekDisabled) { - if (prevMonth.day() == picker.options.daysOfWeekDisabled[i]) { - clsName += ' disabled'; - break; - } - } - } - row.append('' + prevMonth.date() + ''); - prevMonth.add(1, "d"); - } - picker.widget.find('.datepicker-days tbody').empty().append(html); - currentYear = picker.date.year(), months = picker.widget.find('.datepicker-months') - .find('th:eq(1)').text(year).end().find('span').removeClass('active'); - if (currentYear === year) { - months.eq(picker.date.month()).addClass('active'); - } - if (currentYear - 1 < startYear) { - picker.widget.find('.datepicker-months th:eq(0)').addClass('disabled'); - } - if (currentYear + 1 > endYear) { - picker.widget.find('.datepicker-months th:eq(2)').addClass('disabled'); - } - for (i = 0; i < 12; i++) { - if ((year == startYear && startMonth > i) || (year < startYear)) { - $(months[i]).addClass('disabled'); - } else if ((year == endYear && endMonth < i) || (year > endYear)) { - $(months[i]).addClass('disabled'); - } - } - - html = ''; - year = parseInt(year / 10, 10) * 10; - yearCont = picker.widget.find('.datepicker-years').find( - 'th:eq(1)').text(year + '-' + (year + 9)).end().find('td'); - picker.widget.find('.datepicker-years').find('th').removeClass('disabled'); - if (startYear > year) { - picker.widget.find('.datepicker-years').find('th:eq(0)').addClass('disabled'); - } - if (endYear < year + 9) { - picker.widget.find('.datepicker-years').find('th:eq(2)').addClass('disabled'); - } - year -= 1; - for (i = -1; i < 11; i++) { - html += '' + year + ''; - year += 1; - } - yearCont.html(html); - }, - - fillHours = function () { - pMoment.lang(picker.options.language); - var table = picker.widget.find('.timepicker .timepicker-hours table'), html = '', current, i, j; - table.parent().hide(); - if (picker.use24hours) { - current = 0; - for (i = 0; i < 6; i += 1) { - html += ''; - for (j = 0; j < 4; j += 1) { - html += '' + padLeft(current.toString()) + ''; - current++; - } - html += ''; - } - } - else { - current = 1; - for (i = 0; i < 3; i += 1) { - html += ''; - for (j = 0; j < 4; j += 1) { - html += '' + padLeft(current.toString()) + ''; - current++; - } - html += ''; - } - } - table.html(html); - }, - - fillMinutes = function () { - var table = picker.widget.find('.timepicker .timepicker-minutes table'), html = '', current = 0, i, j, step = picker.options.minuteStepping; - table.parent().hide(); - if (step == 1) step = 5; - for (i = 0; i < Math.ceil(60 / step / 4) ; i++) { - html += ''; - for (j = 0; j < 4; j += 1) { - if (current < 60) { - html += '' + padLeft(current.toString()) + ''; - current += step; - } else { - html += ''; - } - } - html += ''; - } - table.html(html); - }, - - fillSeconds = function () { - var table = picker.widget.find('.timepicker .timepicker-seconds table'), html = '', current = 0, i, j; - table.parent().hide(); - for (i = 0; i < 3; i++) { - html += ''; - for (j = 0; j < 4; j += 1) { - html += '' + padLeft(current.toString()) + ''; - current += 5; - } - html += ''; - } - table.html(html); - }, - - fillTime = function () { - if (!picker.date) return; - var timeComponents = picker.widget.find('.timepicker span[data-time-component]'), - hour = picker.date.hours(), - period = 'AM'; - if (!picker.use24hours) { - if (hour >= 12) period = 'PM'; - if (hour === 0) hour = 12; - else if (hour != 12) hour = hour % 12; - picker.widget.find('.timepicker [data-action=togglePeriod]').text(period); - } - timeComponents.filter('[data-time-component=hours]').text(padLeft(hour)); - timeComponents.filter('[data-time-component=minutes]').text(padLeft(picker.date.minutes())); - timeComponents.filter('[data-time-component=seconds]').text(padLeft(picker.date.second())); - }, - - click = function (e) { - e.stopPropagation(); - e.preventDefault(); - picker.unset = false; - var target = $(e.target).closest('span, td, th'), month, year, step, day, oldDate = pMoment(picker.date); - if (target.length === 1) { - if (!target.is('.disabled')) { - switch (target[0].nodeName.toLowerCase()) { - case 'th': - switch (target[0].className) { - case 'switch': - showMode(1); - break; - case 'prev': - case 'next': - step = dpGlobal.modes[picker.viewMode].navStep; - if (target[0].className === 'prev') step = step * -1; - picker.viewDate.add(step, dpGlobal.modes[picker.viewMode].navFnc); - fillDate(); - break; - } - break; - case 'span': - if (target.is('.month')) { - month = target.parent().find('span').index(target); - picker.viewDate.month(month); - } else { - year = parseInt(target.text(), 10) || 0; - picker.viewDate.year(year); - } - if (picker.viewMode === picker.minViewMode) { - picker.date = pMoment({ - y: picker.viewDate.year(), - M: picker.viewDate.month(), - d: picker.viewDate.date(), - h: picker.date.hours(), - m: picker.date.minutes(), - s: picker.date.seconds() - }); - notifyChange(oldDate, e.type); - set(); - } - showMode(-1); - fillDate(); - break; - case 'td': - if (target.is('.day')) { - day = parseInt(target.text(), 10) || 1; - month = picker.viewDate.month(); - year = picker.viewDate.year(); - if (target.is('.old')) { - if (month === 0) { - month = 11; - year -= 1; - } else { - month -= 1; - } - } else if (target.is('.new')) { - if (month == 11) { - month = 0; - year += 1; - } else { - month += 1; - } - } - picker.date = pMoment({ - y: year, - M: month, - d: day, - h: picker.date.hours(), - m: picker.date.minutes(), - s: picker.date.seconds() - } - ); - picker.viewDate = pMoment({ - y: year, M: month, d: Math.min(28, day) - }); - fillDate(); - set(); - notifyChange(oldDate, e.type); - } - break; - } - } - } - }, - - actions = { - incrementHours: function () { - checkDate("add", "hours", 1); - }, - - incrementMinutes: function () { - checkDate("add", "minutes", picker.options.minuteStepping); - }, - - incrementSeconds: function () { - checkDate("add", "seconds", 1); - }, - - decrementHours: function () { - checkDate("subtract", "hours", 1); - }, - - decrementMinutes: function () { - checkDate("subtract", "minutes", picker.options.minuteStepping); - }, - - decrementSeconds: function () { - checkDate("subtract", "seconds", 1); - }, - - togglePeriod: function () { - var hour = picker.date.hours(); - if (hour >= 12) hour -= 12; - else hour += 12; - picker.date.hours(hour); - }, - - showPicker: function () { - picker.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); - picker.widget.find('.timepicker .timepicker-picker').show(); - }, - - showHours: function () { - picker.widget.find('.timepicker .timepicker-picker').hide(); - picker.widget.find('.timepicker .timepicker-hours').show(); - }, - - showMinutes: function () { - picker.widget.find('.timepicker .timepicker-picker').hide(); - picker.widget.find('.timepicker .timepicker-minutes').show(); - }, - - showSeconds: function () { - picker.widget.find('.timepicker .timepicker-picker').hide(); - picker.widget.find('.timepicker .timepicker-seconds').show(); - }, - - selectHour: function (e) { - var period = picker.widget.find('.timepicker [data-action=togglePeriod]').text(), hour = parseInt($(e.target).text(), 10); - if (period == "PM") hour += 12 - picker.date.hours(hour); - actions.showPicker.call(picker); - }, - - selectMinute: function (e) { - picker.date.minutes(parseInt($(e.target).text(), 10)); - actions.showPicker.call(picker); - }, - - selectSecond: function (e) { - picker.date.seconds(parseInt($(e.target).text(), 10)); - actions.showPicker.call(picker); - } - }, - - doAction = function (e) { - var oldDate = pMoment(picker.date), action = $(e.currentTarget).data('action'), rv = actions[action].apply(picker, arguments); - stopEvent(e); - if (!picker.date) picker.date = pMoment({ y: 1970 }); - set(); - fillTime(); - notifyChange(oldDate, e.type); - return rv; - }, - - stopEvent = function (e) { - e.stopPropagation(); - e.preventDefault(); - }, - - change = function (e) { - pMoment.lang(picker.options.language); - var input = $(e.target), oldDate = pMoment(picker.date), newDate = pMoment(input.val(), picker.format, picker.options.useStrict); - if (newDate.isValid() && !isInDisableDates(newDate) && isInEnableDates(newDate)) { - update(); - picker.setValue(newDate); - notifyChange(oldDate, e.type); - set(); - } - else { - picker.viewDate = oldDate; - notifyChange(oldDate, e.type); - notifyError(newDate); - picker.unset = true; - } - }, - - showMode = function (dir) { - if (dir) { - picker.viewMode = Math.max(picker.minViewMode, Math.min(2, picker.viewMode + dir)); - } - var f = dpGlobal.modes[picker.viewMode].clsName; - picker.widget.find('.datepicker > div').hide().filter('.datepicker-' + dpGlobal.modes[picker.viewMode].clsName).show(); - }, - - attachDatePickerEvents = function () { - var $this, $parent, expanded, closed, collapseData; - picker.widget.on('click', '.datepicker *', $.proxy(click, this)); // this handles date picker clicks - picker.widget.on('click', '[data-action]', $.proxy(doAction, this)); // this handles time picker clicks - picker.widget.on('mousedown', $.proxy(stopEvent, this)); - if (picker.options.pickDate && picker.options.pickTime) { - picker.widget.on('click.togglePicker', '.accordion-toggle', function (e) { - e.stopPropagation(); - $this = $(this); - $parent = $this.closest('ul'); - expanded = $parent.find('.in'); - closed = $parent.find('.collapse:not(.in)'); - - if (expanded && expanded.length) { - collapseData = expanded.data('collapse'); - if (collapseData && collapseData.date - transitioning) return; - expanded.collapse('hide'); - closed.collapse('show'); - $this.find('span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date); - picker.element.find('.input-group-addon span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date); - } - }); - } - if (picker.isInput) { - picker.element.on({ - 'focus': $.proxy(picker.show, this), - 'change': $.proxy(change, this), - 'blur': $.proxy(picker.hide, this) - }); - } else { - picker.element.on({ - 'change': $.proxy(change, this) - }, 'input'); - if (picker.component) { - picker.component.on('click', $.proxy(picker.show, this)); - } else { - picker.element.on('click', $.proxy(picker.show, this)); - } - } - }, - - attachDatePickerGlobalEvents = function () { - $(window).on( - 'resize.datetimepicker' + picker.id, $.proxy(place, this)); - if (!picker.isInput) { - $(document).on( - 'mousedown.datetimepicker' + picker.id, $.proxy(picker.hide, this)); - } - }, - - detachDatePickerEvents = function () { - picker.widget.off('click', '.datepicker *', picker.click); - picker.widget.off('click', '[data-action]'); - picker.widget.off('mousedown', picker.stopEvent); - if (picker.options.pickDate && picker.options.pickTime) { - picker.widget.off('click.togglePicker'); - } - if (picker.isInput) { - picker.element.off({ - 'focus': picker.show, - 'change': picker.change - }); - } else { - picker.element.off({ - 'change': picker.change - }, 'input'); - if (picker.component) { - picker.component.off('click', picker.show); - } else { - picker.element.off('click', picker.show); - } - } - }, - - detachDatePickerGlobalEvents = function () { - $(window).off('resize.datetimepicker' + picker.id); - if (!picker.isInput) { - $(document).off('mousedown.datetimepicker' + picker.id); - } - }, - - isInFixed = function () { - if (picker.element) { - var parents = picker.element.parents(), inFixed = false, i; - for (i = 0; i < parents.length; i++) { - if ($(parents[i]).css('position') == 'fixed') { - inFixed = true; - break; - } - } - ; - return inFixed; - } else { - return false; - } - }, - - set = function () { - pMoment.lang(picker.options.language); - var formatted = '', input; - if (!picker.unset) formatted = pMoment(picker.date).format(picker.format); - getPickerInput().val(formatted); - picker.element.data('date', formatted); - if (!picker.options.pickTime) picker.hide(); - }, - - checkDate = function (direction, unit, amount) { - pMoment.lang(picker.options.language); - var newDate; - if (direction == "add") { - newDate = pMoment(picker.date); - if (newDate.hours() == 23) newDate.add(amount, unit); - newDate.add(amount, unit); - } - else { - newDate = pMoment(picker.date).subtract(amount, unit); - } - if (isInDisableDates(pMoment(newDate.subtract(amount, unit))) || isInDisableDates(newDate)) { - notifyError(newDate.format(picker.format)); - return; - } - - if (direction == "add") { - picker.date.add(amount, unit); - } - else { - picker.date.subtract(amount, unit); - } - picker.unset = false; - }, - - isInDisableDates = function (date) { - pMoment.lang(picker.options.language); - if (date.isAfter(picker.options.maxDate) || date.isBefore(picker.options.minDate)) return true; - if (picker.options.disabledDates === false) { - return false; - } - return picker.options.disabledDates[pMoment(date).format("YYYY-MM-DD")] === true; - }, - isInEnableDates = function (date) { - pMoment.lang(picker.options.language); - if (picker.options.enabledDates === false) { - return true; - } - return picker.options.enabledDates[pMoment(date).format("YYYY-MM-DD")] === true; - }, - - indexGivenDates = function (givenDatesArray) { - // Store given enabledDates and disabledDates as keys. - // This way we can check their existence in O(1) time instead of looping through whole array. - // (for example: picker.options.enabledDates['2014-02-27'] === true) - var givenDatesIndexed = {}; - var givenDatesCount = 0; - for (i = 0; i < givenDatesArray.length; i++) { - dDate = pMoment(givenDatesArray[i]); - if (dDate.isValid()) { - givenDatesIndexed[dDate.format("YYYY-MM-DD")] = true; - givenDatesCount++; - } - } - if (givenDatesCount > 0) { - return givenDatesIndexed; - } - return false; - }, - - padLeft = function (string) { - string = string.toString(); - if (string.length >= 2) return string; - else return '0' + string; - }, - - getTemplate = function () { - if (picker.options.pickDate && picker.options.pickTime) { - var ret = ''; - ret = ''; - return ret; - } else if (picker.options.pickTime) { - return ( - '' - ); - } else { - return ( - '' - ); - } - }, - - dpGlobal = { - modes: [ - { - clsName: 'days', - navFnc: 'month', - navStep: 1 - }, - { - clsName: 'months', - navFnc: 'year', - navStep: 1 - }, - { - clsName: 'years', - navFnc: 'year', - navStep: 10 - }], - headTemplate: - '' + - '' + - '‹›' + - '' + - '', - contTemplate: - '' - }, - - tpGlobal = { - hourTemplate: '', - minuteTemplate: '', - secondTemplate: '' - }; - - dpGlobal.template = - '
    ' + - '' + dpGlobal.headTemplate + '
    ' + - '
    ' + - '
    ' + - '' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
    ' + - '
    ' + - '
    ' + - '' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
    ' + - '
    '; - - tpGlobal.getTemplate = function () { - return ( - '
    ' + - '' + - '' + - '' + - '' + - '' + - (picker.options.useSeconds ? - '' : '') + - (picker.use24hours ? '' : '') + - '' + - '' + - ' ' + - '' + - ' ' + - (picker.options.useSeconds ? - '' : '') + - (picker.use24hours ? '' : '' + - '') + - '' + - '' + - '' + - '' + - '' + - (picker.options.useSeconds ? - '' : '') + - (picker.use24hours ? '' : '') + - '' + - '
    ' + (picker.options.useMinutes ? '' : '') + '
    ' + tpGlobal.hourTemplate + ':' + (picker.options.useMinutes ? tpGlobal.minuteTemplate : '00') + ':' + tpGlobal.secondTemplate + '
    ' + (picker.options.useMinutes ? '' : '') + '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - (picker.options.useSeconds ? - '
    ' : '') - ); - }; - - picker.destroy = function () { - detachDatePickerEvents(); - detachDatePickerGlobalEvents(); - picker.widget.remove(); - picker.element.removeData('DateTimePicker'); - if (picker.component) - picker.component.removeData('DateTimePicker'); - }; - - picker.show = function (e) { - if (picker.options.useCurrent) { - if (getPickerInput().val() == '') { - if (picker.options.minuteStepping !== 1) { - var mDate = pMoment(), - rInterval = picker.options.minuteStepping; - mDate.minutes((Math.round(mDate.minutes() / rInterval) * rInterval) % 60) - .seconds(0); - picker.setValue(mDate.format(picker.format)) - } else { - picker.setValue(pMoment().format(picker.format)) - } - }; - } - picker.widget.show(); - picker.height = picker.component ? picker.component.outerHeight() : picker.element.outerHeight(); - place(); - picker.element.trigger({ - type: 'dp.show', - date: pMoment(picker.date) - }); - attachDatePickerGlobalEvents(); - if (e) { - stopEvent(e); - } - }, - - picker.disable = function () { - var input = picker.element.find('input'); - if (input.prop('disabled')) return; - - input.prop('disabled', true); - detachDatePickerEvents(); - }, - - picker.enable = function () { - var input = picker.element.find('input'); - if (!input.prop('disabled')) return; - - input.prop('disabled', false); - attachDatePickerEvents(); - }, - - picker.hide = function (event) { - if (event && $(event.target).is(picker.element.attr("id"))) - return; - // Ignore event if in the middle of a picker transition - var collapse = picker.widget.find('.collapse'), i, collapseData; - for (i = 0; i < collapse.length; i++) { - collapseData = collapse.eq(i).data('collapse'); - if (collapseData && collapseData.date - transitioning) - return; - } - picker.widget.hide(); - picker.viewMode = picker.startViewMode; - showMode(); - picker.element.trigger({ - type: 'dp.hide', - date: pMoment(picker.date) - }); - detachDatePickerGlobalEvents(); - }, - - picker.setValue = function (newDate) { - pMoment.lang(picker.options.language); - if (!newDate) { - picker.unset = true; - set(); - } else { - picker.unset = false; - } - if (!pMoment.isMoment(newDate)) newDate = pMoment(newDate); - if (newDate.isValid()) { - picker.date = newDate; - set(); - picker.viewDate = pMoment({ y: picker.date.year(), M: picker.date.month() }); - fillDate(); - fillTime(); - } - else { - notifyError(newDate); - } - }, - - picker.getDate = function () { - if (picker.unset) return null; - return picker.date; - }, - - picker.setDate = function (date) { - var oldDate = pMoment(picker.date); - if (!date) { - picker.setValue(null); - } else { - picker.setValue(date); - } - notifyChange(oldDate, "function"); - }, - - picker.setDisabledDates = function (dates) { - picker.options.disabledDates = indexGivenDates(dates); - if (picker.viewDate) update(); - }, - picker.setEnabledDates = function (dates) { - picker.options.enabledDates = indexGivenDates(dates); - if (picker.viewDate) update(); - }, - - picker.setMaxDate = function (date) { - if (date == undefined) return; - picker.options.maxDate = pMoment(date); - if (picker.viewDate) update(); - }, - - picker.setMinDate = function (date) { - if (date == undefined) return; - picker.options.minDate = pMoment(date); - if (picker.viewDate) update(); - }; - - init(); - }; - - $.fn.datetimepicker = function (options) { - return this.each(function () { - var $this = $(this), data = $this.data('DateTimePicker'); - if (!data) $this.data('DateTimePicker', new DateTimePicker(this, options)); - }); - }; -})); \ No newline at end of file diff --git a/pilotage/public/js/bootstrap-listTree.js b/pilotage/public/js/bootstrap-listTree.js deleted file mode 100644 index 72f04039..00000000 --- a/pilotage/public/js/bootstrap-listTree.js +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 2012 Clay Walker - * Licensed under GPLv2 ONLY - */ -;(function($) { - var template = '\ -
      \ - <% _.each(context, function(parent, index) { %>\ -
    • \ - \ - <% if ( !_.isUndefined(ps = _.find(options.selected, function(elem) { return elem.key === this.key; }, parent)) ) { %>\ - checked="checked"\ - <% } %> value="<%= parent.key %>" /> <%= parent.key %>\ - <% if (options.startCollapsed) { %>\ -
        \ - <% } else { %>\ -
          \ - <% } %>\ - <% _.each(parent.values, function(child, index) { %>\ -
        • \ - \ - checked="checked"\ - <% } %> value="<%= child.key %>" /> <%= child.key %>\ -
        • \ - <% }, ps); %>\ -
        \ - \ - <% }); %>\ -
      '; - - /** Check all child checkboxes. - * @param jQElement The parent
    • . - */ - function _selectAllChildren(jQElement) { - jQElement.find('ul > li > span > input[type="checkbox"]') - .each(function() { - $(this).prop('checked', true); - }); - } - - /** Uncheck all child checkboxes. - * @param jQElement The parent
    • . - */ - function _deselectAllChildren(jQElement) { - jQElement.find('ul > li > span > input[type="checkbox"]') - .each(function() { - $(this).prop('checked', false); - }); - } - - /** Toggle all checkboxes. - * @param[in] jQElement The root
        of the list. - */ - function _toggleAllChildren(jQElement) { - if (jQElement.children('span').children('input[type="checkbox"]').prop('checked')) { - _selectAllChildren(jQElement); - } else { - _deselectAllChildren(jQElement); - } - } - - /** Toggle the collapse icon based on the current state. - * @param[in] jQElement The
      • of the header to toggle. - */ - function _toggleIcon(jQElement) { - // Change the icon. - if (jQElement.children('ul').is(':visible')) { - // The user wants to collapse the child list. - jQElement.children('span').children('i') - .removeClass('icon-chevron-down') - .addClass('icon-chevron-up'); - } else { - // The user wants to expand the child list. - jQElement.children('span').children('i') - .removeClass('icon-chevron-up') - .addClass('icon-chevron-down'); - } - } - - /** Make sure there isn't any bogus default selections. - * @param[in] selected The default selection object. - * @return The filtered selection object. - */ - function _validateDefaultSelectionValues(selected) { - return _.filter(selected, function(elem) { - return ( !_.isEmpty(elem.values) && !_.isUndefined(elem.values) ); - }); - } - - /** If a parent has at least one child node selected, check the parent. - * Conversely, if a parent has no child nodes selected, uncheck the parent. - * @param[in] jQElement The parent
      • . - */ - function _handleChildParentRelationship(jQElement) { - // If the selected node is a child: - if ( _.isEmpty(_.toArray(jQElement.children('ul'))) ) { - var childrenStatuses = _.uniq( - _.map(jQElement.parent().find('input[type="checkbox"]'), function(elem) { - return $(elem).prop('checked'); - }) - ); - - // Check to see if any children are checked. - if (_.indexOf(childrenStatuses, true) !== -1) { - // Check the parent node. - jQElement.parent().parent().children('span').children('input[type="checkbox"]').prop('checked', true); - } else { - // Uncheck the parent node. - jQElement.parent().parent().children('span').children('input[type="checkbox"]').prop('checked', false); - } - } - } - - /** Updates the internal object of selected nodes. - */ - function _updateSelectedObject() { - var data = $('.listTree').data('listTree'); - - // Filter the context to the selected parents. - var selected = _.filter($.extend(true, {}, data.context), function(parent) { - return $('.listTree > ul > li > span > input[value="' + parent.key + '"]').prop('checked') - }); - - // For each parent in the working context... - _.each(selected, function(parent) { - - // Filter the children to the selected children. - parent.values = _.filter(parent.values, function(child) { - return $('.listTree > ul > li > ul > li > span > input[value="' + child.key + '"]').prop('checked'); - }); - }); - - // Update the plugin's selected object. - $('.listTree').data('listTree', { - "target": data.target, - "context": data.context, - "options": data.options, - "selected": selected - }); - } - - var methods = { - init: function(context, options) { - // Default options - var defaults = { - "startCollapsed": false, - "selected": context - }; - options = $.extend(defaults, options); - - // Validate the user entered default selections. - options.selected = _validateDefaultSelectionValues(options.selected); - - return this.each(function() { - var $this = $(this), - data = $this.data('listTree'); - - // If the plugin hasn't been initialized yet... - if (!data) { - - $(this).data('listTree', { - "target": $this, - "context": context, - "options": options, - "selected": options.selected - }); - - // Register checkbox handlers. - $(document).on('change', '.listTree input[type="checkbox"]', function(e) { - var node = $(e.target).parent().parent(); - - // Toggle all children. - _toggleAllChildren(node); - - // Handle parent checkbox if all children are (un)checked. - _handleChildParentRelationship(node); - - // Filter context to selection and store in data.selected. - _updateSelectedObject(node); - }) - - // Register collapse handlers on parents. - .on('click', '.listTree > ul > li > span', function(e) { - var node = $(e.target).parent(); - - // Change the icon. - _toggleIcon(node); - - // Toggle the child list. - node.children('ul').slideToggle('fast'); - - e.stopImmediatePropagation(); - }); - - // Generate the list tree. - $this.html( _.template( template, { "context": context, "options": options } ) ); - } - }); - }, - destroy: function() { - return this.each(function() { - - var $this = $(this), - data = $this.data('listTree'); - - $(window).unbind('.listTree'); - $this.removeData('listTree'); - }); - }, - selectAll: function() { - // For each listTree... - return this.each(function() { - // Select each parent checkbox. - _selectAllChildren($(this)); - - // For each listTree parent... - $(this).children('ul > li:first-child').each(function() { - // Select each child checkbox. - _selectAllChildren($(this)); - }); - - _updateSelectedObject($(this)); - }); - }, - deselectAll: function() { - // For each listTree... - return this.each(function() { - // Deselect each parent checkbox. - _deselectAllChildren($(this)); - - // For each listTree parent... - $(this).children('ul > li:first-child').each(function() { - // Deselect each child checkbox. - _deselectAllChildren($(this)); - }); - - _updateSelectedObject($(this)); - }); - }, - expandAll: function() { - // For each listTree... - return this.each(function() { - var node = $(this).children('ul').children('li'); - - // Change the icon. - _toggleIcon(node); - - // Show the child list. - node.children('ul').slideDown('fast'); - }); - }, - collapseAll: function() { - // For each listTree... - return this.each(function() { - var node = $(this).children('ul').children('li'); - - // Change the icon. - _toggleIcon(node); - - // Hide the child list. - node.children('ul').slideUp('fast'); - }); - }, - update: function(context, options) { - // Default options - var defaults = { - "startCollapsed": false, - "selected": context - }; - options = $.extend(defaults, options); - - // Validate the user entered default selections. - options.selected = _validateDefaultSelectionValues(options.selected); - - return this.each(function() { - var $this = $(this), - data = $this.data('listTree'); - - // Ensure the plugin has been initialized... - if (data) { - // Update the context. - $(this).data('listTree', { - "target": $this, - "context": context, - "options": options, - "selected": options.selected - }); - - // Generate the list tree. - $this.html( _.template( template, { "context": context, "options": options } ) ); - } - }); - } - }; - - $.fn.listTree = function(method) { - - if (methods[method]) { - return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); - } else if (typeof method === 'object' || !method) { - return methods.init.apply(this, arguments); - } else { - $.error('Method ' + method + ' does not exist on jQuery.listTree'); - } - - }; -})(jQuery); - - diff --git a/pilotage/public/js/bootstrap.js b/pilotage/public/js/bootstrap.js deleted file mode 100644 index 850e6e53..00000000 --- a/pilotage/public/js/bootstrap.js +++ /dev/null @@ -1,2006 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") } - -/* ======================================================================== - * Bootstrap: transition.js v3.0.3 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.0.3 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.0.3 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d); - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons"]') - var changed = true - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') === 'radio') { - // see if clicking on current one - if ($input.prop('checked') && this.$element.hasClass('active')) - changed = false - else - $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.0.3 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000 - , pause: 'hover' - , wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.0.3 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.3 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('
      • diff --git a/pilotage/public/css/bootstrap.override.css b/pilotage/public/css/bootstrap.override.css index e06fc9b7..f89188d4 100644 --- a/pilotage/public/css/bootstrap.override.css +++ b/pilotage/public/css/bootstrap.override.css @@ -182,3 +182,7 @@ select { .color-red{ color:red; } + +.color-blue{ + color:#5bc0de; +} \ No newline at end of file diff --git a/pilotage/public/js/formulaireRegenererIgoContexte.js b/pilotage/public/js/formulaireRegenererIgoContexte.js new file mode 100644 index 00000000..f201db60 --- /dev/null +++ b/pilotage/public/js/formulaireRegenererIgoContexte.js @@ -0,0 +1,106 @@ +jQuery(document).ready(function($){ + + //TODO S'assurer que ces fonctionalités n'aient pas d'impact sur le reste de la page + var STATUT_A_JOUR = ' À jour'; + var STATUT_ERREUR = ' Voir l\'erreur'; + var STATUT_EN_COURS = ' En cours'; + + var nbContextes = $('tr[data-igoContexte-id]').length; + var nbContextexRegeneres; + + function regenerer(){ + + var contextes = $('tr[data-igoContexte-id]'); + nbContextexRegeneres = 0; + majTexteNbContextesRegeneres(); + + $('#btn-regenerer').attr('disabled', 'disabled'); + $('[data-placeholder="status"]').html(''); + + regenererUnContexte(contextes); + + } + + function majTooltip(){ + $('section table [data-toggle="tooltip"]').tooltip({placement:'right'}); + } + + function majTexteNbContextesRegeneres(){ + var pluriel = nbContextexRegeneres > 1 ? 's' : ''; + var plurielTotal = nbContextes > 1 ? 's' : ''; + majStatutGlobal('
        Traitement en cours... ' + nbContextexRegeneres + ' contexte'+pluriel+' sur ' + nbContextes + ' de regénéré'+plurielTotal+'.
        ') + } + + function majStatutGlobal(html){ + $('#statut-regeneration').html(html); + } + + function setStatutContexte(contexte, status){ + contexte.find("span[data-placeholder='status']").html(status); + } + + function setStatutContexteEnErreur(contexte, erreur){ + setStatutContexte(contexte, STATUT_ERREUR.replace('MSG_ERREUR', erreur)); + majTooltip(); + } + + function majDateMaj(contexteId, laDate){ + + $('[data-igocontexte-id="'+contexteId+'"] [data-placeholder="data_maj"]').html(laDate); + } + + function regenererUnContexte(contextes){ + + if(contextes.length == 0){ + + //Afficher les messages de fin + majStatutGlobal('
        Traitement terminé.
        '); + $('#btn-regenerer').removeAttr('disabled'); + return; + } + + //Récupérer le contexte à regénérer + var contexte = contextes[0]; + contexte = $(contexte); + + //Enlever le contexte de la liste + contextes = contextes.slice(1); + + var contexteId = contexte.attr('data-igoContexte-id'); + contexte.find("span[data-placeholder='status']").html(STATUT_EN_COURS); + + //Lancer la regénération du contexte + $.ajax({ + url: "regenerer/", + method: 'post', + async:true, + data:{'id':contexteId} + }).done(function(data, textStatus, jqXHR) { + + if(data && data.date_maj){ + majDateMaj(contexteId, data.date_maj); + } + //Afficher le message correspondant + setStatutContexte(contexte, STATUT_A_JOUR); + nbContextexRegeneres++; + majTexteNbContextesRegeneres(); + regenererUnContexte(contextes); + + + }).fail(function(data){ + var msgErreur = 'Erreur...'; + var responseText = data.responseText ? JSON.parse(data.responseText) : false; + if(responseText && responseText.erreur){ + msgErreur = responseText.erreur; + } + setStatutContexteEnErreur(contexte, msgErreur); + //Passer au suivant + regenererUnContexte(contextes); + + }); + } + + $('#btn-regenerer').click(regenerer); + +}); + From b8809e9471c3413c8682003ba6eea93525dc55f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Brisebois-T=C3=A9treault?= Date: Wed, 16 Sep 2015 16:27:14 -0400 Subject: [PATCH 115/232] Uniformisation et commentaires --- .../CRUD/IgoContexteController.php | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/pilotage/app/controllers/CRUD/IgoContexteController.php b/pilotage/app/controllers/CRUD/IgoContexteController.php index 76b94098..a3846449 100644 --- a/pilotage/app/controllers/CRUD/IgoContexteController.php +++ b/pilotage/app/controllers/CRUD/IgoContexteController.php @@ -8,6 +8,9 @@ class IgoContexteController extends ControllerBase { + /** + * Affichage de la page de création d'un contexte + */ function newAction($r_controller = null, $r_action = null, $r_id = null) { $mapserverConfiguration = $this->getDI()->getConfig()->mapserver; @@ -34,7 +37,9 @@ function newAction($r_controller = null, $r_action = null, $r_id = null) { $this->tag->setDefault("generer_onlineresource", true); } - + /** + * Création d'un contexte + */ function createAction($r_controller = null, $r_action = null, $r_id = null) { $mapServerConfig = $this->getDI()->getConfig()->mapserver; @@ -170,10 +175,15 @@ private function dupliquerContexte($idContexteSource, $idContexteCible){ } - function mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) { + /** + * Affichage de la page de création d'un mapfile + * @param int|strint $idContexte Id du contexte + * @return array + */ + function mapfileAction($idContexte) { - $igo_contexte = IgoContexte::findFirstByid($contexte_id); - if (!$igo_contexte) { + $igoContexte = IgoContexte::findFirstByid($idContexte); + if (!$igoContexte) { $this->flash->error("Contexte non-trouvé"); return $this->dispatcher->forward(array( @@ -182,15 +192,15 @@ function mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) )); } - $contexte = $igo_contexte->toArray(); + $contexte = $igoContexte->toArray(); $couches = array(); - $contexte["wms_onlineresource"] = $this->view->host . $igo_contexte->mf_map_meta_onlineresource; + $contexte["wms_onlineresource"] = $this->view->host . $igoContexte->mf_map_meta_onlineresource; - if (is_numeric($igo_contexte->mf_map_projection)) { - $contexte["mf_map_projection"] = "\"init=epsg:{$igo_contexte->mf_map_projection}\""; + if (is_numeric($igoContexte->mf_map_projection)) { + $contexte["mf_map_projection"] = "\"init=epsg:{$igoContexte->mf_map_projection}\""; } else if (trim($igo_contexte->mf_map_projection) != '') { - $contexte["mf_map_projection"] = $igo_contexte->mf_map_projection; + $contexte["mf_map_projection"] = $igoContexte->mf_map_projection; if ($contexte["mf_map_projection"] <> "") { $contexte["mf_map_projection"] = str_replace('"', "\t\t\t", str_replace('" ', '\n ', $contexte["mf_map_projection"])); } @@ -198,7 +208,7 @@ function mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) $contexteCouches = IgoVueContexteCoucheNavigateur::find( array( - "conditions"=>"contexte_id=$contexte_id", + "conditions"=>"contexte_id=$idContexte", "order"=>array("mf_layer_meta_group_title", "mf_layer_meta_title") )); @@ -234,14 +244,21 @@ function mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) return array($contexte, $couches); } - function saveMapFile($contexte_id) { - $contexte = IgoContexte::findFirstById($contexte_id); - if (!$contexte) { + /** + * Création d'un mapfile de contexte + * @param int|string $idContexte + */ + function saveMapFile($idContexte) { + $igoContexte = IgoContexte::findFirstById($idContexte); + if (!$igoContexte) { throw new Exception("Contexte inexistant"); } - $contexte->save(); + $igoContexte->save(); } + /** + * Sauvegarde d'un contexte + */ function saveAction($r_controller = null, $r_action = null, $r_id = null) { $this->traiterCodeOnlineRessource(); @@ -262,6 +279,10 @@ function saveAction($r_controller = null, $r_action = null, $r_id = null) { } + /** + * Supprimer un contexte + * @param int!string $id Id du contexte + */ function deleteAction($id, $r_controller = null, $r_action = null, $r_id = null) { $this->supprimerMapfile($id); @@ -309,7 +330,7 @@ private function traiterCodeOnlineRessource(){ * @return igoContexte[] */ private function igoContextesQuilPossede(){ - $sql = ''; + $conditionSQL = ''; if(!$this->getDI()->get('session')->get('info_utilisateur')->estAdmin){ //Récupérer les profils de l'utilisateurs @@ -326,10 +347,10 @@ private function igoContextesQuilPossede(){ $idsProfils = implode(',', $idsProfils); //Récupérer les contextes auquels ces profils donne droit - $sql = "profil_proprietaire_id IN ($idsProfils)"; + $conditionSQL .= "profil_proprietaire_id IN ($idsProfils)"; } - return IgoContexte::find($sql); + return IgoContexte::find($conditionSQL); } /** @@ -346,17 +367,17 @@ private function peutDupliquerContexte($idContexte){ $contextes = $this->igoContextesQuilPossede(); foreach($contextes as $contexte){ if($contexte->id == $idContexte){ - die("$contexte->id == $idContexte"); return true; } } return false; } - + /** + * Affichage de la page permettant de regénérer les contextes (mapfile) + */ function formulaireRegenererAction(){ - $this->assets->addJs('js/formulaireRegenererIgoContexte.js'); $igoContextes = IgoContexte::find(); From bb8fa9090e580110bfa71f9106f45c1a931f2409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Thu, 17 Sep 2015 10:21:33 -0400 Subject: [PATCH 116/232] =?UTF-8?q?retrait=20de=20la=20concat=C3=A9nation?= =?UTF-8?q?=20des=20noms=20des=20couches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pilotage/app/sql/creation_de_tables.sql | 6 +----- pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql | 6 +----- pilotage/app/views/igo_contexte/mapfile.volt | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/pilotage/app/sql/creation_de_tables.sql b/pilotage/app/sql/creation_de_tables.sql index 2260c4a4..17779478 100644 --- a/pilotage/app/sql/creation_de_tables.sql +++ b/pilotage/app/sql/creation_de_tables.sql @@ -1140,11 +1140,7 @@ CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS cgr.parent_groupe_id, cc.est_active, igo_couche.est_fond_de_carte, - CASE - WHEN igo_couche.est_fond_de_carte THEN igo_couche.mf_layer_name::text - WHEN cgr.parent_groupe_id IS NULL THEN igo_couche.mf_layer_name::text - ELSE concat(igo_couche.mf_layer_name, '_', cgr.parent_groupe_id) - END AS mf_layer_name, + igo_couche.mf_layer_name, igo_couche.mf_layer_name AS mf_layer_name_igo, COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, igo_couche.mf_layer_meta_name, diff --git a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql index f1c3c8c3..e27518ed 100644 --- a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql +++ b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql @@ -63,11 +63,7 @@ CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS cgr.parent_groupe_id, cc.est_active, igo_couche.est_fond_de_carte, - CASE - WHEN igo_couche.est_fond_de_carte THEN igo_couche.mf_layer_name::text - WHEN cgr.parent_groupe_id IS NULL THEN igo_couche.mf_layer_name::text - ELSE concat(igo_couche.mf_layer_name, '_', cgr.parent_groupe_id) - END AS mf_layer_name, + igo_couche.mf_layer_name, igo_couche.mf_layer_name AS mf_layer_name_igo, COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, igo_couche.mf_layer_meta_name, diff --git a/pilotage/app/views/igo_contexte/mapfile.volt b/pilotage/app/views/igo_contexte/mapfile.volt index 6ee55b01..ef87f084 100644 --- a/pilotage/app/views/igo_contexte/mapfile.volt +++ b/pilotage/app/views/igo_contexte/mapfile.volt @@ -75,7 +75,7 @@ MAP {% endif %} METADATA - "layer_name_igo" "{{ couche.mf_layer_name_igo}}" + {% if couche.mf_layer_name_igo|trim<>couche.mf_layer_name|trim %}layer_name_igo {{ couche.mf_layer_name_igo}}{% endif %} "wms_group_title" "{{ couche.mf_layer_meta_group_title}}" "wms_name" "{{ couche.mf_layer_meta_name}}" "wms_title" "{{ couche.mf_layer_meta_title}}" From 0e58c3598904e4caade9fc7b995ac7e48f6402cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Fri, 18 Sep 2015 09:08:07 -0400 Subject: [PATCH 117/232] Update creation_de_tables.sql change type column --- pilotage/app/sql/creation_de_tables.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pilotage/app/sql/creation_de_tables.sql b/pilotage/app/sql/creation_de_tables.sql index 17779478..125df707 100644 --- a/pilotage/app/sql/creation_de_tables.sql +++ b/pilotage/app/sql/creation_de_tables.sql @@ -1140,7 +1140,7 @@ CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS cgr.parent_groupe_id, cc.est_active, igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, + igo_couche.mf_layer_name::text, igo_couche.mf_layer_name AS mf_layer_name_igo, COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, igo_couche.mf_layer_meta_name, From 2b9d08580db9663783a327c10273e3f3ddaafbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Fri, 18 Sep 2015 09:08:22 -0400 Subject: [PATCH 118/232] Update igo_migration_1.0.0_vers_1.1.0.sql --- pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql index e27518ed..6fcb3ea2 100644 --- a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql +++ b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql @@ -63,7 +63,7 @@ CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS cgr.parent_groupe_id, cc.est_active, igo_couche.est_fond_de_carte, - igo_couche.mf_layer_name, + igo_couche.mf_layer_name::text, igo_couche.mf_layer_name AS mf_layer_name_igo, COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, igo_couche.mf_layer_meta_name, From 31e1d1fa905645358cc7c347dc67a0022cd4c91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Fri, 18 Sep 2015 10:01:23 -0400 Subject: [PATCH 119/232] geometrie collection --- .../js/app/occurence/geometrie/collection.js | 181 ++++++++++++++++++ .../public/js/app/occurence/occurence.js | 14 +- 2 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 interfaces/navigateur/public/js/app/occurence/geometrie/collection.js diff --git a/interfaces/navigateur/public/js/app/occurence/geometrie/collection.js b/interfaces/navigateur/public/js/app/occurence/geometrie/collection.js new file mode 100644 index 00000000..5ab0b287 --- /dev/null +++ b/interfaces/navigateur/public/js/app/occurence/geometrie/collection.js @@ -0,0 +1,181 @@ +/** + * Module pour l'objet {@link Geometrie.Collection}. + * @module Collection + * @author Marc-André Barbeau, MSP + * @version 1.0 + * @requires polygone + * @requires ligne + * @requires point + * @requires aide + */ +define(['polygone', 'ligne', 'point', 'aide'], function(Polygone, Ligne, Point, Aide) { + /** + * Création de l'object Geometrie.Collection. + * @constructor + * @name Geometrie.Collection + * @class Geometrie.Collection + * @alias Collection:Geometrie.Collection + * @requires Collection + * @param {tableau} geometries Tableau de {@link Geometrie} + * @param {string} [proj] Projection des géométries (Format EPSG). + * Si absent, prend celui de la carte si disponible sinon EPSG:3857 + * @returns {Geometrie.Collection} Instance de {@link Geometrie.Collection} + * @property {string} projection Projection du point (Format EPSG) + * @throws new Collection : Projection EPSG invalide + * @throws new Collection : Paramètre invalide + * @throws new Collection : Le paramètre est obligatoire + * @throws new Collection : Les géométries ne sont pas dans la même projection + */ + function Collection(geometries, proj) { + var that = this; + this.geometries = []; + + if (!proj) { + var nav = Aide.obtenirNavigateur(); + if (nav && nav.carte) { + proj = nav.carte.obtenirProjection(); + } else { + proj = 'EPSG:3857'; + } + } else if (typeof proj !== "string" || proj.toUpperCase().substr(0, 5) !== 'EPSG:' || proj.substr(5) !== proj.substr(5).match(/[0-9]+/)[0]) { + throw new Error("new Collection : Projection EPSG invalide"); + } + this.projection = proj; + + if (geometries && geometries.CLASS_NAME === "OpenLayers.Geometry.Collection") { + geometries = geometries.components; + } + + if (geometries instanceof Array === false) { + throw new Error("new Collection : Paramètre invalide"); + } + + $.each(geometries, function(index, value) { + if (value instanceof Polygone || value instanceof Ligne || value instanceof Point) { + that.geometries.push(value); + } else if (value.CLASS_NAME) { + if (value.CLASS_NAME === "OpenLayers.Geometry.Polygon") { + that.geometries.push(new Polygone(value)); + } else if (value.CLASS_NAME === "OpenLayers.Geometry.Point") { + that.geometries.push(new Point(value)); + } else if (value.CLASS_NAME === "OpenLayers.Geometry.LineString" || value.CLASS_NAME === "OpenLayers.Geometry.LinearRing") { + that.geometries.push(new Ligne(value)); + } + } + }); + + if (that.geometries.length === 0) { + throw new Error("new Collection : La Collection doit être composée d'au moins une géométrie"); + } + } + + /** + * Obtenir la projection de la géométrie + * @method + * @name Geometrie.Collection#obtenirProjection + * @returns {String} Projection EPSG + */ + Collection.prototype.obtenirProjection = function() { + return this.projection; + }; + + /** + * Définir la projection à la géométrie + * @method + * @param {String} proj Projection EPSG + * @name Geometrie.Collection#definirProjection + * @throws Collection.definirProjection : Projection EPSG invalide + * @example Collection.definirProjection('EPSG:4326'); + */ + Collection.prototype.definirProjection = function(proj) { + if (typeof proj !== "string" || proj.toUpperCase().substr(0, 5) !== 'EPSG:' || proj.substr(5) !== proj.substr(5).match(/[0-9]+/)[0]) { + throw new Error("Collection.definirProjection : Projection EPSG invalide"); + } + this.projection = proj; + }; + + /** + * Obtenir la longueur du périmètre + * @method + * @name Geometrie.Collection#obtenirPerimetre + * @returns {float} Longueur (m) + */ + Collection.prototype.obtenirPerimetre = function() { + return this._obtenirGeomOL().getGeodesicLength(this.projection); + }; + + /** + * Obtenir l'aire + * @method + * @name Geometrie.Collection#obtenirSuperficie + * @returns {float} Aire (m²) + */ + Collection.prototype.obtenirSuperficie = function() { + return this._obtenirGeomOL().getGeodesicArea(this.projection); + }; + + /* + * Transformer les coordonnées dans une autre projection. + * Cette fonction ne modifie par le Collection, un nouveau Collection est créé + * @method + * @name Geometrie.Collection#projeter + * @param {String} arg1 + * Si !arg2, alors arg1 = Projection voulue. La projection source est la projection du Collection. + * Si arg2, alors arg1 = Projection source + * @param {String} [arg2] Projection voulue + * @returns {Geometrie.Collection} Instance projectée de {@link Geometrie.Collection} + * @throws Collection.projeter : Projection source invalide + * @throws Collection.projeter : Projection voulue invalide + * @example Collection.projeter('EPSG:4326'); + * @example Collection.projeter('EPSG:4326','EPSG:900913'); + */ + Collection.prototype.projeter = function(arg1, arg2) { + var dest, source; + if (arg2) { + source = arg1; + dest = arg2; + } else { + source = this.projection; + dest = arg1; + } + if (typeof source !== "string" || source.toUpperCase().substr(0, 5) !== 'EPSG:' || source.substr(5) !== source.substr(5).match(/[0-9]+/)[0]) { + throw new Error("Collection.projeter : Projection source invalide"); + } + if (typeof dest !== "string" || dest.toUpperCase().substr(0, 5) !== 'EPSG:' || dest.substr(5) !== dest.substr(5).match(/[0-9]+/)[0]) { + throw new Error("Collection.projeter : Projection voulue invalide"); + } + var projSource = new OpenLayers.Projection(source); + var projDest = new OpenLayers.Projection(dest); + var polyOL = this._obtenirGeomOL(); + var polyProj = polyOL.transform(projSource, projDest); + return new Collection(polyProj, dest); + }; + + /** + * Obtenir le type de la classe + * @method + * @name Collection#obtenirTypeClasse + * @returns {String} Type de l'outil + */ + Collection.prototype.obtenirTypeClasse = function(){ + return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]; + }; + + /** + * Obtenir un "MultiPolygon" OpenLayers + * @method + * @private + * @name Geometrie.Collection#_obtenirGeomOL + * @param {float} tolerance Tolérance de déplacement des lignes (dans l'unité de la géométrie) + * @returns {Objet} Collection OpenLayers. + */ + Collection.prototype._obtenirGeomOL = function(tolerance) { + var collectionOL = []; + $.each(this.geometries, function(index, value) { + collectionOL.push(value._obtenirGeomOL(tolerance)); + }); + return new OpenLayers.Geometry.Collection(collectionOL); + }; + + return Collection; +}); \ No newline at end of file diff --git a/interfaces/navigateur/public/js/app/occurence/occurence.js b/interfaces/navigateur/public/js/app/occurence/occurence.js index 32765ab5..aa2f2f59 100644 --- a/interfaces/navigateur/public/js/app/occurence/occurence.js +++ b/interfaces/navigateur/public/js/app/occurence/occurence.js @@ -13,7 +13,7 @@ * @requires aide * @requires evenement */ -define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLigne', 'multiPolygone', 'aide', 'evenement'], function(Limites, Style, Point, Ligne, Polygone, MultiPoint, MultiLigne, MultiPolygone, Aide, Evenement) { +define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLigne', 'multiPolygone', 'collection', 'aide', 'evenement'], function(Limites, Style, Point, Ligne, Polygone, MultiPoint, MultiLigne, MultiPolygone, Collection, Aide, Evenement) { /** * Création de l'object Occurence. * @constructor @@ -677,6 +677,7 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi delete this.points; delete this.lignes; delete this.polygones; + delete this.geometries; delete this.gauche; delete this.droite; delete this.haut; @@ -712,7 +713,10 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi } else if (geometrie.CLASS_NAME === "OpenLayers.Geometry.LineString" || geometrie.CLASS_NAME === "OpenLayers.Geometry.LinearRing") { this.type = "Ligne"; geometrie = new Ligne(geometrie); - } + } else if (geometrie.CLASS_NAME === "OpenLayers.Geometry.Collection"){ + this.type = "Collection"; + geometrie = new Collection(geometrie); + } } else if (geometrie._obtenirGeomOL) { var geomOL = geometrie._obtenirGeomOL(); this._feature = new OpenLayers.Feature.Vector(geomOL); @@ -755,6 +759,12 @@ define(['limites', 'style', 'point', 'ligne', 'polygone', 'multiPoint', 'multiLi return new Polygone(this.lignes, this.obtenirProjection()); case "MultiPolygone": return new MultiPolygone(this.polygones, this.obtenirProjection()); + case "MultiLignes": + return new MultiLignes(this.lignes, this.obtenirProjection()); + case "MultiPoints": + return new MultiPoints(this.points, this.obtenirProjection()); + case "Collection": + return new Collection(this.geometries, this.obtenirProjection()); case "Limites": return new Limites(this.gauche, this.bas, this.droite, this.haut); default: From 620eb2f29b57bb0f5697509fcb28be552624ece6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Fri, 18 Sep 2015 10:33:09 -0400 Subject: [PATCH 120/232] configBuild --- interfaces/navigateur/build/configRequire.js | 1 + 1 file changed, 1 insertion(+) diff --git a/interfaces/navigateur/build/configRequire.js b/interfaces/navigateur/build/configRequire.js index 6b012063..9696791e 100644 --- a/interfaces/navigateur/build/configRequire.js +++ b/interfaces/navigateur/build/configRequire.js @@ -19,6 +19,7 @@ require.config({ vecteurCluster: 'js/app/couche/protocole/vecteurCluster', ligne: 'js/app/occurence/geometrie/ligne', limites: 'js/app/occurence/geometrie/limites', + collection: 'js/app/occurence/geometrie/collection', multiPoint: 'js/app/occurence/geometrie/multiPoint', multiLigne: 'js/app/occurence/geometrie/multiLigne', multiPolygone: 'js/app/occurence/geometrie/multiPolygone', From 1e22fb64c236b0a0be3d1f139c8805f926439adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Mon, 21 Sep 2015 10:54:00 -0400 Subject: [PATCH 121/232] build config --- .../views/partials/requireConfigBuild.volt | 2 -- interfaces/navigateur/build/configRequire.js | 3 +-- interfaces/navigateur/build/main.js | 3 +-- .../contexteMenu/contexteMenuArborescence.js | 20 ++----------------- 4 files changed, 4 insertions(+), 24 deletions(-) diff --git a/interfaces/navigateur/app/views/partials/requireConfigBuild.volt b/interfaces/navigateur/app/views/partials/requireConfigBuild.volt index 9b62d4d3..21bf8ec5 100644 --- a/interfaces/navigateur/app/views/partials/requireConfigBuild.volt +++ b/interfaces/navigateur/app/views/partials/requireConfigBuild.volt @@ -9,7 +9,6 @@ define([], function() { evenement: 'js/app/helper/evenement', requireAide: 'js/app/helper/requireAide', contexte: 'js/app/helper/contexte', - metadonnee: 'js/app/helper/metadonnee', browserDetect: 'js/app/helper/browserDetect', ajaxProxy: 'js/app/helper/ajaxProxy', aide: 'js/app/helper/aide', @@ -51,7 +50,6 @@ define([], function() { arborescence: 'js/app/menu/arborescence', itineraire: 'js/app/menu/itineraire', googleStreetView: 'js/app/menu/googleStreetView', - impression: 'js/app/menu/impression', recherche: 'js/app/menu/recherche/recherche', rechercheGoogle: 'js/app/menu/recherche/rechercheGoogle', rechercheCadastreReno: 'js/app/menu/recherche/rechercheCadastreReno', diff --git a/interfaces/navigateur/build/configRequire.js b/interfaces/navigateur/build/configRequire.js index 6b012063..85896efa 100644 --- a/interfaces/navigateur/build/configRequire.js +++ b/interfaces/navigateur/build/configRequire.js @@ -3,6 +3,7 @@ require.config({ analyseurConfig: 'js/app/analyseur/analyseurConfig', analyseurGML: 'js/app/analyseur/analyseurGML', analyseurGeoJSON: 'js/app/analyseur/analyseurGeoJSON', + serveur: 'js/app/api/serveur', contexteMenu: 'js/app/contexteMenu/contexteMenu', contexteMenuArborescence: 'js/app/contexteMenu/contexteMenuArborescence', contexteMenuCarte: 'js/app/contexteMenu/contexteMenuCarte', @@ -32,12 +33,10 @@ require.config({ contexte: 'js/app/helper/contexte', evenement: 'js/app/helper/evenement', fonctions: 'js/app/helper/fonctions', - metadonnee: 'js/app/helper/metadonnee', requireAide: 'js/app/helper/requireAide', arborescence: 'js/app/menu/arborescence', googleItineraire: 'js/app/menu/googleItineraire', googleStreetView: 'js/app/menu/googleStreetView', - impression: 'js/app/menu/impression', itineraire: 'js/app/menu/itineraire', localisation: 'js/app/menu/localisation', recherche: 'js/app/menu/recherche/recherche', diff --git a/interfaces/navigateur/build/main.js b/interfaces/navigateur/build/main.js index 962f5847..a2008062 100644 --- a/interfaces/navigateur/build/main.js +++ b/interfaces/navigateur/build/main.js @@ -29,12 +29,11 @@ require([ 'contexte', 'evenement', 'fonctions', - 'metadonnee', 'requireAide', 'arborescence', //'googleItineraire', //'googleStreetView', - 'impression', +// 'impression', //'itineraire', 'localisation', 'recherche', diff --git a/interfaces/navigateur/public/js/app/contexteMenu/contexteMenuArborescence.js b/interfaces/navigateur/public/js/app/contexteMenu/contexteMenuArborescence.js index c0e494f1..87008680 100644 --- a/interfaces/navigateur/public/js/app/contexteMenu/contexteMenuArborescence.js +++ b/interfaces/navigateur/public/js/app/contexteMenu/contexteMenuArborescence.js @@ -4,7 +4,7 @@ require.ajouterConfig({ } }); -define(['contexteMenu', 'aide', 'fonctions', 'metadonnee', 'panneauTable', 'dateTimeIntervalPicker'], function(ContexteMenu, Aide, Fonctions, Metadonnee, PanneauTable, DateTimeIntervalPicker) { +define(['contexteMenu', 'aide', 'fonctions', 'panneauTable', 'dateTimeIntervalPicker'], function(ContexteMenu, Aide, Fonctions, PanneauTable, DateTimeIntervalPicker) { function ContexteMenuArborescence(options){ this.options = options || {}; @@ -16,8 +16,7 @@ define(['contexteMenu', 'aide', 'fonctions', 'metadonnee', 'panneauTable', 'date bringToText: "Mettre en", frontText : "avant", backText : "arrière", - closeText : "Fermer", - mspMetadataText : "Informations sur la couche" + closeText : "Fermer" }; this.init(); }; @@ -35,7 +34,6 @@ define(['contexteMenu', 'aide', 'fonctions', 'metadonnee', 'panneauTable', 'date this.ajouterFonctionsConstruction(this.initSelectionnerTout); this.ajouterFonctionsConstruction(this.initActiverImportationSubmenu); this.ajouterFonctionsConstruction(this.initWMStime); - this.ajouterFonctionsConstruction(this.initMetadonneeSubmenu); this.ajouterFonctionsConstruction(this.initSupprimerVecteurSubmenu); this.ajouterFonctionsConstruction(this.initFermerSubmenu); @@ -259,20 +257,6 @@ define(['contexteMenu', 'aide', 'fonctions', 'metadonnee', 'panneauTable', 'date }; } }; - - ContexteMenuArborescence.prototype.initMetadonneeSubmenu = function(args){ - var that=args.scope; - if (args.couche.options.metadonnee) { - return { - id: 'arborescenceMetadonnee', - text : that.locale.mspMetadataText, - handler : function() { - Metadonnee.getLayerCapabilities(args.couche); - } - }; - } - }; - ContexteMenuArborescence.prototype.initActiverImportationSubmenu = function(args){ if (args.couche.options.importationWFS) { From d6e33f1564741b76bbb190f842f911aa91b8240f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Brisebois-T=C3=A9treault?= Date: Mon, 21 Sep 2015 16:33:21 -0400 Subject: [PATCH 122/232] =?UTF-8?q?Ajout=20de=20fonctionalit=C3=A9s=20:=20?= =?UTF-8?q?-=20Message=20quand=20on=20tente=20de=20quitter=20la=20page=20-?= =?UTF-8?q?=20Trier=20les=20contextes=20par=20ordre=20de=20date=5Fmodif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/CRUD/IgoContexteController.php | 2 +- .../public/js/formulaireRegenererIgoContexte.js | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pilotage/app/controllers/CRUD/IgoContexteController.php b/pilotage/app/controllers/CRUD/IgoContexteController.php index a3846449..66f54b2d 100644 --- a/pilotage/app/controllers/CRUD/IgoContexteController.php +++ b/pilotage/app/controllers/CRUD/IgoContexteController.php @@ -380,7 +380,7 @@ function formulaireRegenererAction(){ $this->assets->addJs('js/formulaireRegenererIgoContexte.js'); - $igoContextes = IgoContexte::find(); + $igoContextes = IgoContexte::find(array('order'=>'date_modif')); $this->view->setVar('igoContextes', $igoContextes); } diff --git a/pilotage/public/js/formulaireRegenererIgoContexte.js b/pilotage/public/js/formulaireRegenererIgoContexte.js index f201db60..a9c8a903 100644 --- a/pilotage/public/js/formulaireRegenererIgoContexte.js +++ b/pilotage/public/js/formulaireRegenererIgoContexte.js @@ -7,6 +7,7 @@ jQuery(document).ready(function($){ var nbContextes = $('tr[data-igoContexte-id]').length; var nbContextexRegeneres; + var traitementEnCours = false; function regenerer(){ @@ -56,9 +57,12 @@ jQuery(document).ready(function($){ //Afficher les messages de fin majStatutGlobal('
        Traitement terminé.
        '); $('#btn-regenerer').removeAttr('disabled'); + traitementEnCours = false; return; } + traitementEnCours = true; + //Récupérer le contexte à regénérer var contexte = contextes[0]; contexte = $(contexte); @@ -102,5 +106,14 @@ jQuery(document).ready(function($){ $('#btn-regenerer').click(regenerer); -}); + $(window).on('beforeunload', function(){ + + if(traitementEnCours){ + return 'La regénération des contextes est en cours. Si vous quittez cette page, l\'opération sera pas complétée.'; + + } + + }); + +}); From 71642c82170900672c560ec3074ec04323a4f3ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Mon, 21 Sep 2015 16:47:09 -0400 Subject: [PATCH 123/232] grunt modules --- Gruntfile.js | 83 ++++++++++++++++++++++++---------------------------- package.json | 1 + 2 files changed, 39 insertions(+), 45 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index be886d51..5a26e19c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,17 +1,13 @@ -/*{ - "urlTestUnit": "igo/navigateur/testUnit/", - "pathModules": "modules.json" -} -*/ - module.exports = function(grunt) { - globalGrunt = grunt; - initTasks(grunt); - initConfigs(grunt); - includeModules(grunt); + igo.globalGrunt = grunt; + igo.initTasks(grunt); + igo.initConfigs(grunt); + igo.includeModules(grunt); } -function initConfigs(grunt){ +igo = {}; + +igo.initConfigs = function(grunt){ grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), config: grunt.config.set('config', grunt.file.readJSON('configGrunt.json')), @@ -331,7 +327,7 @@ function initConfigs(grunt){ }); } -function includeModules(grunt){ +igo.includeModules = function(grunt){ var modules = grunt.config.get("modules"); if(!modules){ return false; @@ -348,7 +344,7 @@ function includeModules(grunt){ }; } -function initTasks(grunt){ +igo.initTasks = function(grunt){ //grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); @@ -364,10 +360,12 @@ function initTasks(grunt){ grunt.loadNpmTasks('grunt-jsdoc'); grunt.loadNpmTasks("grunt-jsbeautifier"); grunt.loadNpmTasks('grunt-git'); -//grunt-uncss -//grunt-contrib-less + grunt.loadNpmTasks("grunt-then"); + //grunt-uncss + //grunt-contrib-less - grunt.registerTask('default', ['telechargerLibs', 'build', 'cache', 'doc', 'qUnit', 'notify:watch']); + grunt.registerTask('default', ['build', 'cache']); + grunt.registerTask('init', ['default', 'modules:get']); grunt.registerTask('build', ['buildIgo', 'buildLibs']); grunt.registerTask('buildIgo', ['requirejs']); grunt.registerTask('buildLibs', ['shell:buildOpenLayers', 'uglify:LayerTreeBuilder', 'uglify:WMSBrowser', 'uglify:GeoExt', 'uglify:GeoExtDebug']); @@ -375,21 +373,19 @@ function initTasks(grunt){ grunt.registerTask('telechargerLibs', ['shell:bowerinstall']); grunt.registerTask('doc', ['jsdoc']); grunt.registerTask('qUnit', ['shell:qUnit']); - //grunt.registerTask('cloneModules', ['gitclone']); - //grunt.registerTask('pullModules', ['gitpull']); - //grunt.registerTask('cleanModules', ['clean:modules']); + grunt.registerTask('notify', ['notify:watch']); + grunt.registerTask('surveiller', ['watch:scripts']); //jsbeautifier et //jshint - grunt.task.registerTask('modules', 'Gérer les modules', modulesTask); + grunt.task.registerTask('modules', 'Gérer les modules', igo.modulesTask); grunt.task.run('notify_hooks'); } +igo.modulesTask = function(commande, nomModule, param3, modules){ + var grunt = igo.globalGrunt; -function modulesTask(commande, nomModule, param3){ - var grunt = globalGrunt; - - var modules = grunt.config.get("modules"); + modules = modules || grunt.config.get("modules"); if(!modules){ grunt.log.error("La liste des modules n'est pas définie"); return false; @@ -404,32 +400,29 @@ function modulesTask(commande, nomModule, param3){ modules[nomModule] = moduleTrouve; } - if(commande === 'obtenir'){ - modulesObtenirTask(grunt, modules); - } else if (commande === 'maj'){ - modulesMajTask(grunt, modules); + if(commande === 'get'){ + igo.modulesGetTask(grunt, modules); + } else if (commande === 'update'){ + igo.modulesUpdateTask(grunt, modules); } else if (commande === 'clean'){ - modulesCleanTask(grunt, modules); + igo.modulesCleanTask(grunt, modules); } else if (commande === 'reset') { - modulesResetTask(grunt, modules); + igo.modulesResetTask(grunt, modules); } else if (commande === 'status') { - modulesStatusTask(grunt, modules); - } else if (commande === 'statusD') { - modulesStatusTask(grunt, modules, true); + igo.modulesStatusTask(grunt, modules); + } else if (commande === 'statusC') { + igo.modulesStatusTask(grunt, modules, true); } else if (commande === 'checkout') { - modulesCheckoutTask(grunt, modules, param3); + igo.modulesCheckoutTask(grunt, modules, param3); } else if (commande === '') { grunt.log.error("Une commande est requise."); } else { grunt.log.error("Commande introuvable."); } - - - // console.log(modules); } -function modulesObtenirTask(grunt, modules){ +igo.modulesGetTask = function(grunt, modules){ var i = 0; var iE = 0; for (var key in modules) { @@ -453,7 +446,7 @@ function modulesObtenirTask(grunt, modules){ } } -function modulesMajTask(grunt, modules){ +igo.modulesUpdateTask = function(grunt, modules){ var iC = 0; var iM = 0; var iG = 0; @@ -485,7 +478,7 @@ function modulesMajTask(grunt, modules){ } } -function modulesCleanTask(grunt, modules){ +igo.modulesCleanTask = function(grunt, modules){ var i = 0; for (var key in modules) { var mod = modules[key]; @@ -501,12 +494,12 @@ function modulesCleanTask(grunt, modules){ grunt.log.writeln(i + " modules à supprimer."); } -function modulesResetTask(grunt, modules){ - modulesCleanTask(grunt, modules); - modulesObtenirTask(grunt, modules); +igo.modulesResetTask = function(grunt, modules){ + igo.modulesCleanTask(grunt, modules); + igo.modulesGetTask(grunt, modules); } -function modulesStatusTask(grunt, modules, gitstatuscomplet){ +igo.modulesStatusTask = function(grunt, modules, gitstatuscomplet){ var i = 0; var iG = 0; for (var key in modules) { @@ -535,7 +528,7 @@ function modulesStatusTask(grunt, modules, gitstatuscomplet){ } } -function modulesCheckoutTask(grunt, modules, branche){ +igo.modulesCheckoutTask = function(grunt, modules, branche){ branche = branche || 'master'; var i = 0; var iG = 0; diff --git a/package.json b/package.json index d79908c3..1e9e67df 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "grunt-load-gruntfile": "0.0.2", "grunt-notify": "^0.4.1", "grunt-shell": "^1.1.2", + "grunt-then": "^1.0.0", "rjs-build-analysis": "0.0.3" } } From 6c5d129bbcf3ebc4bcf34e15b4395cf729c9b290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Mon, 21 Sep 2015 17:11:39 -0400 Subject: [PATCH 124/232] init Modules --- Gruntfile.js | 70 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 5a26e19c..0d3e125d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -327,8 +327,8 @@ igo.initConfigs = function(grunt){ }); } -igo.includeModules = function(grunt){ - var modules = grunt.config.get("modules"); +igo.includeModules = function(grunt, modules){ + modules = modules || grunt.config.get("modules"); if(!modules){ return false; } @@ -365,7 +365,7 @@ igo.initTasks = function(grunt){ //grunt-contrib-less grunt.registerTask('default', ['build', 'cache']); - grunt.registerTask('init', ['default', 'modules:get']); + grunt.registerTask('init', ['default', 'modules:get', 'modules:init']); grunt.registerTask('build', ['buildIgo', 'buildLibs']); grunt.registerTask('buildIgo', ['requirejs']); grunt.registerTask('buildLibs', ['shell:buildOpenLayers', 'uglify:LayerTreeBuilder', 'uglify:WMSBrowser', 'uglify:GeoExt', 'uglify:GeoExtDebug']); @@ -377,13 +377,13 @@ igo.initTasks = function(grunt){ grunt.registerTask('surveiller', ['watch:scripts']); //jsbeautifier et //jshint - grunt.task.registerTask('modules', 'Gérer les modules', igo.modulesTask); + grunt.task.registerTask('modules', 'Gérer les modules', this.modulesTask); grunt.task.run('notify_hooks'); } igo.modulesTask = function(commande, nomModule, param3, modules){ - var grunt = igo.globalGrunt; + var grunt = this.globalGrunt; modules = modules || grunt.config.get("modules"); if(!modules){ @@ -401,19 +401,21 @@ igo.modulesTask = function(commande, nomModule, param3, modules){ } if(commande === 'get'){ - igo.modulesGetTask(grunt, modules); + this.modulesGetTask(grunt, modules); + } else if (commande === 'init'){ + this.modulesInitTask(grunt, modules); } else if (commande === 'update'){ - igo.modulesUpdateTask(grunt, modules); + this.modulesUpdateTask(grunt, modules); } else if (commande === 'clean'){ - igo.modulesCleanTask(grunt, modules); + this.modulesCleanTask(grunt, modules); } else if (commande === 'reset') { - igo.modulesResetTask(grunt, modules); + this.modulesResetTask(grunt, modules); } else if (commande === 'status') { - igo.modulesStatusTask(grunt, modules); + this.modulesStatusTask(grunt, modules); } else if (commande === 'statusC') { - igo.modulesStatusTask(grunt, modules, true); + this.modulesStatusTask(grunt, modules, true); } else if (commande === 'checkout') { - igo.modulesCheckoutTask(grunt, modules, param3); + this.modulesCheckoutTask(grunt, modules, param3); } else if (commande === '') { grunt.log.error("Une commande est requise."); } else { @@ -427,8 +429,7 @@ igo.modulesGetTask = function(grunt, modules){ var iE = 0; for (var key in modules) { var mod = modules[key]; - if(!mod.options){ - grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + if(!this.verifierModuleConfig(grunt, mod)){ continue; } if(grunt.file.isDir(mod.options.directory)){ @@ -446,14 +447,30 @@ igo.modulesGetTask = function(grunt, modules){ } } +igo.modulesInitTask = function(grunt, modules){ + this.includeModules(grunt, modules); + var i = 0; + for (var key in modules) { + var mod = modules[key]; + console.log(this); + if(!this.verifierModuleConfig(grunt, mod)){ + continue; + } + if (grunt.task.exists(key + ':init')){ + grunt.task.run(key + ':init'); + i++; + } + }; + grunt.log.writeln(i + " modules à initier."); +} + igo.modulesUpdateTask = function(grunt, modules){ var iC = 0; var iM = 0; var iG = 0; for (var key in modules) { var mod = modules[key]; - if(!mod.options){ - grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + if(!this.verifierModuleConfig(grunt, mod)){ continue; } if(grunt.file.isDir(mod.options.directory)){ @@ -482,8 +499,7 @@ igo.modulesCleanTask = function(grunt, modules){ var i = 0; for (var key in modules) { var mod = modules[key]; - if(!mod.options){ - grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + if(!this.verifierModuleConfig(grunt, mod)){ continue; } if(grunt.file.isDir(mod.options.directory)){ @@ -495,8 +511,8 @@ igo.modulesCleanTask = function(grunt, modules){ } igo.modulesResetTask = function(grunt, modules){ - igo.modulesCleanTask(grunt, modules); - igo.modulesGetTask(grunt, modules); + this.modulesCleanTask(grunt, modules); + this.modulesGetTask(grunt, modules); } igo.modulesStatusTask = function(grunt, modules, gitstatuscomplet){ @@ -504,8 +520,7 @@ igo.modulesStatusTask = function(grunt, modules, gitstatuscomplet){ var iG = 0; for (var key in modules) { var mod = modules[key]; - if(!mod.options){ - grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + if(!this.verifierModuleConfig(grunt, mod)){ continue; } if(grunt.file.isDir(mod.options.directory)){ @@ -534,8 +549,7 @@ igo.modulesCheckoutTask = function(grunt, modules, branche){ var iG = 0; for (var key in modules) { var mod = modules[key]; - if(!mod.options){ - grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + if(!this.verifierModuleConfig(grunt, mod)){ continue; } if(grunt.file.isDir(mod.options.directory)){ @@ -554,3 +568,11 @@ igo.modulesCheckoutTask = function(grunt, modules, branche){ grunt.log.writeln(iG + " modules absents de git."); } } + +igo.verifierModuleConfig = function(grunt, mod){ + if(!mod.options){ + grunt.log.warn("Le module '" + key + "' n'est pas configuré correctement."); + return false; + } + return true; +} \ No newline at end of file From c557bd3122f5c74062784f66509cd2ded15b6c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Barbeau?= Date: Mon, 21 Sep 2015 17:13:29 -0400 Subject: [PATCH 125/232] ignorer build --- .gitignore | 5 + interfaces/navigateur/public/js/main-build.js | 426 - .../LayerTreeBuilder-build.js | 3 - .../GeoExt.ux/WMSBrowser/WMSBrowser-build.js | 3 - .../public/libs/GeoExt/GeoExt-build-debug.js | 9410 ----------------- .../public/libs/GeoExt/GeoExt-build.js | 6 - 6 files changed, 5 insertions(+), 9848 deletions(-) delete mode 100644 interfaces/navigateur/public/js/main-build.js delete mode 100644 interfaces/navigateur/public/libs/GeoExt.ux/LayerTreeBuilder/LayerTreeBuilder-build.js delete mode 100644 interfaces/navigateur/public/libs/GeoExt.ux/WMSBrowser/WMSBrowser-build.js delete mode 100644 interfaces/navigateur/public/libs/GeoExt/GeoExt-build-debug.js delete mode 100644 interfaces/navigateur/public/libs/GeoExt/GeoExt-build.js diff --git a/.gitignore b/.gitignore index 52aa32ef..c914bb45 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,8 @@ nbproject/ /config/config.php /services/config.php +/interfaces/navigateur/public/js/main-build.js +/interfaces/navigateur/public/libs/GeoExt.ux/LayerTreeBuilder/LayerTreeBuilder-build.js +/interfaces/navigateur/public/libs/GeoExt.ux/WMSBrowser/WMSBrowser-build.js +/interfaces/navigateur/public/libs/GeoExt/GeoExt-build-debug.js +/interfaces/navigateur/public/libs/GeoExt/GeoExt-build.js \ No newline at end of file diff --git a/interfaces/navigateur/public/js/main-build.js b/interfaces/navigateur/public/js/main-build.js deleted file mode 100644 index 951e1b2b..00000000 --- a/interfaces/navigateur/public/js/main-build.js +++ /dev/null @@ -1,426 +0,0 @@ -define("aide",[],function(){function Aide(){}return Aide._obtenirTermeAnglais=function(region){region=region.toLowerCase();switch(region){case"droite":case"est":return"east";case"gauche":case"ouest":return"west";case"bas":case"sud":return"south";case"haut":case"nord":return"north";default:return""}},Aide.toBoolean=function(valeur){if(typeof valeur=="boolean")return valeur;if(typeof valeur=="string")switch(valeur.toLowerCase()){case"true":case"oui":case"vrai":case"1":return!0;case"false":case"non":case"faux":case"0":case null:return!1;default:return!1}else if(valeur===null)return!1},Aide.obtenirHote=function(sansSlash){var hote=window.location.protocol+"//"+window.location.host;return sansSlash?hote:hote+"/"},Aide.obtenirUrlServices=function(){return this.obtenirConfig("uri.services")},Aide.obtenirConfig=function(param){if(this.config&¶m){var obj=this.config,proprieteSplited=param.split(".");return $.each(proprieteSplited,function(key,value){if(!obj)return undefined;obj=obj[value]}), -obj}return this.config},Aide.definirConfig=function(config){this.config=config},Aide.obtenirConfigXML=function(param){if(this.configXML&¶m){var obj=this.configXML,proprieteSplited=param.split(".");return $.each(proprieteSplited,function(key,value){if(!obj)return undefined;obj=obj[value]}),obj}return this.configXML},Aide.definirConfigXML=function(configXML){this.configXML=configXML},Aide.obtenirProfil=function(param){return this.profil&¶m?this.profil[param]:this.profil},Aide.definirProfil=function(profil){this.profil=profil},Aide.obtenirProxy=function(avecParam){return avecParam?this.obtenirConfig("uri.api")+"service/?_service=":this.obtenirConfig("uri.api")+"service/"},Aide.utiliserProxy=function(url,toujoursUtiliser){url=this.utiliserBaseUri(url)||"";var r=new RegExp("^(http|https)","i"),urlExclusProxy=this.obtenirConfig("urlExclusProxy")||[],exclu=!1;$.each(urlExclusProxy,function(key,value){if(url.search(value)===0)return exclu=!0,!1});if(exclu)return url;var iAdresse=url.search -(/\?|&/),adresse,params,urlC;return iAdresse===-1?(adresse=url,urlC=adresse):(adresse=url.substr(0,iAdresse),params=url.substr(iAdresse+1),urlC=params?adresse+"&"+params:adresse),adresse[0]==="["&&adresse[adresse.length-1]==="]"?(adresse=adresse.substr(1,adresse.length-2),urlC=params?adresse+"&"+params:adresse,this.obtenirProxy(!0)+encodeURI(urlC)):toujoursUtiliser&&!r.test(adresse)?this.obtenirProxy(!0)+encodeURI(this.obtenirHote(!0)+urlC):!toujoursUtiliser&&(adresse.search(this.obtenirHote())===0||!r.test(adresse))?params?adresse+"?"+params:adresse:this.obtenirProxy(!0)+encodeURI(urlC)},Aide.utiliserBaseUri=function(url,cheminRacine){var lBracket=url.indexOf("["),rBracket=lBracket!==-1?url.indexOf("]"):-1;if(rBracket!==-1){var uriConfig=url.substring(lBracket+1,rBracket),uri=this.obtenirConfig("uri")[uriConfig];if(!uri)return url;url=url.substring(0,lBracket)+uri+url.substring(rBracket+1)}if(!url)return undefined;var r=new RegExp("^(http|https|/)","i");return r.test(url)?url:cheminRacine=== -undefined||cheminRacine===!0?this.obtenirCheminRacine()+url:cheminRacine?cheminRacine+url:url},Aide.obtenirCheminRacine=function(){return this.obtenirConfig("uri.navigateur")},Aide.obtenirParametreURL=function(sParam,url){if(url){var urlArray=url.split("?");urlArray.length===2&&(url=urlArray[1])}var sPageURL=url||window.location.search.substring(1),sURLVariables=sPageURL.split("&");for(var i=0;i"+message+"

        ";break;case"moyen":message=""+message+"

        ";break;case"eleve":message=""+message+"

        ";break;default:message=""+message+"

        "}if(!bouton){var nav=this.obtenirNavigateur();return nav&&nav.analyseur&&nav.analyseur.avertissements.push(message),!0}bouton.win?(bouton.dom.textContent=Number(bouton.dom.textContent)+1,bouton.win.getComponent("message").setValue(bouton.win.getComponent("message").getValue()+message)):(bouton. -dom.textContent=1,bouton.win=new Ext.Window({applyTo:"windowConsole",layout:"fit",width:"40%",height:300,closeAction:"hide",title:"Log des messages IGO",plain:!0,items:{xtype:"htmleditor",itemId:"message",hideLabel:!0,readOnly:!0,enableAlignments:!1,enableColors:!1,enableFont:!1,enableFontSize:!1,enableFormat:!1,enableLinks:!1,enableSourceEdit:!1,width:500,height:50,allowBlank:!0,value:message},buttons:[{text:"Fermer",handler:function(){bouton.win.hide()}}]}),bouton.win.getComponent("message").getToolbar().hide(),bouton.on("click",function(){this.win.show(this)})),boutonDiv.setVisible(!0)},Aide.afficherFenetre=function(opt){opt=opt||{},this.win&&this.win.destroy(),this.win=new Ext.Window({title:opt.titre,width:300,closeAction:"destroy",resizable:!0,minimizable:!1,html:opt.message,padding:5,buttons:[{text:"Fermer",scope:this,handler:function(){this.win.destroy()}}]}),this.win.show()},Aide.afficherInfobulle=function(contenu,options){options=options||{};var $divInfobulle=$("#divInfobulle") -;$divInfobulle.length==0&&($("

        ").attr("id","divInfobulle").css({position:"absolute",height:"auto",width:"auto","z-index":"99999",display:"none"}).appendTo(document.body),$divInfobulle=$("#divInfobulle")),$divInfobulle.html(contenu),options.css&&$divInfobulle.css(options.css);if(options.x)$divInfobulle.css({left:options.x+"px"});else{var x=this.obtenirNavigateur().obtenirPanneauxParType("PanneauCarte")[0]._panel.x+Math.round(this.obtenirNavigateur().carte.coordSouris.x);x+$divInfobulle.width()>$(window).width()&&(x-=$divInfobulle.width()),$divInfobulle.css({left:x+"px"})}if(options.y)$divInfobulle.css({top:options.y+"px"});else{var y=Math.round(this.obtenirNavigateur().carte.coordSouris.y)+this.obtenirNavigateur().obtenirPanneauxParType("PanneauCarte")[0]._panel.y-$divInfobulle.height();this.obtenirNavigateur().obtenirBarreOutils()&&(y+=this.obtenirNavigateur().obtenirBarreOutils()._panelContainer.getTopToolbar().getHeight()),y-$divInfobulle.height()<0&&(y+=$divInfobulle.height()) -,$divInfobulle.css({top:y+"px"})}$divInfobulle.show()},Aide.cacherInfobulle=function(){$("#divInfobulle").hide()},Aide.obtenirDebug=function(){return this.debug},Aide.estDebug=function(){return!!this.debug},Aide.definirDebug=function(debug){this.debug=debug},Aide}),define("evenement",["aide"],function(Aide){var compteur=0;function Evenement(){}return Evenement.prototype={constructor:Evenement,ajouterDeclencheur:function(type,action,options){options=options||{};var id=options.id;id||(compteur++,id="declencheur"+compteur),this.declencheurs=this.declencheurs||{},typeof this.declencheurs[type]=="undefined"&&(this.declencheurs[type]=[]),options.avant==1||options.avant=="true"?options.avant=!0:options.avant=!1,typeof action!="function"&&(action=new Function("e","return "+action+";"));var declencheurObj={id:id,action:action,options:options};return this.declencheurs[type].push(declencheurObj),this},declencher:function(event,checkGlobal){typeof event=="string"&&(event={type:event}),event.target|| -(event.target=this),event.avant||(event.avant=!1);if(!event.type)throw new Error("La propri\u00e9t\u00e9 'type' de l'\u00e9v\u00e9nement est manquant.");if(this.declencheurs&&this.declencheurs[event.type]instanceof Array){var declencheurs=this.declencheurs[event.type].slice();for(var i=0,len=declencheurs.length;i").concat(this.listeOutilsDroite)},BarreOutils.prototype.obtenirOutilsParType=function(type,niveau){niveau=niveau||1;var outils=[];return $.each(this.obtenirOutils(),function(key,value){value.obtenirTypeClasse&&value.obtenirTypeClasse()===type&&outils.push(value),(niveau>1||niveau<0)&&value.obtenirOutilsParType&&(outils=outils.concat(value.obtenirOutilsParType(type,niveau-1)))}),outils},BarreOutils.prototype.obtenirOutilParId=function(id,niveau){niveau=niveau||1;var outil;return $.each(this.obtenirOutils(),function(key,value){if(value.obtenirId&&value.obtenirId()===id)return outil=value,!1;if((niveau>1||niveau<0)&&value.obtenirOutilParId){outil=value.obtenirOutilParId(id,niveau-1);if(outil)return!1}}),outil},BarreOutils.prototype.obtenirOutilsParChemin=function(chemin){var that=this,outils=[],cheminSplit= -chemin.split(",");$.each(cheminSplit,function(key,sChemin){var indexFin,outilsTemp=[that];do{var separator,nbCaractere;sChemin.search(/>| /)===0&&(separator=sChemin[0],sChemin=sChemin.substr(1));var indexDeb=sChemin.search(/#|\.|>| /),directive=sChemin[indexDeb];indexFin=sChemin.substr(indexDeb+1).search(/#|\.|>| /),indexFin!==-1&&(nbCaractere=indexFin-indexDeb);var identifiant=sChemin.substr(indexDeb+1,nbCaractere);sChemin=sChemin.substr(indexFin+1);var outilsLoop,niveau;directive==="#"?(niveau=-1,separator===">"&&(niveau=1),!separator&&outilsTemp[0].obtenirTypeClasse()!==that.obtenirTypeClasse()?(outilsLoop=[],$.each(outilsTemp,function(keyTemp,outilTemp){outilTemp.obtenirId()===identifiant&&(outilsLoop=outilsLoop.concat([outilTemp]))}),outilsTemp=outilsLoop):(outilsLoop=[],$.each(outilsTemp,function(keyTemp,outilTemp){if(outilTemp.obtenirOutilParId){var p=outilTemp.obtenirOutilParId(identifiant,niveau);p&&(outilsLoop=outilsLoop.concat([p]))}}),outilsTemp=outilsLoop)):directive==="."? -(niveau=-1,separator===">"&&(niveau=1),!separator&&outilsTemp[0].obtenirTypeClasse()!==that.obtenirTypeClasse()?(outilsLoop=[],$.each(outilsTemp,function(keyTemp,outilTemp){outilTemp.obtenirTypeClasse()===identifiant&&(outilsLoop=outilsLoop.concat([outilTemp]))}),outilsTemp=outilsLoop):(outilsLoop=[],$.each(outilsTemp,function(keyTemp,outilTemp){outilTemp.obtenirOutilsParType&&(outilsLoop=outilsLoop.concat(outilTemp.obtenirOutilsParType(identifiant,niveau)))}),outilsTemp=outilsLoop)):outilsTemp=[],outilsTemp.length||(indexFin=-1)}while(indexFin!==-1);outils=outils.concat(outilsTemp)});var outilsUniques=outils.filter(function(itm,i,a){return i==a.indexOf(itm)});return outilsUniques},BarreOutils.prototype._getToolbar=function(){var listeBoutons=[];return $.each(this.obtenirOutils(),function(key,value){value instanceof Outil?value._getBouton()&&listeBoutons.push(value._getBouton()):listeBoutons.push(value)}),listeBoutons},BarreOutils.prototype.ajouterDivision=function(options){options=options|| -{};if(this._panelContainer){if(options.position!=="droite"){var items=this._panelContainer.topToolbar.items.items;this._panelContainer.topToolbar.add("-");var division=items.pop(),len=this.listeOutilsGauche.length;items.splice(len,0,division)}else this._panelContainer.topToolbar.add("-");options.rafraichir!==!1&&this.rafraichir()}options.position==="droite"?this.listeOutilsDroite.push("-"):this.listeOutilsGauche.push("-")},BarreOutils.prototype.rafraichir=function(){this._panelContainer&&this._panelContainer.topToolbar.doLayout(),this.carte._getCarte().updateSize()},BarreOutils.prototype._setPanelContainer=function(panel){this._panelContainer=panel},BarreOutils.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},BarreOutils.prototype.eteindreOutils=function(){var outils=this.obtenirOutils();$.each(outils,function(key,outil){outil.releverBouton!==undefined&&outil.releverBouton()})},BarreOutils}),define("panneau",["aide","evenement" -],function(Aide,Evenement){var compteur=0;function Panneau(options){this._panel,this.carte,this.options=options||{},this.defautOptions={position:"nord",id:"panneau",titre:"",dimension:100,minDimension:100,maxDimension:750,_margins:"0 5 5 5",reductible:!0,_layout:"auto",ouvert:!0}}return Panneau.prototype=new Evenement,Panneau.prototype.constructor=Panneau,Panneau.prototype._init=function(){var that=this;this.options&&this.options.css&&Aide.chargerCSS(this.options.css),compteur++,this.options.id||(this.options.id=this.defautOptions.id+compteur),this.defautOptions=$.extend({},this.defautOptions,Aide.obtenirConfig(this.obtenirTypeClasse())),this.options=$.extend({},this.defautOptions,this.options);if(!this._panel&&this.options.init!=0){var opt=this.options;opt.listeners=opt.listeners||{},opt.defaults=opt.defaults||{},opt.items=opt.items||[],opt.listeners.afterrender||(opt.listeners.afterrender=function(e){that.callbackCreation()}),this._extOptions=$.extend({region:Aide._obtenirTermeAnglais -(opt.position),id:opt.id,title:opt.titre,split:!0,width:Number(opt.dimension),height:Number(opt.dimension),minSize:Number(opt.minDimension),maxSize:Number(opt.maxDimension),collapsible:Aide.toBoolean(opt.reductible),collapsed:!Aide.toBoolean(opt.ouvert),closable:Aide.toBoolean(opt.fermable),floatable:!1,margins:opt._margins,layout:opt._layout,defaults:opt.defaults,items:opt.items,scope:this,listeners:opt.listeners},this._extOptions,this.options._extOptions),this._extOptions.xtype?this._extOptions.xtype==="grid"?this._panel=new Ext.grid.GridPanel(this._extOptions):this._extOptions.xtype==="editorgrid"?this._panel=new Ext.grid.EditorGridPanel(this._extOptions):this._panel=this._extOptions:this._panel=new Ext.Panel(this._extOptions)}},Panneau.prototype.callbackCreation=function(){this.declencher({type:"init"+this.obtenirTypeClasse(),panneau:this})},Panneau.prototype._getPanel=function(){if(!this._panel)throw new Error("Igo.Panneaux."+this.constructor.name+"._getPanel()");return this._panel -},Panneau.prototype.obtenirId=function(){return this._getPanel().id},Panneau.prototype.obtenirTitre=function(){return this._panel&&this._panel.title?this._panel.title:this.options.titre},Panneau.prototype.definirTitre=function(titre){if(!this._panel)return!1;this._panel.setTitle(titre)},Panneau.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},Panneau.prototype.rafraichir=function(){this._getPanel().doLayout()},Panneau.prototype.definirCarte=function(carte){this.carte=carte},Panneau.prototype.ouvrir=function(){return this._getPanel().expand()},Panneau.prototype.fermer=function(){return this._getPanel().collapse()},Panneau.prototype.avantFermeture=function(){},Panneau.prototype.majContenu=function(contenu){this._panel.body.update(contenu)},Panneau}),define("point",["aide"],function(Aide){function Point(x,y,proj){if(!x)throw new Error("new Point : Param\u00e8tres obligatoires");typeof x!="number"&&typeof x!="string"||typeof -y!="number"&&typeof y!="string"?x.CLASS_NAME=="OpenLayers.Geometry.Point"&&x.x&&x.y?(this.x=parseFloat(x.x),this.y=parseFloat(x.y),proj=y):$.isArray(x)&&(typeof x[0]=="number"||typeof x[0]=="string")&&(typeof x[1]=="number"||typeof x[1]=="string")&&(this.x=parseFloat(x[0]),this.y=parseFloat(x[1]),proj=y):(this.x=parseFloat(x),this.y=parseFloat(y));if(!this.x||!this.y)throw new Error("new Point : Param\u00e8tres invalides");var nav=Aide.obtenirNavigateur();nav&&nav.carte&&nav.carte.options.precision&&(this.precision=parseInt(nav.carte.options.precision),this.definirNombreDecimales());if(!proj)nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857";else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new Point : Projection EPSG invalide");this.projection=proj.toUpperCase()}return Point.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/ -)[1]},Point.prototype.obtenirProjection=function(){return this.projection},Point.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("Point.definirProjection : Projection EPSG invalide");this.projection=proj},Point.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("Point.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("Point.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),pointOL=new OpenLayers.LonLat(this.x,this.y),pointProj=pointOL.transform(projSource -,projDest);return new Point(pointProj.lon,pointProj.lat,dest)},Point.prototype._obtenirGeomOL=function(){return new OpenLayers.Geometry.Point(this.x,this.y)},Point.prototype._obtenirLonLatOL=function(){return new OpenLayers.LonLat(this.x,this.y)},Point.prototype.estEgal=function(p2){return p2 instanceof Point?this.x===p2.x&&this.y===p2.y&&this.projection===p2.projection:!1},Point.prototype.distanceDe=function(p2){if(p2 instanceof Point){if(this.projection!==p2.projection)throw new Error("Point.distanceDe : Les points ne sont pas dans la m\u00eame projection");return this._obtenirGeomOL().distanceTo(p2._obtenirGeomOL())}throw new Error("Point.distanceDe : L'argument n'est pas un point")},Point.prototype.deplacer=function(point){if(point instanceof Point){if(this.projection!==point.projection)throw new Error("Point.deplacer : Les points ne sont pas dans la m\u00eame projection");return this.x=parseFloat(point.x),this.y=parseFloat(point.y),this.definirNombreDecimales(),this._feature&&this. -_feature.move(point._obtenirLonLatOL()),this}throw new Error("Point.deplacer : L'argument n'est pas un point")},Point.prototype.deplacerDe=function(dx,dy){this.x=parseFloat(this.x+dx),this.y=parseFloat(this.y+dy),this.definirNombreDecimales();var point=new Point(this.x,this.y,this.projection);return this._feature&&this._feature.move(point._obtenirLonLatOL()),this},Point.prototype.definirNombreDecimales=function(nombre){if(nombre)this.precision=nombre;else if(!this.precision)return!0;var multi=Math.pow(10,this.precision);this.x=Math.round((this.x*multi).toFixed(this.precision+1))/multi,this.y=Math.round((this.y*multi).toFixed(this.precision+1))/multi},Point}),define("limites",["aide","point"],function(Aide,Point){function Limites(gauche,bas,droite,haut,proj){this.gauche=Number(gauche),this.bas=Number(bas),this.droite=Number(droite),this.haut=Number(haut);if(!this.gauche||!this.bas||!this.droite||!this.haut)throw new Error("new Limites : Param\u00e8tre absent");if(!proj){var nav=Aide.obtenirNavigateur -();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new Limites : Projection EPSG invalide");this.projection=proj}return Limites.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},Limites.prototype.obtenirProjection=function(){return this.projection},Limites.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("Limites.definirProjection : Projection EPSG invalide");this.projection=proj},Limites.prototype.contientPoint=function(point){if(point instanceof Point){if(this.projection!==point.projection)throw new Error("Limites.contientPoint : Le point n'est pas dans la m\u00eame projection");var limitesOL=this._obtenirBoundsOL();return limitesOL.containsLonLat -(point._obtenirLonLatOL())}throw new Error("Limites.contientPoint : L'argument n'est pas un point")},Limites.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("Limites.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("Limites.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),limitesOL=this._obtenirBoundsOL(),limitesProj=limitesOL.transform(projSource,projDest);return new Limites(limitesProj.left,limitesProj.bottom,limitesProj.right,limitesProj.top,dest)},Limites.prototype._obtenirGeomOL=function(){return this._obtenirBoundsOL().toGeometry()},Limites.prototype._obtenirBoundsOL= -function(){return new OpenLayers.Bounds(this.gauche,this.bas,this.droite,this.haut)},Limites.prototype.fusionnerLimites=function(autreLimite){var limitesOL=this._obtenirBoundsOL();limitesOL.extend(autreLimite._obtenirBoundsOL());var limites=new Limites(limitesOL.left,limitesOL.bottom,limitesOL.right,limitesOL.top);return limites},Limites.prototype.obtenirCentroide=function(){var x=Number(this.gauche)+(Number(this.droite)-Number(this.gauche))/2,y=Number(this.bas)+(Number(this.haut)-Number(this.bas))/2;return new Point(x,y,this.projection)},Limites}),OpenLayers.Filter.Function.prototype.clone=function(){return OpenLayers.Util.extend(new OpenLayers.Filter.Function,this)},define("libs/extension/OpenLayers/FilterClone",function(){}),define("style",["evenement","fonctions","aide","libs/extension/OpenLayers/FilterClone"],function(Evenement,Fonctions,Aide){function Style(style){this.propriete=style||{},this.defautPropriete={cursor:"inherit",rayon:6,couleur:"#ee9900",opacite:.4,limiteOpacite:1,limiteCouleur -:"#ee9900",limiteEpaisseur:1,limiteStyleExtremite:"round",limiteStyle:"solid"},this.propriete.icone&&(this.defautPropriete.opacite=1),this._lookupOptionsOL={cursor:"cursor",rayon:"pointRadius",opacite:"fillOpacity",couleur:"fillColor",limiteOpacite:"strokeOpacity",limiteCouleur:"strokeColor",limiteEpaisseur:"strokeWidth",limiteStyle:"strokeDashstyle",limiteStyleExtremite:"strokeLinecap",icone:"externalGraphic",iconeHauteur:"graphicHeight",iconeLargeur:"graphicWidth",iconeOffsetX:"graphicXOffset",iconeOffsetY:"graphicYOffset",etiquette:"label",etiquetteOffsetX:"labelXOffset",etiquetteOffsetY:"labelYOffset",etiquetteAlignement:"labelAlign",etiquetteCouleur:"fontColor",etiquetteEpaisseur:"fontWeight",etiquetteTaille:"fontSize",etiquettePolice:"fontFamily",visible:"display",rotation:"rotation"},this.contexte=this.propriete.contexte||undefined,this._filtresOL=[],this.filtres=[],this.propriete.filtres&&this.ajouterFiltres(this.propriete.filtres)}return Style.prototype=new Evenement,Style.prototype -.constructor=Style,Style.prototype._getStyleOptionsOL=function(){var that=this,opt=$.extend({},this.defautPropriete,this.propriete),_optionsOL={};return $.each(this._lookupOptionsOL,function(valueIGO,valueOL){var vTemp=opt[valueIGO];vTemp=that._traiterValeurIGO(valueIGO,vTemp),_optionsOL[valueOL]=vTemp}),_optionsOL},Style.prototype._traiterValeurIGO=function(propriete,valeur){if(propriete!=="couleur"&&propriete!=="limiteCouleur"&&propriete!=="etiquetteCouleur"||!valeur)return propriete==="visible"?Aide.toBoolean(valeur)===!1?"none":"":valeur;if(valeur==="aleatoire"){var min=0,max=255;valeur=Fonctions.rgbToHex(Math.floor(Math.random()*(max-min+1)+min),Math.floor(Math.random()*(max-min+1)+min),Math.floor(Math.random()*(max-min+1)+min))}else if(valeur[0]!=="#"){var splitValeur=valeur.split(" ");splitValeur.length===3&&(valeur=Fonctions.rgbToHex(Number(splitValeur[0]),Number(splitValeur[1]),Number(splitValeur[2])))}return valeur},Style.prototype._getStyleOL=function(){var that=this,contexte -;this.contexte&&(contexte={},$.each(this.contexte,function(key,value){contexte[key]=function(feature){var occ;return that.parent&&(occ=that.parent.obtenirOccurenceParId(feature.id),!occ&&that.parent.obtenirClusterParId&&(occ=that.parent.obtenirClusterParId(feature.id))),that.contexte[key](occ)}}));var styleOL=new OpenLayers.Style(this._getStyleOptionsOL(),{context:contexte});return styleOL.addRules(this._filtresOL),styleOL.title=this.propriete.titre||"Style",styleOL},Style.prototype.obtenirPropriete=function(nom){var opt=$.extend({},this.defautPropriete,this.propriete);return opt[nom]},Style.prototype.definirPropriete=function(nom,valeur){valeur?this.propriete[nom]=valeur:delete this.propriete[nom];if(this.parent){var nomOL=this._lookupOptionsOL[nom],vTemp=this._traiterValeurIGO(nom,valeur);this.parent.obtenirTypeClasse()==="Vecteur"||this.parent.obtenirTypeClasse()==="VecteurCluster"||this.parent.obtenirTypeClasse()==="WFS"?(this.regle==="defaut"&&(this.parent._layer.styleMap.styles["default" -].defaultStyle[nomOL]=vTemp),this.parent._layer.styleMap.styles[this.regle].defaultStyle[nomOL]=vTemp,this.parent.rafraichir()):this.parent.obtenirTypeClasse()==="Occurence"&&(this.parent._feature.style||(this.parent._feature.style={}),vTemp?this.parent._feature.style[nomOL]=vTemp:delete this.parent._feature.style[nomOL],$.isEmptyObject(this.propriete)&&(this.parent._feature.style=undefined),this.parent.rafraichir())}},Style.prototype.ajouterFiltres=function(filtres){var that=this;$.each(filtres,function(key,value){that.ajouterFiltre(value)})},Style.prototype.ajouterFiltre=function(options){var filtre=options.filtre,style=options.style,that=this,comparatorArray=[],logicSeparator;filtre&&(filtre=filtre.replace(/ /g,""),logicSeparator=filtre.match(/&&|\|\|/g),comparatorArray=filtre.split(/&&|\|\|/g));var filterLast;$.each(comparatorArray,function(key,value){if(value==="")return!0;var propriete=value.substring(1,value.indexOf("]")),operatorMatch=value.match(/==|!=|<=|>=|<|>/);if(!operatorMatch -)throw new Error("Style.ajouterFiltre : Op\u00e9rateur invalide");var operator=operatorMatch[0],rule={};rule.value=value.split(operator)[1],rule.type=operator,rule.property=propriete;var filterComparison=new OpenLayers.Filter.Function({evaluate:function(attributes){var obj=attributes,proprieteSplited=rule.property.split(".");return $.each(proprieteSplited,function(key,value){if(!obj)return undefined;obj=obj[value]}),eval("obj"+operator+rule.value)}});if(key!==0)var filterLogical=new OpenLayers.Filter.Logical({type:logicSeparator[key-1],filters:[filterLast,filterComparison]});filterLast=filterLogical||filterComparison});var _optionsOL={};style instanceof Style?_optionsOL=style._getStyleOptionsOL():$.each(this._lookupOptionsOL,function(valueIGO,valueOL){var vTemp=style[valueIGO];vTemp=that._traiterValeurIGO(valueIGO,vTemp),_optionsOL[valueOL]=vTemp});var filtreCombinaison;filterLast?filtreCombinaison=new OpenLayers.Rule({name:options.titre,filter:filterLast,maxScaleDenominator:options.echelleMax -,minScaleDenominator:options.echelleMin,symbolizer:_optionsOL}):filtreCombinaison=new OpenLayers.Rule({name:options.titre,elseFilter:!0,maxScaleDenominator:options.echelleMax,minScaleDenominator:options.echelleMin,symbolizer:_optionsOL}),this._filtresOL.push(filtreCombinaison),this.filtres.push({filtre:filtre,style:style}),this.parent&&(this.parent.obtenirTypeClasse()==="Vecteur"||this.parent.obtenirTypeClasse()==="VecteurCluster"||this.parent.obtenirTypeClasse()==="WFS")&&(this.regle==="defaut"&&(this.parent._layer.styleMap.styles["default"].rules=this._filtresOL),this.parent._layer.styleMap.styles[this.regle].rules=this._filtresOL,this.parent.rafraichir())},Style.prototype.cloner=function(){return jQuery.extend(!0,{},this)},Style.prototype.reinitialiserFiltres=function(){this._filtresOL=[],this.filtres=[],this.parent&&(this.parent.obtenirTypeClasse()==="Vecteur"||this.parent.obtenirTypeClasse()==="VecteurCluster"||this.parent.obtenirTypeClasse()==="WFS")&&(this.regle==="defaut"&&(this -.parent._layer.styleMap.styles["default"].rules=this._filtresOL),this.parent._layer.styleMap.styles[this.regle].rules=this._filtresOL,this.parent.rafraichir())},Style.prototype.evaluerFiltre=function(filtre,occurence){var that=this,out=!1;return $.each(this.filtres,function(key,value){if(value===filtre)return that._filtresOL[key]&&that._filtresOL[key].evaluate&&occurence&&(out=that._filtresOL[key].evaluate(occurence._feature)),!1}),out},Style.prototype.obtenirStyleFiltreParOccurence=function(occurence){var that=this;if(!this.filtres.length)return this;var styleFiltre=$.extend({},this.propriete),estDansUnFiltre=!1;$.each(this.filtres,function(key,value){if(that._filtresOL[key]&&that._filtresOL[key].evaluate&&occurence&&that._filtresOL[key].evaluate(occurence._feature)){estDansUnFiltre=!0;var styleFiltreT=value.style;styleFiltreT&&styleFiltreT.propriete&&(styleFiltreT=styleFiltreT.propriete),$.extend(styleFiltre,styleFiltreT)}});if($.isEmptyObject(styleFiltre))return!1;var style=new Style -($.extend({},this.propriete,styleFiltre));return style.defautPropriete=this.defautPropriete,style},Style}),define("ligne",["point","aide"],function(Point,Aide){function Ligne(arrayPoint,proj){var that=this;this.points=[];if(!proj){var nav=Aide.obtenirNavigateur();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new Ligne : Projection EPSG invalide");this.projection=proj,arrayPoint&&(arrayPoint.CLASS_NAME==="OpenLayers.Geometry.LineString"||arrayPoint.CLASS_NAME==="OpenLayers.Geometry.LinearRing")&&(arrayPoint=arrayPoint.components);if(arrayPoint instanceof Array==0)throw new Error("new Ligne : Param\u00e8tre invalide");$.each(arrayPoint,function(index,value){if(value instanceof Array)that.points.push(new Point(value[0],value[1],that.projection));else if(value instanceof Point){if(value.projection!==that.projection)throw new Error("new Ligne : Les Points ne sont pas dans la m\u00eame projection" -);that.points.push(value)}else{if(value.CLASS_NAME!=="OpenLayers.Geometry.Point")throw new Error("new Ligne : Param\u00e8tre invalide");that.points.push(new Point(value.x,value.y,that.projection))}});if(that.points.length<2)throw new Error("new Ligne : La ligne doit \u00eatre compos\u00e9e d'au moins 2 points")}return Ligne.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},Ligne.prototype.obtenirProjection=function(){return this.projection},Ligne.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("Ligne.definirProjection : Projection EPSG invalide");this.projection=proj},Ligne.prototype.obtenirLongueur=function(){return this._obtenirGeomOL().getGeodesicLength(this.projection)},Ligne.prototype.ajouterPoint=function(point){point instanceof Array&&(point=new Point(point[0],point[1],this.projection)); -if(point instanceof Point==0)throw new Error("Ligne.ajouterPoint : L'argument n'est pas un point");if(point.projection!==this.projection)throw new Error("Ligne.ajouterPoint : Le point n'est pas dans la m\u00eame projection");return this.points.push(point),this._feature&&this._feature.geometry.addPoint(point._obtenirGeomOL()),this},Ligne.prototype.estFerme=function(){return this.points[0].estEgal(this.points[this.points.length-1])},Ligne.prototype.fermerLigne=function(){return this.estFerme()||this.ajouterPoint(this.points[0]),this},Ligne.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("Ligne.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("Ligne.projeter : Projection voulue invalide" -);var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),ligneOL=this._obtenirGeomOL(),ligneProj=ligneOL.transform(projSource,projDest);return new Ligne(ligneProj,dest)},Ligne.prototype.simplifier=function(tolerance){var ligneSimplifiee=this._obtenirGeomOL().simplify(tolerance);return new Ligne(ligneSimplifiee)},Ligne.prototype._obtenirGeomOL=function(tolerance){var ligneOL=[],ligneSimplifiee=this;return tolerance&&(ligneSimplifiee=this.simplifier(tolerance)),$.each(ligneSimplifiee.points,function(index,value){ligneOL.push(value._obtenirGeomOL())}),new OpenLayers.Geometry.LineString(ligneOL)},Ligne.prototype._obtenirGeomFermeOL=function(tolerance){var ligneOL=[],ligneSimplifiee=this;return tolerance&&(ligneSimplifiee=this.simplifier(tolerance)),$.each(ligneSimplifiee.points,function(index,value){ligneOL.push(value._obtenirGeomOL())}),new OpenLayers.Geometry.LinearRing(ligneOL)},Ligne}),define("polygone",["ligne","point","aide"],function(Ligne,Point,Aide -){function Polygone(arrayLigne,proj){var that=this;this.lignes=[];if(!proj){var nav=Aide.obtenirNavigateur();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new Polygone : Projection EPSG invalide");this.projection=proj;if(!arrayLigne)throw new Error("new Polygone : Le param\u00e8tre est obligatoire");arrayLigne.CLASS_NAME==="OpenLayers.Geometry.Polygon"?arrayLigne=arrayLigne.components:arrayLigne instanceof Ligne||arrayLigne.CLASS_NAME==="OpenLayers.Geometry.LineString"||arrayLigne.CLASS_NAME==="OpenLayers.Geometry.LinearRing"?arrayLigne=[arrayLigne]:$.isArray(arrayLigne)&&arrayLigne[0]&&(arrayLigne[0]instanceof Ligne||arrayLigne[0].CLASS_NAME==="OpenLayers.Geometry.LineString"||arrayLigne[0].CLASS_NAME==="OpenLayers.Geometry.LinearRing")||$.isArray(arrayLigne[0])&&arrayLigne[0][0]&&(arrayLigne[0][0]instanceof Point||arrayLigne[0 -][0]instanceof Array||arrayLigne[0][0].CLASS_NAME==="OpenLayers.Geometry.Point")||(arrayLigne=[arrayLigne]),$.each(arrayLigne,function(index,value){if(value instanceof Array)that.lignes.push((new Ligne(value,that.projection)).fermerLigne());else if(value instanceof Ligne){if(value.projection!==that.projection)throw new Error("new Polygone : Les lignes ne sont pas dans la m\u00eame projection");that.lignes.push(value.fermerLigne())}else{if(value.CLASS_NAME!=="OpenLayers.Geometry.LineString"&&value.CLASS_NAME!="OpenLayers.Geometry.LinearRing")throw new Error("new Polygone : Param\u00e8tre invalide");that.lignes.push(new Ligne(value.components,that.projection))}});if(that.lignes.length<1)throw new Error("new Polygone : Le polygone doit \u00eatre compos\u00e9 d'au moins une ligne")}return Polygone.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},Polygone.prototype.obtenirProjection=function(){return this.projection},Polygone -.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("Polygone.definirProjection : Projection EPSG invalide");this.projection=proj},Polygone.prototype.obtenirPerimetre=function(){return this._obtenirGeomOL().getGeodesicLength(this.projection)},Polygone.prototype.obtenirSuperficie=function(){return this._obtenirGeomOL().getGeodesicArea(this.projection)},Polygone.prototype.obtenirExterieur=function(){return this.lignes[0]},Polygone.prototype.obtenirInterieurs=function(){return this.lignes.slice(1)},Polygone.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("Polygone.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0 -,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("Polygone.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),polyOL=this._obtenirGeomOL(),polyProj=polyOL.transform(projSource,projDest);return new Polygone(polyProj,dest)},Polygone.prototype.simplifier=function(tolerance){var lignesSimplifiees=[];return $.each(this.lignes,function(index,value){var ligneSimp=value.simplifier(tolerance);if(index!==0&&ligneSimp.points.length<4)return!0;lignesSimplifiees.push(ligneSimp)}),new Polygone(lignesSimplifiees)},Polygone.prototype._obtenirGeomOL=function(tolerance){var polygoneOL=[];return $.each(this.lignes,function(index,value){polygoneOL.push(value._obtenirGeomFermeOL(tolerance))}),new OpenLayers.Geometry.Polygon(polygoneOL)},Polygone}),define("multiPoint",["aide","point"],function(Aide,Point){function MultiPoint(arrayPoint,proj){var that=this;this.points=[];if(!proj){var nav=Aide.obtenirNavigateur -();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new MultiPoint : Projection EPSG invalide");this.projection=proj,arrayPoint&&arrayPoint.CLASS_NAME==="OpenLayers.Geometry.MultiPoint"&&(arrayPoint=arrayPoint.components);if(arrayPoint instanceof Array==0)throw new Error("new MultiPoint : Param\u00e8tre invalide");$.each(arrayPoint,function(index,value){if(value instanceof Array)that.points.push(new Point(value[0],value[1],that.projection));else if(value instanceof Point){if(value.projection!==that.projection)throw new Error("new MultiPoint : Les Points ne sont pas dans la m\u00eame projection");that.points.push(value)}else{if(value.CLASS_NAME!=="OpenLayers.Geometry.Point")throw new Error("new MultiPoint : Param\u00e8tre invalide");that.points.push(new Point(value.x,value.y,that.projection))}});if(this.points.length<1)throw new Error -("new MultiPoint : Le multiPoint doit \u00eatre compos\u00e9 d'au moins 1 point")}return MultiPoint.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},MultiPoint.prototype.obtenirProjection=function(){return this.projection},MultiPoint.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("MultiPoint.definirProjection : Projection EPSG invalide");this.projection=proj},MultiPoint.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("MultiPoint.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0 -])throw new Error("MultiPoint.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),multiPointsOL=this._obtenirGeomOL(),multiPointsProj=multiPointsOL.transform(projSource,projDest);return new MultiPoint(multiPointsProj,dest)},MultiPoint.prototype._obtenirGeomOL=function(){var pointsOL=[];return $.each(this.points,function(index,value){pointsOL.push(value._obtenirGeomOL())}),new OpenLayers.Geometry.MultiPoint(pointsOL)},MultiPoint}),define("multiLigne",["aide","point","ligne"],function(Aide,Point,Ligne){function MultiLigne(arrayLigne,proj){var that=this;this.lignes=[];if(!proj){var nav=Aide.obtenirNavigateur();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new MultiLigne : Projection EPSG invalide");this.projection=proj;if(!arrayLigne)throw new Error("new MultiLigne : Le param\u00e8tre est obligatoire" -);arrayLigne.CLASS_NAME==="OpenLayers.Geometry.MultiLineString"?arrayLigne=arrayLigne.components:arrayLigne instanceof Ligne||arrayLigne.CLASS_NAME==="OpenLayers.Geometry.LineString"||arrayLigne.CLASS_NAME==="OpenLayers.Geometry.LinearRing"?arrayLigne=[arrayLigne]:$.isArray(arrayLigne)&&arrayLigne[0]&&(arrayLigne[0]instanceof Ligne||arrayLigne[0].CLASS_NAME==="OpenLayers.Geometry.LineString"||arrayLigne[0].CLASS_NAME==="OpenLayers.Geometry.LinearRing")||$.isArray(arrayLigne[0])&&arrayLigne[0][0]&&(arrayLigne[0][0]instanceof Point||arrayLigne[0][0]instanceof Array||arrayLigne[0][0].CLASS_NAME==="OpenLayers.Geometry.Point")||(arrayLigne=[arrayLigne]),$.each(arrayLigne,function(index,value){if(value instanceof Array)that.lignes.push(new Ligne(value,that.projection));else if(value instanceof Ligne){if(value.projection!==that.projection)throw new Error("new MultiLigne : Les lignes ne sont pas dans la m\u00eame projection");that.lignes.push(value)}else{if(value.CLASS_NAME!=="OpenLayers.Geometry.LineString"&& -value.CLASS_NAME!="OpenLayers.Geometry.LinearRing")throw new Error("new MultiLigne : Param\u00e8tre invalide");that.lignes.push(new Ligne(value.components,that.projection))}});if(that.lignes.length<1)throw new Error("new MultiLigne : Le MultiLigne doit \u00eatre compos\u00e9 d'au moins une ligne")}return MultiLigne.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},MultiLigne.prototype.obtenirProjection=function(){return this.projection},MultiLigne.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("MultiLigne.definirProjection : Projection EPSG invalide");this.projection=proj},MultiLigne.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source -.substr(5).match(/[0-9]+/)[0])throw new Error("MultiLigne.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("MultiLigne.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),multiLignesOL=this._obtenirGeomOL(),multiLignesProj=multiLignesOL.transform(projSource,projDest);return new MultiLigne(multiLignesProj,dest)},MultiLigne.prototype._obtenirGeomOL=function(){var lignesOL=[];return $.each(this.lignes,function(index,value){lignesOL.push(value._obtenirGeomOL())}),new OpenLayers.Geometry.MultiLineString(lignesOL)},MultiLigne}),define("multiPolygone",["polygone","aide"],function(Polygone,Aide){function MultiPolygone(polygones,proj){var that=this;this.polygones=[];if(!proj){var nav=Aide.obtenirNavigateur();nav&&nav.carte?proj=nav.carte.obtenirProjection():proj="EPSG:3857"}else if(typeof proj!="string"|| -proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("new Polygone : Projection EPSG invalide");this.projection=proj,polygones&&polygones.CLASS_NAME==="OpenLayers.Geometry.MultiPolygon"&&(polygones=polygones.components);if(polygones instanceof Array==0)throw new Error("new MultiPolygone : Param\u00e8tre invalide");$.each(polygones,function(index,value){value instanceof Polygone?that.polygones.push(value):that.polygones.push(new Polygone(value,proj))});if(that.polygones.length===0)throw new Error("new MultiPolygone : Le multipolygone doit \u00eatre compos\u00e9 d'au moins 1 polygone")}return MultiPolygone.prototype.obtenirProjection=function(){return this.projection},MultiPolygone.prototype.definirProjection=function(proj){if(typeof proj!="string"||proj.toUpperCase().substr(0,5)!=="EPSG:"||proj.substr(5)!==proj.substr(5).match(/[0-9]+/)[0])throw new Error("MultiPolygone.definirProjection : Projection EPSG invalide");this.projection= -proj},MultiPolygone.prototype.obtenirPerimetre=function(){return this._obtenirGeomOL().getGeodesicLength(this.projection)},MultiPolygone.prototype.obtenirSuperficie=function(){return this._obtenirGeomOL().getGeodesicArea(this.projection)},MultiPolygone.prototype.projeter=function(arg1,arg2){var dest,source;arg2?(source=arg1,dest=arg2):(source=this.projection,dest=arg1);if(typeof source!="string"||source.toUpperCase().substr(0,5)!=="EPSG:"||source.substr(5)!==source.substr(5).match(/[0-9]+/)[0])throw new Error("MultiPolygone.projeter : Projection source invalide");if(typeof dest!="string"||dest.toUpperCase().substr(0,5)!=="EPSG:"||dest.substr(5)!==dest.substr(5).match(/[0-9]+/)[0])throw new Error("MultiPolygone.projeter : Projection voulue invalide");var projSource=new OpenLayers.Projection(source),projDest=new OpenLayers.Projection(dest),polyOL=this._obtenirGeomOL(),polyProj=polyOL.transform(projSource,projDest);return new MultiPolygone(polyProj,dest)},MultiPolygone.prototype.obtenirTypeClasse= -function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},MultiPolygone.prototype._obtenirGeomOL=function(tolerance){var polygoneOL=[];return $.each(this.polygones,function(index,value){polygoneOL.push(value._obtenirGeomOL(tolerance))}),new OpenLayers.Geometry.MultiPolygon(polygoneOL)},MultiPolygone}),define("occurence",["limites","style","point","ligne","polygone","multiPoint","multiLigne","multiPolygone","aide","evenement"],function(Limites,Style,Point,Ligne,Polygone,MultiPoint,MultiLigne,MultiPolygone,Aide,Evenement){function Occurence(geometrie,proprietes,style,opt){this._init(geometrie,proprietes,style,opt)}return Occurence.prototype=new Evenement,Occurence.prototype.constructor=Occurence,Occurence.prototype._init=function(geometrie,proprietes,style,opt){opt=opt||{};if(geometrie&&geometrie.CLASS_NAME==="OpenLayers.Feature.Vector"){var vectorOL=geometrie;proprietes=proprietes||vectorOL.attributes,opt._keepFeature||(geometrie=vectorOL.geometry)}this.styles= -{},this._definirGeometrie(geometrie),this.definirProprietes(proprietes),this.accepterModifications(),this.selectionnee=!1,this.definirStyle(style)},Occurence.prototype.estSelectionnee=function(){return this.selectionnee},Occurence.prototype.selectionner=function(){this.estDansCluster||this.appliquerStyle("select"),this.selectionnee=!0,this.declencher({type:"occurenceSelectionnee"}),this.vecteur&&(this.vecteur.obtenirTypeClasse()==="VecteurCluster"&&this.vecteur.rafraichirClusters(),this.vecteur.declencher({type:"vecteurOccurenceSelectionnee",occurence:this}))},Occurence.prototype.deselectionner=function(){this.estDansCluster||this.appliquerStyle("defaut"),this.selectionnee=!1,this.declencher({type:"occurenceDeselectionnee"}),this.vecteur&&(this.vecteur.obtenirTypeClasse()==="VecteurCluster"&&this.vecteur.rafraichirClusters(!0),this.vecteur.declencher({type:"vecteurOccurenceDeselectionnee",occurence:this}))},Occurence.prototype.estVisible=function(){return this._feature.onScreen()},Occurence -.prototype.estAffichee=function(){return this._feature.getVisibility()},Occurence.prototype.obtenirTypeGeometrie=function(){return this.type},Occurence.prototype.obtenirProprietes=function(){return this._feature?this._feature.attributes:undefined},Occurence.prototype.definirProprietes=function(proprietes){if(proprietes&&!$.isPlainObject(proprietes))throw new Error("Occurence.definirProprietes : Param\u00e8tre invalide");this.proprietesOriginales||(this.modifiee=!0,this.proprietesOriginales=$.extend(!0,{},this.obtenirProprietes())),this.proprietes=proprietes||{},this._feature.attributes=this.proprietes,this.rafraichir(),this.declencher({type:"occurenceModifiee",modif:proprietes,modifType:"objetProprietes"}),this.vecteur&&this.vecteur.declencher({type:"vecteurOccurenceModifiee",occurence:this,modif:proprietes,modifType:"objetProprietes"})},Occurence.prototype.obtenirPropriete=function(propriete){if(!propriete)return undefined;var obj=this._feature.attributes;propriete[0]==="/"&&(propriete= -propriete.substr(1),obj=this);var proprieteSplited=propriete.split(".");return $.each(proprieteSplited,function(key,value){if(!obj)return undefined;obj=obj[value]}),obj},Occurence.prototype.definirPropriete=function(propriete,valeur){if(typeof propriete!="string")throw new Error("Occurence.definirPropriete : Nom de la propri\u00e9t\u00e9 invalide");var obj=this._feature.attributes;propriete[0]==="/"&&(propriete=propriete.substr(1),obj=this);var proprieteSplited=propriete.split("."),dernierePropriete=proprieteSplited.pop();$.each(proprieteSplited,function(key,value){if(obj[value]){obj=obj[value];if(!$.isPlainObject(obj)&&!$.isArray(obj))throw new Error("Occurence.definirPropriete : Nom de la propri\u00e9t\u00e9 invalide")}else obj[value]={},obj=obj[value]}),this.proprietesOriginales||(this.modifiee=!0,this.proprietesOriginales=$.extend(!0,{},this.obtenirProprietes())),obj[dernierePropriete]=valeur,this.proprietes=this._feature.attributes,this.rafraichir(),this.declencher({type:"occurenceModifiee" -,modif:{propriete:propriete,valeur:valeur},modifType:"propriete"}),this.vecteur&&this.vecteur.declencher({type:"vecteurOccurenceModifiee",occurence:this,modif:{propriete:propriete,valeur:valeur},modifType:"propriete"})},Occurence.prototype.obtenirErreurs=function(){return this.erreurs},Occurence.prototype.obtenirErreur=function(propriete){if(!propriete)return undefined;var obj=this.erreurs,proprieteSplited=propriete.split(".");return $.each(proprieteSplited,function(key,value){if(!obj)return undefined;obj=obj[value]}),obj},Occurence.prototype.definirErreurs=function(erreurs,categorie){categorie?(this.erreurs||(this.erreurs={}),this.erreurs[categorie]=erreurs):this.erreurs=erreurs||{}},Occurence.prototype.definirErreur=function(propriete,valeur){if(typeof propriete!="string")throw new Error("Occurence.definirErreur : Nom de la propri\u00e9t\u00e9 invalide");var obj=this.erreurs?this.erreurs:this.erreurs={},proprieteSplited=propriete.split("."),dernierePropriete=proprieteSplited.pop(),premierePropriete -;proprieteSplited&&(premierePropriete=proprieteSplited.shift(),obj=obj[premierePropriete]?obj[premierePropriete]:this.erreurs[premierePropriete]={}),$.each(proprieteSplited,function(key,value){obj=obj[value];if(!obj)throw new Error("Occurence.definirErreur : Nom de la propri\u00e9t\u00e9 invalide")}),obj[dernierePropriete]=valeur},Occurence.prototype.obtenirStyle=function(regle,verifierVecteur,verifierFiltre){regle=regle||"courant",regle=regle==="courant"?this.regleCourant:regle;if(!this.styles[regle]||!this.styles[regle].obtenirTypeClasse||!this.styles[regle].obtenirTypeClasse()==="Style"){var style;return verifierVecteur==1&&this.vecteur&&(style=this.vecteur.styles[regle],style&&verifierFiltre===!0&&(style=style.obtenirStyleFiltreParOccurence(this))),style}return this.styles[regle]},Occurence.prototype.definirStyle=function(style,regle){regle=regle||"defaut";if(typeof regle!="string")throw new Error("Occurence.definirStyle : R\u00e8gle du style invalide");style&&style.obtenirTypeClasse&& -style.obtenirTypeClasse()==="Style"?(this.styles[regle]=style.cloner(),this.styles[regle].parent=this):$.isPlainObject(style)?(this.styles[regle]=new Style(style),this.styles[regle].parent=this):this.styles[regle]=undefined,(!this.regleCourant||this.regleCourant===regle)&&this.appliquerStyle(this.regleCourant)},Occurence.prototype.appliquerStyle=function(regle,survol){regle=regle||"defaut";if(typeof regle!="string")throw new Error("Occurence.appliquerStyle : R\u00e8gle du style invalide");regle==="courant"&&(regle=this.regleCourant),this.regleCourant=regle;if(survol===!1)this.survolStyleActif=!1;else if(survol||this.survolStyleActif)survol==1&&(this.survolStyleActif=!0),this._definirOverStyle(survol),regle="over";this.styles[regle]?(this._feature.style=this.styles[regle]._getStyleOptionsOL(),this._feature.renderIntent=undefined):(this._feature.style=undefined,regle=regle==="defaut"?"default":regle,this._feature.renderIntent=regle),this.rafraichir()},Occurence.prototype._definirOverStyle= -function(type){type=type==="survolPlus"?"survolPlus":"survol";var opacite=type==="survolPlus"?"0.7":"0.6",styleMap;try{styleMap=this.vecteur._layer.styleMap.styles}catch(e){return!1}if(this.obtenirStyle(type)){var styleCourant;this.obtenirStyle("courant")?styleCourant=this.obtenirStyle("courant").cloner():styleCourant=new Style;var styleSurvol=this.obtenirStyle(type);$.extend(styleCourant.propriete,styleSurvol.propriete),this.definirStyle(styleCourant,"over")}else if(this.obtenirStyle("courant")){var style=this.obtenirStyle("courant").cloner();style.propriete.opacite=opacite,this.definirStyle(style,"over")}else{this.definirStyle(undefined,"over");if(this.vecteur&&this.vecteur.styles&&this.vecteur.styles[type]){var courantStyle=this.vecteur.styles[this.regleCourant]||this.vecteur.styles.defaut,survolStyle=this.vecteur.styles[type];courantStyle&&(survolStyle.defautPropriete=$.extend({},courantStyle.defautPropriete,courantStyle.propriete)),styleMap.over=survolStyle._getStyleOL()}else{try{styleMap -[this.regleCourant]?styleMap.over=styleMap[this.regleCourant].clone():styleMap.over=styleMap["default"].clone()}catch(e){styleMap.over=(new Style)._getStyleOL()}styleMap.over.defaultStyle.fillOpacity=opacite}}return!0},Occurence.prototype.obtenirProprieteStyle=function(nom,regle,evaluer){regle=regle||"courant",regle=regle==="courant"?this.regleCourant:regle;var style=this.obtenirStyle(regle,!0,!0);if(style){var propriete=style.obtenirPropriete(nom),regex=/^\${.+}$/;return evaluer&&propriete!==undefined&®ex.test(propriete)?this.obtenirPropriete(propriete.substring(2,propriete.length-1)):propriete}return undefined},Occurence.prototype.definirProprieteStyle=function(nom,valeur,regle){if(typeof nom!="string")throw new Error("Occurence.definirProprieteStyle : Nom de la propri\u00e9t\u00e9 invalide");regle=regle||"courant",regle=regle=="courant"?this.regleCourant:regle;if(this.obtenirStyle(regle))this.obtenirStyle(regle).definirPropriete(nom,valeur);else if(this.obtenirStyle(regle,!0,!0)){ -var style=this.obtenirStyle(regle,!0,!0);$.extend(style.defautPropriete,style.propriete),style.propriete={},this.definirStyle(style,regle),this.definirProprieteStyle(nom,valeur,regle)}else{var opt={};opt[nom]=valeur,this.definirStyle(new Style(opt),regle)}this.styles[regle]&&$.isEmptyObject(this.styles[regle].propriete)&&delete this.styles[regle],this.appliquerStyle("courant")},Occurence.prototype.obtenirLimites=function(){if(this.limites)return this.limites;var limitesOL=this._obtenirGeomOL().getBounds();return new Limites(limitesOL.left,limitesOL.bottom,limitesOL.right,limitesOL.top)},Occurence.prototype.cacher=function(tousLesStyles){this.definirProprieteStyle("visible","none"),this.vecteur&&this.vecteur.carte.gestionCouches.enleverOccurenceSurvol(this),this.rafraichir(),tousLesStyles&&(this.definirProprieteStyle("visible","none","defaut"),this.definirProprieteStyle("visible","none","select"))},Occurence.prototype.afficher=function(tousLesStyles){this.definirProprieteStyle("visible", -undefined),this.rafraichir(),tousLesStyles&&(this.definirProprieteStyle("visible",undefined,"defaut"),this.definirProprieteStyle("visible",undefined,"select"))},Occurence.prototype.rafraichir=function(){this.vecteur&&this.vecteur.rafraichir(this)},Occurence.prototype.ouvrirInfobulle=function(args){var that=this;args=args||{};if(!this.estAffichee()&&!args.force)return;var position=OpenLayers.LonLat.fromString(this._obtenirGeomOL().getCentroid().toShortString()),dimension=args.dimension?new OpenLayers.Size(args.dimension[0],args.dimension[1]):null,html=args.html||"

        Aucun contenu.

        ",callbackFermeture=args.callbackFermeture||null,aFermerBouton=args.aFermerBouton===undefined?!0:Aide.toBoolean(args.aFermerBouton);this.fermerInfobulle(),this._infobulle=new OpenLayers.Popup.FramedCloud(null,position,dimension,html,null,aFermerBouton,function(e){callbackFermeture.call(that,e)}),args.minDimension&&args.minDimension.length===2&&(this._infobulle.minSize=new OpenLayers.Size(args.minDimension[0] -,args.minDimension[1])),args.maxDimension&&args.maxDimension.length===2&&(this._infobulle.maxSize=new OpenLayers.Size(args.maxDimension[0],args.maxDimension[1])),this.vecteur&&this.vecteur.carte._carteOL.addPopup(this._infobulle)},Occurence.prototype.fermerInfobulle=function(){this._infobulle&&(this.vecteur&&this.vecteur.carte._carteOL.removePopup(this._infobulle),this._infobulle=null)},Occurence.prototype._definirGeometrie=function(geometrie){var proprietes=this.obtenirProprietes();delete this._feature,delete this.x,delete this.x,delete this.points,delete this.lignes,delete this.polygones,delete this.gauche,delete this.droite,delete this.haut,delete this.bas;if(!geometrie)this._feature=new OpenLayers.Feature.Vector,this.type=undefined;else if(geometrie.CLASS_NAME!==undefined){geometrie.CLASS_NAME==="OpenLayers.Feature.Vector"?(this._feature=geometrie,geometrie=geometrie.geometry,this.id=this._feature.id):this._feature=new OpenLayers.Feature.Vector(geometrie);if(geometrie.CLASS_NAME==="OpenLayers.Geometry.Polygon" -)this.type="Polygone",geometrie=new Polygone(geometrie);else if(geometrie.CLASS_NAME==="OpenLayers.Geometry.MultiPolygon")this.type="MultiPolygone",geometrie=new MultiPolygone(geometrie);else if(geometrie.CLASS_NAME==="OpenLayers.Geometry.MultiLineString")this.type="MultiLigne",geometrie=new MultiLigne(geometrie);else if(geometrie.CLASS_NAME==="OpenLayers.Geometry.MultiPoint")this.type="MultiPoint",geometrie=new MultiPoint(geometrie);else if(geometrie.CLASS_NAME==="OpenLayers.Geometry.Point")this.type="Point",geometrie=new Point(geometrie);else if(geometrie.CLASS_NAME==="OpenLayers.Geometry.LineString"||geometrie.CLASS_NAME==="OpenLayers.Geometry.LinearRing")this.type="Ligne",geometrie=new Ligne(geometrie)}else if(geometrie._obtenirGeomOL){var geomOL=geometrie._obtenirGeomOL();this._feature=new OpenLayers.Feature.Vector(geomOL),this.type=geometrie.obtenirTypeClasse()}if(!this._feature)throw new Error("Occurence._definirGeometrie : La g\u00e9om\u00e9trie est invalide");$.extend(this,geometrie -,{projeter:Occurence.prototype.projeter});if(!this.id){var type=this.type?this.type+"_":"";this.id=this.obtenirTypeClasse()+"_"+type+this._feature.id.substr(this._feature.id.lastIndexOf("_")+1)}return this._feature.id=this.id,this._feature.attributes=proprietes||{},this},Occurence.prototype._obtenirGeometrie=function(){switch(this.obtenirTypeGeometrie()){case"Point":return new Point(this.x,this.y,this.obtenirProjection());case"Ligne":return new Ligne(this.points,this.obtenirProjection());case"Polygone":return new Polygone(this.lignes,this.obtenirProjection());case"MultiPolygone":return new MultiPolygone(this.polygones,this.obtenirProjection());case"Limites":return new Limites(this.gauche,this.bas,this.droite,this.haut);default:return undefined}},Occurence.prototype.majGeometrie=function(geometrie){return this.vecteur&&(this.vecteur.carte.gestionCouches.enleverOccurenceSurvol(this),this.vecteur._layer.removeFeatures(this._feature)),this.geometrieOriginale||(this.modifiee=!0,this.geometrieOriginale= -this._obtenirGeometrie()),this._definirGeometrie(geometrie),this.vecteur&&(this.vecteur._layer.addFeatures(this._feature),this.appliquerStyle(this.regleCourant,!1)),this.declencher({type:"occurenceModifiee",modif:geometrie,modifType:"g\u00e9om\u00e9trie"}),this.vecteur&&this.vecteur.declencher({type:"vecteurOccurenceModifiee",occurence:this,modifGeometrie:geometrie,modifType:"g\u00e9om\u00e9trie"}),this},Occurence.prototype.annulerModifications=function(){this.modifiee&&(this.geometrieOriginale&&(this.majGeometrie(this.geometrieOriginale),this.geometrieOriginale=undefined),this.proprietesOriginales&&(this.definirProprietes($.extend(!0,{},this.proprietesOriginales)),this.proprietesOriginales=undefined),this.modifiee=!1),this.ajoutee=!1,this.enlevee=!1},Occurence.prototype.accepterModifications=function(){this.modifiee&&(delete this.geometrieOriginale,delete this.proprietesOriginales,this.modifiee=!1),this.ajoutee=!1,this.enlevee=!1},Occurence.prototype.projeter=function(arg1,arg2){var geom= -this._obtenirGeometrie().projeter(arg1,arg2);return this.cloner()._definirGeometrie(geom)},Occurence.prototype.cloner=function(garderStyleVecteur){return garderStyleVecteur?new Occurence(this._obtenirGeometrie(),this.proprietes,this.obtenirStyle(this.regleCourant,!0,!0)):new Occurence(this._obtenirGeometrie(),this.proprietes,this.styles)},Occurence.prototype.reinitialiserAttributs=function(){this.definirProprietes(),delete this.proprietesOriginales,this.modifiee=this.geometrieOriginale?!0:!1},Occurence}),define("couche",["evenement","aide"],function(Evenement,Aide){var compteur=0;function Couche(options){this.options=options||{},this._layer,this.carte,this.defautOptions={visible:!0,active:!1}}return Couche.prototype=new Evenement,Couche.prototype.constructor=Couche,Couche.prototype._init=function(){this.defautOptions.groupe="Autres Couches",Aide.toBoolean(this.options.fond)&&(this.defautOptions.groupe="Fond de carte"),this.options=$.extend({},this.defautOptions,Aide.obtenirConfig("Couche" -),Aide.obtenirConfig(this.obtenirTypeClasse()),this.options);var opt=this.options,printOptions={fromLayer:!0};if(opt.impressionUrl){var format=opt.format||"png";printOptions={url:opt.impressionUrl,layers:opt.impressionNom||opt.nom,format:"image/"+format,mapformat:format}}this._optionsOL=$.extend({isBaseLayer:Aide.toBoolean(opt.fond),minScale:opt.echelleMin,maxScale:opt.echelleMax,group:opt.groupe,attribution:opt.droit,typeContexte:opt.typeContexte,displayInLayerSwitcher:Aide.toBoolean(opt.visible),legende:Aide.toBoolean(opt.legende),visibility:Aide.toBoolean(opt.active),opacity:opt.opacite?opt.opacite/100:1,zTree:opt.ordreArborescence,printOptions:printOptions},this._optionsOL,this.options._optionsOL)},Couche.prototype._ajoutCallback=function(target,callback,optCallback){this.options.id?(this.id=this.options.id,target.obtenirCoucheParId(this.options.id)&&(this.id+=this._getLayer().id.substr(this._getLayer().id.lastIndexOf("_")+1),console.warn("Ajout d'une couche: L'identifiant '"+this.options -.id+"' n'est pas unique. L'identifiant de la couche a \u00e9t\u00e9 modifi\u00e9 pour '"+this.id+"'"))):this.id="couche_"+this._getLayer().id.substr(this._getLayer().id.lastIndexOf("_")+1),this._getLayer().id=this.id,typeof callback=="function"&&callback.call(target,this,optCallback),this._getLayer().events.register("loadstart",this,function(e){this.afficherChargement()}),this._getLayer().events.register("loadend",this,function(e){this.masquerChargement()})},Couche.prototype._getLayer=function(){if(!this._layer)throw new Error("Igo.Couches."+this.constructor.name+"._getLayer()");return this._layer},Couche.prototype.obtenirTitre=function(){if(this._getLayer())return this._getLayer().name},Couche.prototype.obtenirGroupe=function(){return this.options.groupe},Couche.prototype.obtenirId=function(){return this.id},Couche.prototype.definirCarte=function(carte){this.carte=carte},Couche.prototype.estFond=function(){return this._layer?this._getLayer().isBaseLayer:this.options.fond},Couche.prototype -.estActive=function(){return this._getLayer().getVisibility()},Couche.prototype.activer=function(bool){if(bool===!1){this.desactiver();return}this.estFond()&&this.carte._carteOL.setBaseLayer(this._getLayer()),this._getLayer().setVisibility(!0)},Couche.prototype.desactiver=function(bool){if(bool===!1){this.activer();return}if(this.estFond())return;this._getLayer().setVisibility(!1)},Couche.prototype.definirOpacite=function(opacite){this._getLayer().setOpacity(opacite)},Couche.prototype.obtenirOrdreAffichageBase=function(){return this.estFond()?this.carte._getCarte().Z_INDEX_BASE.BaseLayer:this.carte._getCarte().Z_INDEX_BASE.Overlay},Couche.prototype.obtenirOrdreAffichage=function(){return Number(this._getLayer().getZIndex())},Couche.prototype.definirOrdreAffichage=function(ordreAffichage){if(!ordreAffichage){var oAffichage;this.options.ordreAffichage?oAffichage=this.options.ordreAffichage:(compteur+=2,oAffichage=compteur),ordreAffichage=this.obtenirOrdreAffichageBase()+Number(oAffichage) -}isNaN(ordreAffichage)||(this._getLayer().setZIndex(ordreAffichage),this._getLayer().z_index_default=ordreAffichage)},Couche.prototype.obtenirTypeClasse=function(){return this.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]},Couche.prototype.obtenirProjection=function(){return this._layer.projection.projCode},Couche.prototype.obtenirElementDivArbo=function(){var that=this,result=!1;return this._layer.layerContainer&&$.each(this._layer.layerContainer.childNodes,function(index,node){if(node.text==that.obtenirTitre())return result=node.ui.elNode,!1}),result},Couche.prototype.afficherChargement=function(){var div=this.obtenirElementDivArbo(),$layerArboLoading=$(div).find(".layerArboLoading");$layerArboLoading.length?$layerArboLoading.show():div&&$(div).find(".x-tree-node-anchor").after('Chargement')},Couche.prototype.masquerChargement=function(){var div=this.obtenirElementDivArbo -();div&&$(div).find(".layerArboLoading").hide()},Couche}),define("blanc",["couche"],function(Couche){function Blanc(options){this.options=options||{},this.options.fond=!0,this._init(options)}return Blanc.prototype=new Couche,Blanc.prototype.constructor=Blanc,Blanc.prototype._init=function(){Couche.prototype._init.call(this),this.options.titre||(this.options.titre="Blanc"),this._layer=new OpenLayers.Layer(this.options.titre,this._optionsOL)},Blanc.prototype._ajoutCallback=function(target,callback,optCallback){this._layer.numZoomLevels=this.carte._carteOL.numZoomLevels,Couche.prototype._ajoutCallback.call(this,target,callback,optCallback)},Blanc}),define("gestionCouches",["evenement","couche","blanc","limites","aide"],function(Evenement,Couche,Blanc,Limites,Aide){function GestionCouches(carte){this.listeCouches=[],this.listeOccurencesSurvols=[],this.carte=carte,this.controles=new GestionCouches.Controles(this)}return GestionCouches.prototype=new Evenement,GestionCouches.prototype.constructor= -GestionCouches,GestionCouches.prototype.ajouterCouches=function(couches){var that=this;$.each(couches,function(key,value){that.ajouterCouche(value)})},GestionCouches.prototype.ajouterCouche=function(couche){if(!(couche instanceof Couche))throw new Error("Igo.Carte.ajouterCouche(couche) a besoin d'un objet de type Igo.Couches");couche.definirCarte(this.carte),couche._=this,couche._ajoutCallback(this,this._ajouterCoucheCallback)},GestionCouches.prototype._ajouterCoucheCallback=function(couche){var that=this;couche._getLayer()&&(this.listeCouches.push(couche),setTimeout(function(){that.carte._carteOL.addLayer(couche._getLayer()),couche.definirOrdreAffichage(),couche.estFond()&&couche.desactiver(!Aide.toBoolean(couche.options.active))},1),this.declencher({type:"ajouterCouche",couche:couche}))},GestionCouches.prototype.enleverCouche=function(couche){var idx=this.listeCouches.indexOf(couche);idx!==-1&&(this.listeCouches.splice(idx,1),this.carte._carteOL.removeLayer(couche._getLayer()),couche. -declencher({type:"enleverCouche"}),this.declencher({type:"enleverCouche",couche:couche}))},GestionCouches.prototype.enleverToutesLesCouches=function(){var that=this,i=0;this.ajouterCouche(new Blanc);while(this.listeCouches.length>i)that.enleverCouche(that.listeCouches[0]);this.declencher({type:"enleverToutesLesCouches"})},GestionCouches.prototype.obtenirCouches=function(trier){return trier?this.listeCouches.sort(function(a,b){return a.obtenirOrdreAffichage()-b.obtenirOrdreAffichage()}):this.listeCouches},GestionCouches.prototype.obtenirCouchesParTitre=function(titre){var couches=[];return $.each(this.listeCouches,function(index,value){value.obtenirTitre()===titre&&couches.push(value)}),couches},GestionCouches.prototype.trouverCouches=function(regex,opt){opt=opt||{};var testerTitre=opt.testerTitre!==!1?!0:!1,testerGroupe=opt.testerGroupe!==!1?!0:!1;if(typeof regex=="string"){var ignorerCase=opt.ignorerCase!==!1?"i":"",string=regex;opt.exacte!==!0&&(string=string.replace(/ /g,".*")),regex=new -RegExp(string,ignorerCase)}else if(!(regex instanceof RegExp))return!1;var couches=[];return $.each(this.listeCouches,function(index,value){(testerTitre&®ex.test(value.obtenirTitre())||testerGroupe&®ex.test(value.obtenirGroupe()))&&couches.push(value)}),couches},GestionCouches.prototype.obtenirCouchesDeBase=function(){var couches=[];return $.each(this.listeCouches,function(index,value){value.estFond()&&couches.push(value)}),couches},GestionCouches.prototype.obtenirCouchesParType=function(type,trier){$.isArray(type)||(type=[type]);var couches=[];return $.each(this.listeCouches,function(key,value){type.indexOf(value.obtenirTypeClasse())!==-1&&couches.push(value)}),trier?couches.sort(function(a,b){return a.obtenirOrdreAffichage()-b.obtenirOrdreAffichage()}):couches},GestionCouches.prototype.obtenirCoucheParId=function(id){var couche;return $.each(this.listeCouches,function(key,value){if(value.obtenirId()===id)return couche=value,!1}),couche},GestionCouches.prototype.obtenirCouchesParTypePermis= -function(type,trier){var couches=[];return $.each(this.listeCouches,function(key,value){(value.obtenirTypeClasse()==="Vecteur"||value.obtenirTypeClasse()==="VecteurCluster"||value.obtenirTypeClasse()==="WFS")&&value.options.protege!==!0&&(value.options.typeGeometriePermise===undefined||value.options.typeGeometriePermise===type)&&couches.push(value)}),trier?couches.sort(function(a,b){return a.obtenirOrdreAffichage()-b.obtenirOrdreAffichage()}):couches},GestionCouches.prototype.obtenirOccurencesSelectionnees=function(groupe){if(groupe==0){var occurences=[];return $.each(this.obtenirCouchesParType(["Vecteur","VecteurCluster","WFS"]),function(key,value){occurences=occurences.concat(value.obtenirOccurencesSelectionnees())}),occurences}var occurences={};return $.each(this.obtenirCouchesParType(["Vecteur","VecteurCluster","WFS"]),function(key,value){occurences[value.obtenirId()]=value.obtenirOccurencesSelectionnees()}),occurences},GestionCouches.prototype.obtenirOccurenceParId=function(id){var occurence -;return $.each(this.obtenirCouchesParType(["Vecteur","VecteurCluster","WFS"]),function(key,value){occurence=value.obtenirOccurenceParId(id);if(occurence)return!1}),occurence},GestionCouches.prototype.deselectionnerToutesOccurences=function(){$.each(this.obtenirCouchesParType(["Vecteur","VecteurCluster","WFS"]),function(key,value){value.deselectionnerTout()})},GestionCouches.prototype.zoomerSelections=function(maxZoom){var occurences=this.obtenirOccurencesSelectionnees(!1);this.zoomerOccurences(occurences,maxZoom)},GestionCouches.prototype.zoomerOccurences=function(occurences,maxZoom){if(!occurences||occurences.length===0)return!1;var limiteGauche=null,limiteDroite=null,limiteHaut=null,limiteBas=null;$.each(occurences,function(indice,occurence){var limitesOccurence=occurence.obtenirLimites();if(limiteGauche==null||limiteGauche>limitesOccurence.gauche)limiteGauche=limitesOccurence.gauche;if(limiteBas==null||limiteBas>limitesOccurence.bas)limiteBas=limitesOccurence.bas;if(limiteDroite==null|| -limiteDroite0){parser=this.parseGeometry[type.toLowerCase()];if(!parser)throw new TypeError("Unsupported geometry type: "+type);geometry=parser.apply(this,[nodeList[0]]);var proj=nodeList[0].getAttribute("srsName");proj&&(this.externalProjection=new OpenLayers.Projection(proj)),this.internalProjection&&this.externalProjection&&geometry.transform(this.externalProjection,this.internalProjection);break}}var attributes;this.extractAttributes&&(attributes=this.parseAttributes(node),delete attributes.boundedBy,delete attributes.msGeometry);var geometrie;if(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPolygon")geometrie=new MultiPolygone(geometry);else if(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiLineString")geometrie=new MultiLigne(geometry);else if(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPoint")geometrie=new MultiPoint(geometry);else if(geometry.CLASS_NAME=="OpenLayers.Geometry.Polygon")geometrie=new Polygone(geometry);else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString" -)geometrie=new Ligne(geometry);else{if(geometry.CLASS_NAME!="OpenLayers.Geometry.Point")return console.log(geometry.CLASS_NAME),!0;geometrie=new Point(geometry)}var feature=new Occurence(geometrie,attributes);return feature}});this._parser=new format({internalProjection:new OpenLayers.Projection(carteProj)})}return AnalyseurGML.prototype.lire=function(gml){return this._parser.read(gml)},AnalyseurGML.prototype.lireUrl=function(opt){opt=opt||{};var url=opt.url,callback=opt.callback;if(!callback||!url)return!1;var that=this;$.ajax({url:url,success:function(result,status,xhr){var rep=that.lire(result);callback&&callback.call(that,rep,status,xhr)},error:function(xhr,status,error){callback&&callback.call(that,error,status,xhr)}})},AnalyseurGML.prototype.ecrire=function(occurences){if(!occurences)return!1;occurences.obtenirTypeClasse&&(occurences.obtenirTypeClasse()==="Vecteur"||occurences.obtenirTypeClasse()==="VecteurCluster"||occurences.obtenirTypeClasse()==="WFS")&&(occurences=occurences.obtenirOccurences -());if(occurences.obtenirTypeClasse&&occurences.obtenirTypeClasse()==="Occurence")occurences=[occurences];else if(occurences._obtenirGeomOL)return this._parser.write(occurences._obtenirGeomOL());var listFeaturesOL=[];return $.each(occurences,function(key,value){if(!value.obtenirTypeClasse||value.obtenirTypeClasse()!=="Occurence")return!0;listFeaturesOL.push(value._feature)}),this._parser.write(listFeaturesOL)},AnalyseurGML}),define("vecteur",["couche","occurence","limites","style","aide"],function(Couche,Occurence,Limites,Style,Aide){function Vecteur(options){this.options=options||{},this.garderHistorique=this.options.garderHistorique,this._historiqueOccurencesAjoutees=[],this._historiqueOccurencesEnlevees=[],this.defautOptions.selectionnable=!0,this.listeOccurences=[],this.styles={},this.templates={},this.obtenirTypeClasse()==="Vecteur"&&this._init()}return Vecteur.prototype=new Couche,Vecteur.prototype.constructor=Vecteur,Vecteur.prototype._init=function(){if(!this.options.layerOL){Couche -.prototype._init.call(this);var titre=this.options.titre||"vecteur";this._optionsOL.rendererOptions={zIndexing:!0},this._layer=new OpenLayers.Layer.Vector(titre,this._optionsOL);if(!this._optionsOL.styleMap){var styles=this.options.styles||new Style;this.definirStyles(styles)}}else this._layer=this.options.layerOL},Vecteur.prototype._ajoutCallback=function(target,callback,optCallback){var that=this;Couche.prototype._ajoutCallback.call(this,target,callback,optCallback),this.controles=new Vecteur.Controles(this),that.options.source&&that.options.sourceType&&require(["analyseur"+that.options.sourceType],function(Analyseur){if(!Analyseur){var message='Erreur: Couche vecteur "'+that.obtenirTitre()+'" (id: '+that.obtenirId()+")
        ";message+='\u00c9chec lors du chargement "'+that.options.donnees+'"
        ',message+="Message: Type de donnees inconnu.",Aide.afficherMessageConsole(message)}var analyseur=new Analyseur;analyseur.lireUrl({url:Aide.utiliserProxy(that.options.source),callback:function(reponse -,status){if(status==="success")that.ajouterOccurences(reponse);else{var message='Erreur: Couche vecteur "'+that.obtenirTitre()+'" (id: '+that.obtenirId()+")
        ";message+='\u00c9chec lors du chargement "'+that.options.donnees+'"
        ',message+="Message: "+reponse,Aide.afficherMessageConsole(message)}}})})},Vecteur.prototype.obtenirOccurences=function(){return this.listeOccurences},Vecteur.prototype.obtenirOccurencesModifiees=function(ajoutEtRetrait){var occurencesModifiees=[];return $.each(this.obtenirOccurences(),function(key,occurence){ajoutEtRetrait&&(occurence.modifiee||occurence.ajoutee||occurence.enlevee)?occurencesModifiees.push(occurence):occurence.modifiee&&!occurence.ajoutee&&!occurence.enlevee&&occurencesModifiees.push(occurence)}),occurencesModifiees},Vecteur.prototype.obtenirOccurencesEnlevees=function(){return this._historiqueOccurencesEnlevees},Vecteur.prototype.obtenirOccurencesAjoutees=function(){return this._historiqueOccurencesAjoutees},Vecteur.prototype.selectionnerOccurence= -function(occurence){if(!occurence||!occurence._feature)return;occurence.selectionner()},Vecteur.prototype.obtenirOccurencesSelectionnees=function(){var occurences=[];return $.each(this.obtenirOccurences(),function(key,value){value.selectionnee&&occurences.push(value)}),occurences},Vecteur.prototype.obtenirOccurenceParId=function(id){var occurence;return $.each(this.obtenirOccurences(),function(key,value){if(value.id===id)return occurence=value,!1}),occurence},Vecteur.prototype.deselectionnerOccurence=function(occurence){if(!occurence||!occurence._feature)return;occurence.deselectionner()},Vecteur.prototype.deselectionnerTout=function(opt){var that=this,opt=opt||{};$.each(this.obtenirOccurencesSelectionnees(),function(key,value){(!opt.exceptions||$.inArray(value,opt.exceptions)===-1)&&that.deselectionnerOccurence(value)})},Vecteur.prototype.selectionnerTout=function(opt){var that=this,opt=opt||{};$.each(this.obtenirOccurences(),function(key,value){(!opt.exceptions||$.inArray(value,opt.exceptions -)===-1)&&that.selectionnerOccurence(value)})},Vecteur.prototype.selectionnerInverse=function(opt){var that=this,opt=opt||{};$.each(this.obtenirOccurences(),function(key,value){if(!opt.exceptions||$.inArray(value,opt.exceptions)===-1)value.selectionnee?that.deselectionnerOccurence(value):that.selectionnerOccurence(value)})},Vecteur.prototype.creerOccurence=function(geometrie,info,opt){opt=opt||{};if(geometrie instanceof Occurence){this.ajouterOccurence(geometrie,opt);return}var creationOccurence={};opt.existe&&(creationOccurence._keepFeature=!0);var occurence=new Occurence(geometrie,info,undefined,creationOccurence);this.ajouterOccurence(occurence,opt)},Vecteur.prototype.ajouterOccurence=function(occurence,opt){opt=opt||{};if(occurence instanceof Occurence==0){this.creerOccurence(occurence,undefined,opt);return}return this.options.typeGeometriePermise&&this.options.typeGeometriePermise!==occurence.type?(console.warn("Cette couche vecteur accepte seulement le type de g\u00e9om\u00e9trie: "+ -this.options.typeGeometriePermise),!1):occurence.type?this.options.protege&&opt.forcer!==!0?(console.warn("Cette couche est prot\u00e9g\u00e9e, elle n'accepte pas l'ajout d'occurrence de cette fa\u00e7on."),!1):(occurence.vecteur=this,this.options.simplificationZoom&&opt.simplificationZoom!==!1&&(occurence._feature.geometry=occurence._obtenirGeomOL(this.carte._carteOL.getResolution()/2)),this.listeOccurences.push(occurence),opt.existe||(occurence._feature.utilisateur=!0,this._layer.addFeatures(occurence._feature)),this.garderHistorique&&(occurence.ajoutee=!0,this._historiqueOccurencesAjoutees.push(occurence)),this.declencher({type:"ajouterOccurence",occurence:occurence}),occurence):(console.warn("L'occurence doit avoir une g\u00e9om\u00e9trie pour \u00eatre ajout\u00e9e \u00e0 la couche vecteur."),!1)},Vecteur.prototype.ajouterOccurences=function(occurences,opt){var that=this;if(!occurences)return!1;$.each(occurences,function(key,value){that.ajouterOccurence(value,opt)}),this.declencher -({type:"ajouterOccurences",occurences:occurences})},Vecteur.prototype.enleverOccurence=function(occurence,opt){var idx=this.listeOccurences.indexOf(occurence);idx!==-1&&(occurence.vecteur=undefined,this.listeOccurences.splice(idx,1),this._layer.removeFeatures(occurence._feature),this.carte.gestionCouches.enleverOccurenceSurvol(occurence),this.garderHistorique&&(occurence.enlevee=!0,occurence.ajoutee?this._historiqueOccurencesAjoutees.remove(occurence):this._historiqueOccurencesEnlevees.push(occurence))),this.declencher({type:"enleverOccurence",occurence:occurence})},Vecteur.prototype.accepterModifications=function(saveFn){var save=saveFn||!1;!save&&this.options.fnSauvegarder&&(save=this.options.fnSauvegarder(this)),save&&($.each(this.obtenirOccurencesModifiees(!0),function(key,occurence){occurence.accepterModifications()}),$.each(this._historiqueOccurencesEnlevees,function(key,occurence){occurence.accepterModifications()}),this._historiqueOccurencesAjoutees=[],this._historiqueOccurencesEnlevees= -[])},Vecteur.prototype.annulerModifications=function(){this.garderHistorique=!1,this.enleverOccurences(this._historiqueOccurencesAjoutees),this._historiqueOccurencesAjoutees=[],this.ajouterOccurences(this._historiqueOccurencesEnlevees),this._historiqueOccurencesEnlevees=[],this.garderHistorique=!0,$.each(this.obtenirOccurencesModifiees(!0),function(key,occurence){occurence.annulerModifications()}),$.each(this._historiqueOccurencesAjoutees,function(key,occurence){occurence.annulerModifications()})},Vecteur.prototype.enleverOccurences=function(occurences,opt){var that=this,occurencesClone=$.extend({},occurences);$.each(occurencesClone,function(key,value){that.enleverOccurence(value,opt)})},Vecteur.prototype.enleverTout=function(opt){this.enleverOccurences(this.listeOccurences,opt)},Vecteur.prototype.cacherOccurence=function(occurence){if(!occurence||occurence.vecteur!==this)return!1;occurence.cacher()},Vecteur.prototype.afficherOccurence=function(occurence){if(!occurence||occurence.vecteur!== -this)return!1;occurence.afficher()},Vecteur.prototype.obtenirLimites=function(){var limitesOL=this._layer.getDataExtent();if(!limitesOL)return!1;var limites=new Limites(limitesOL.left,limitesOL.bottom,limitesOL.right,limitesOL.top);return limites},Vecteur.prototype.zoomerOccurences=function(occurences,maxZoom){if(!occurences){var limitesOL=this._layer.getDataExtent();if(!limitesOL)return!1;var limites=new Limites(limitesOL.left,limitesOL.bottom,limitesOL.right,limitesOL.top);return this.carte.zoomer(limites,maxZoom),!0}this.carte.gestionCouches.zoomerOccurences(occurences,maxZoom)},Vecteur.prototype.zoomerOccurence=function(occurence,maxZoom){this.carte.zoomer(occurence.obtenirLimites(),maxZoom),this.declencher({type:"zoomerOccurence",occurence:occurence})},Vecteur.prototype.obtenirStyles=function(){return this.styles},Vecteur.prototype.definirStyles=function(styles){var that=this;if(styles)if(!styles.obtenirTypeClasse||styles.obtenirTypeClasse()!=="Style"){var styleMap={};$.each(styles -,function(key,style){style.obtenirTypeClasse||(style=new Style(style)),that.styles[key]=style.cloner(),that.styles[key].parent=that,that.styles[key].regle=key,styleMap[key]=that.styles[key]._getStyleOL();if(key==="defaut"){var styleOL=that.styles.defaut._getStyleOL();styleMap["default"]=styleOL,styleMap.defaut=styleOL}}),styleMap.select||(styleMap.select=styleMap["default"].clone(),styleMap.select.defaultStyle.fillColor="#0000FF",styleMap.select.defaultStyle.strokeColor="#0000FF",styleMap.select.defaultStyle.strokeWidth=2,styleMap.select.defaultStyle.graphicZIndex=100),this._optionsOL.styleMap=new OpenLayers.StyleMap(styleMap),this._layer&&(this._layer.styleMap=this._optionsOL.styleMap,this.rafraichir())}else this.definirStyle(styles,"defaut")},Vecteur.prototype.obtenirStyle=function(regle){return regle=regle||"defaut",this.styles[regle]},Vecteur.prototype.definirStyle=function(style,regle){regle||(regle="defaut"),style.obtenirTypeClasse||(style=new Style(style)),this.styles[regle]=style -.cloner(),this.styles[regle].parent=this,this.styles[regle].regle=regle;if(this.styles)if(this._optionsOL.styleMap){if(regle==="defaut"){var styleOL=this.styles.defaut._getStyleOL();this._optionsOL.styleMap.styles["default"]=styleOL,this._optionsOL.styleMap.styles.defaut=styleOL}else regle==="select"&&(this._optionsOL.styleMap.styles.select=this.styles.select._getStyleOL());this._layer&&(this._layer.styleMap=this._optionsOL.styleMap,this.rafraichir())}else this.definirStyles(this.styles)},Vecteur.prototype.rafraichir=function(occurence){if(!occurence)return this._layer.redraw(),this.rafraichirLegende(),!0;this._layer.drawFeature(occurence._feature),this.rafraichirLegende()},Vecteur.prototype.rafraichirLegende=function(){this._layer.arborescence&&(this._layer.arborescence.setRules(),this._layer.arborescence.update())},Vecteur.prototype.obtenirOrdreAffichageBase=function(){return this.carte._getCarte().Z_INDEX_BASE.Vecteur},Vecteur.prototype.enlever=function(){return this.carte.gestionCouches -.enleverCouche(this),!0},Vecteur.Controles=function(_){this._=_;if(this._.options.simplificationZoom){var that=this._;that.carte._carteOL.events.register("zoomend",that.carte._carteOL,function(){var zoom=that.carte.obtenirZoom();if(zoom%2===0)return!0;$.each(that.listeOccurences,function(key,occurence){that._layer.removeFeatures(occurence._feature),occurence._geomSimplifiee||(occurence._geomSimplifiee={}),occurence._geomSimplifiee[zoom]||(occurence._geomSimplifiee[zoom]=occurence._obtenirGeomOL(that.carte._carteOL.getResolution()/2)),occurence._feature.geometry=occurence._geomSimplifiee[zoom],that._layer.addFeatures(occurence._feature)})})}},Vecteur.Controles.prototype.activerDeplacement=function(opt){opt=opt||{},this._dragControl||(this._dragControl=new OpenLayers.Control.DragFeature(this._._layer,{onStart:this._debutDeplacement,onDrag:this._deplacement,onComplete:this._finDeplacement,scope:this}),this._.carte._getCarte().addControl(this._dragControl)),this._dragControl.activate()},Vecteur -.Controles.prototype.desactiverDeplacement=function(){this._dragControl&&this._dragControl.deactivate()},Vecteur.Controles.prototype._debutDeplacement=function(feature){var that=this.scope,occurence=that._.obtenirOccurenceParId(feature.id);that._.declencher({type:"debutDeplacementOccurence",occurence:occurence})},Vecteur.Controles.prototype._deplacement=function(feature){var that=this.scope,occurence=that._.obtenirOccurenceParId(feature.id);occurence.x=feature.geometry.x,occurence.y=feature.geometry.y,that._.declencher({type:"deplacementOccurence",occurence:occurence})},Vecteur.Controles.prototype._finDeplacement=function(feature){var that=this.scope,occurence=that._.obtenirOccurenceParId(feature.id);occurence.x=feature.geometry.x,occurence.y=feature.geometry.y,that._.declencher({type:"finDeplacementOccurence",occurence:occurence})},Vecteur.Controles.prototype.activerSelection=function(opt){opt=opt||{};if(this._.obtenirDeclencheur("occurenceClique",null,this._selection).length)return!1; -this._.ajouterDeclencheur("occurenceClique",this._selection,{scope:this})},Vecteur.Controles.prototype.desactiverSelection=function(){this._.carte.enleverDeclencheur("occurenceClique",null,this._selection)},Vecteur.Controles.prototype._selection=function(e){var that=e.options.scope;if(that._.obtenirId()!==e.occurence.vecteur.obtenirId())return!1;Aide.obtenirNavigateur().obtenirCtrl()||that._.carte.gestionCouches.deselectionnerToutesOccurences(),e.occurence.estSelectionnee()?e.occurence.vecteur.deselectionnerOccurence(e.occurence):e.occurence.vecteur.selectionnerOccurence(e.occurence)},Vecteur}),define("contexteMenuCarte",["contexteMenu","point","polygone","occurence","aide","analyseurGML","fonctions","vecteur"],function(ContexteMenu,Point,Polygone,Occurence,Aide,AnalyseurGML,Fonctions,Vecteur){function ContexteMenuCarte(options){this.options=options||{},this.init()}return ContexteMenuCarte.prototype=new ContexteMenu,ContexteMenuCarte.prototype.constructor=ContexteMenuCarte,ContexteMenuCarte -.prototype.init=function(){var that=this;ContexteMenu.prototype.init.call(this),this.ajouterFonctionsConstruction(this.initCoordonneesSubmenu),this.ajouterFonctionsConstruction(this.initImporterOccurenceSubmenu),this.ajouterFonctionsConstruction(this.initOccurencesSubmenu),this.ajouterFonctionsConstruction(this.initSelectionSubmenu),this.$selecteur.on("mousedown",function(e){e.which===1&&that.contexteMenu.isVisible()&&that.contexteMenu.hide()})},ContexteMenuCarte.prototype.obtenirInformation=function(e){var offset=this.$selecteur.offset(),pixel=new OpenLayers.Pixel(e.pageX-offset.left,e.pageY-offset.top),lonlat=this.options.carte._carteOL.getLonLatFromViewPortPx(pixel),point=new Point(lonlat.lon,lonlat.lat),occurencesSurvolees=this.options.carte.gestionCouches.obtenirListeOccurencesSurvols().slice(),occurencesSelectionnees=this.options.carte.gestionCouches.obtenirOccurencesSelectionnees(!1);return{point:point,occurencesSurvolees:occurencesSurvolees,occurencesSelectionnees:occurencesSelectionnees -}},ContexteMenuCarte.prototype.initCoordonneesSubmenu=function(args){return{id:"coordonneesSubmenu",text:"Coordonn\u00e9es",menu:{items:[{id:"coordonneesCarte",text:"Projection de la carte",handler:function(){Aide.afficherMessage("Coordonn\u00e9es",args.point.x+", "+args.point.y)}},{id:"coordonnees4326",text:"Projection EPSG:4326",handler:function(){var pProj=args.point.projeter("EPSG:4326");Aide.afficherMessage("Coordonn\u00e9es",pProj.x+", "+pProj.y)}}]}}},ContexteMenuCarte.prototype.initImporterOccurenceSubmenu=function(args){var that=args.scope,coucheWFSActive=that.options.carte.gestionCouches.coucheWFSActive;if(!coucheWFSActive||!coucheWFSActive.estActive())return!1;var carteEchelle=that.options.carte.obtenirEchelle();return carteEchelle>coucheWFSActive.options.echelleMin||carteEchelleGeometry"+minX+","+minY+" "+maxX+","+maxY+"";$.ajax({url:coucheWFSActive.options.url,data:{MAP:coucheWFSActive.options.mapdir,SERVICE:"WFS",VERSION:"1.0.0",REQUEST:"getfeature",TYPENAME:coucheWFSActive.options.nom,FILTER:filtre},context:this,success:function(resultat){var id="_"+coucheWFSActive.obtenirId()+"_Importation",couche=that.options.carte.gestionCouches.obtenirCoucheParId(id);couche||(couche=new Igo.Couches.Vecteur({id:id,titre:coucheWFSActive.obtenirTitre()+"-Importation",simplificationZoom:!0,active:!0,selectionnable:!0,ordreAffichage:coucheWFSActive.obtenirOrdreAffichage()+1}),that.options.carte.gestionCouches.ajouterCouche(couche));var formatXML=new AnalyseurGML -({projectionCarte:that.options.carte.obtenirProjection()}),features=formatXML.lire(resultat);Aide.obtenirNavigateur().obtenirCtrl()||couche.enleverTout(),features.length||Aide.afficherMessage("Aucune donn\u00e9e trouv\u00e9e","Aucune donn\u00e9e n'a \u00e9t\u00e9 trouv\u00e9e"),$.each(features,function(key,feature){couche.ajouterOccurence(feature)}),Aide.cacherMessageChargement()},dataType:"XML",error:function(){alert("error...")}})}}},ContexteMenuCarte.prototype.initOccurencesSubmenu=function(args){var that=args.scope;if(args.occurencesSurvolees.length!==0){var menu={id:"occurencesSubmenu",text:"Occurences",menu:{items:[]}};menu.menu.items.push({id:"occurencesInfo",text:"Info",handler:function(){Fonctions.afficherProprietes(args.occurencesSurvolees)}}),$.each(args.occurencesSurvolees,function(key,occurence){var submenu={id:"occurence"+key,text:occurence.vecteur.obtenirTitre(),menu:{items:[]},listeners:{afterrender:function(){$("#occurence"+key).mouseover(function(){occurence.appliquerStyle -("courant","survolPlus")}),$("#occurence"+key).mouseout(function(){occurence.appliquerStyle("courant")})}}},occurenceMenu=submenu.menu.items;occurence.vecteur.options.selectionnable&&occurence.vecteur.options.supprimable!==!1&&occurence.obtenirTypeClasse()!=="Cluster"&&occurence.vecteur.options.protege!==!0&&occurenceMenu.push({id:"occurenceSupprimer"+key,text:"Supprimer",handler:function(){occurence.vecteur.enleverOccurence(occurence)}});if(occurence.type==="Ligne")occurenceMenu.push("-"),occurenceMenu.push({id:"occurenceLongueur"+key,text:"Longueur",handler:function(){var longueur=occurence.obtenirLongueur();Aide.afficherMessage("Longueur",longueur+" "+that.options.carte._carteOL.getUnits())}});else if(occurence.type==="Polygone"||occurence.type==="MultiPolygone")occurenceMenu.push("-"),occurenceMenu.push({id:"occurencePerimetre"+key,text:"P\u00e9rim\u00e8tre",handler:function(){var perimetre=occurence.obtenirPerimetre();Aide.afficherMessage("P\u00e9rim\u00e8tre",perimetre+" "+that.options -.carte._carteOL.getUnits())}},{id:"occurenceSuperficie"+key,text:"Superficie",handler:function(){var superficie=occurence.obtenirSuperficie();Aide.afficherMessage("Superficie",superficie+" "+that.options.carte._carteOL.getUnits()+"\u00b2")}});var submenuCopieVers=that.initSubMenuCopieVers(key,occurence);submenuCopieVers&&occurenceMenu.push(submenuCopieVers),occurenceMenu.length!==0&&menu.menu.items.push(submenu)})}return menu},ContexteMenuCarte.prototype.initSelectionSubmenu=function(args){if(args.occurencesSelectionnees.length!==0){var type="",memeType=!0;$.each(args.occurencesSelectionnees,function(index,occurence){type===""?type=occurence.type:type!==occurence.type&&(memeType=!1)});var subSelection={id:"selectionSubmenu",text:"Selection",menu:{items:[{id:"selectionCompter",text:"Compter",handler:function(){Aide.afficherMessage("Informations",args.occurencesSelectionnees.length+" occurences selectionn\u00e9es")}}]}};subSelection.menu.items.push({id:"selectionInfo",text:"Info",handler: -function(){Fonctions.afficherProprietes(args.occurencesSelectionnees)}});if(memeType){var submenuCopieVers=args.scope.initSubMenuCopieVers("-1",args.occurencesSelectionnees,type);submenuCopieVers&&subSelection.menu.items.push(submenuCopieVers)}return subSelection}},ContexteMenuCarte.prototype.initSubMenuCopieVers=function(key,occurence,type){type||(type=occurence.type);var listeCouche=[];type==="Ligne"||type==="Polygone"?(listeCouche=this.options.carte.gestionCouches.obtenirCouchesParTypePermis("Ligne"),listeCouche=listeCouche.concat(this.options.carte.gestionCouches.obtenirCouchesParTypePermis("Polygone")),$.unique(listeCouche)):listeCouche=this.options.carte.gestionCouches.obtenirCouchesParTypePermis(type),occurence.obtenirTypeClasse&&(occurence=[occurence]);var coucheDe=[];for(var i=0;imaxZoom&&this.definirZoom(maxZoom);return}this.definirZoom(param)},Carte.prototype._getCarte=function(){return this._carteOL},Carte.Controles=function(_){this._=_,this.activerOccurenceEvenement();if(Aide.toBoolean( -this._.options.aContexteMenu)!==!1){var nav=Aide.obtenirNavigateur(),initContexteMenuCarte=function(e){var scope=e.options.scope;scope.contexteMenu=new ContexteMenuCarte({carte:scope._,cible:"#mapComponent .olMapViewport"})};nav&&nav.isReady?initContexteMenuCarte({options:{scope:this}}):this._.ajouterDeclencheur("carteInit",initContexteMenuCarte,{scope:this})}},Carte.Controles.prototype.initDeplacement=function(){this._deplacementControle||(this._deplacementControle=new OpenLayers.Control.DragPan({isDefault:!0}))},Carte.Controles.prototype.activerDeplacement=function(){this.initDeplacement(),this._deplacementControle.activate()},Carte.Controles.prototype.desactiverDeplacement=function(){this._deplacementControle&&this._deplacementControle.deactivate()},Carte.Controles.prototype.initClique=function(){var that=this;this._cliqueControle||(OpenLayers.Control.Click=OpenLayers.Class(OpenLayers.Control,{defaultHandlerOptions:{single:!0,"double":!1,pixelTolerance:0,stopSingle:!1,stopDouble:!1}, -handleRightClicks:!0,initialize:function(){this.handlerOptions=OpenLayers.Util.extend({},this.defaultHandlerOptions),OpenLayers.Control.prototype.initialize.apply(this,arguments),this.handler=new OpenLayers.Handler.Click(this,this.eventMethods,this.handlerOptions)}}),this._cliqueControle=new OpenLayers.Control.Click({eventMethods:{click:function(e){that.clique(e)}}}),this._._carteOL.addControl(this._cliqueControle))},Carte.Controles.prototype.activerClique=function(){this.initClique(),this._cliqueControle.activate(),this._.declencher({type:"activerClique"})},Carte.Controles.prototype.desactiverClique=function(){this._cliqueControle&&(this._cliqueControle.deactivate(),this._.declencher({type:"desactiverClique"}))},Carte.Controles.prototype.clique=function(e){var lonlat=this._._carteOL.getLonLatFromPixel(e.xy),point=new Point(lonlat.lon,lonlat.lat);this._.declencher({type:"clique",point:point})},Carte.Controles.prototype.activerOccurenceEvenement=function(){this.occurenceEvenement={actif:!0 -}},Carte.Controles.prototype.desactiverOccurenceEvenement=function(couche){this.occurenceEvenement={actif:!1,exception:couche}},Carte.Controles.prototype.activerEdition=function(couche,options){options=options||{},couche=couche==="active"?this._.gestionCouches.coucheVecteurActive:couche,this.controleEdition&&this.controleEdition.layer!==couche._layer&&this._desactiverEventsEdition(),this.controleEdition||(this.controleEdition=new OpenLayers.Control.ModifyFeature(couche._layer),this._._carteOL.addControl(this.controleEdition)),this.controleEdition.activate(),this.desactiverOccurenceEvenement(couche);var occurenceSelectionnee=couche.obtenirOccurencesSelectionnees()[0];occurenceSelectionnee&&(couche.deselectionnerTout(),occurenceSelectionnee.selectionner(),this.controleEdition.selectFeature(occurenceSelectionnee._feature)),this._initEventsEdition(couche),this._activerEventsEdition(),couche.declencher({type:"controleEditionActiver"}),this.snap&&this.activerSnap(couche)},Carte.Controles.prototype -.desactiverEdition=function(couche){if(this.controleEdition){this._desactiverEventsEdition(),this.controleEdition.deactivate(),this._._carteOL.removeControl(this.controleEdition),this.controleEdition.destroy(),this.controleEdition=undefined,this._editionEvents.oModifification=undefined,this._editionEvents.oModifificationTerminee=undefined;if(couche){var oSelected=couche.obtenirOccurencesSelectionnees();oSelected[0]&&oSelected[0].selectionner(),couche.declencher({type:"controleEditionDesactiver"})}this.activerOccurenceEvenement()}},Carte.Controles.prototype._activerEventsEdition=function(){this.controleEdition.layer.events.register("featuremodified",this._editionEvents.couche,this._editionEvents.fnFeatureModified),this.controleEdition.layer.events.register("beforefeaturemodified",this._editionEvents.couche,this._editionEvents.fnBeforeFeatureModified),this.controleEdition.layer.events.register("afterfeaturemodified",this._editionEvents.couche,this._editionEvents.fnAfterFeatureModified),this -._editionEvents.couche.ajouterDeclencheur("vecteurOccurenceSelectionnee",this._editionEvents.fnVecteurOccurenceSelectionnee,{scope:this}),this._editionEvents.couche.ajouterDeclencheur("vecteurOccurenceDeselectionnee",this._editionEvents.fnVecteurOccurenceDeselectionnee,{scope:this})},Carte.Controles.prototype._desactiverEventsEdition=function(){this.controleEdition&&(this.controleEdition.layer.events.remove("featuremodified"),this.controleEdition.layer.events.remove("beforefeaturemodified"),this.controleEdition.layer.events.remove("afterfeaturemodified"),this._editionEvents.couche.enleverDeclencheur("vecteurOccurenceSelectionnee",undefined,this._editionEvents.fnVecteurOccurenceSelectionnee),this._editionEvents.couche.enleverDeclencheur("vecteurOccurenceDeselectionnee",undefined,this._editionEvents.fnVecteurOccurenceDeselectionnee))},Carte.Controles.prototype._initEventsEdition=function(couche){this._editionEvents={},this._editionEvents.couche=couche,this._editionEvents.oModifification=undefined -,this._editionEvents.oModifificationTerminee=this._editionEvents.occurenceModifification;var that=this;this._editionEvents.fnFeatureModified=function(e){if(!e.feature)return!0;var occurence=couche.obtenirOccurenceParId(e.feature.id);if(!occurence)return!0;occurence.majGeometrie(e.feature.geometry)},this._editionEvents.fnBeforeFeatureModified=function(e){if(!e.feature)return!0;var occurence=couche.obtenirOccurenceParId(e.feature.id);if(!occurence)return!0;that._editionEvents.oModifificationTerminee=that._editionEvents.oModifification,that._editionEvents.oModifification=occurence,that._desactiverEventsEdition(),occurence.selectionner(),that._activerEventsEdition()},this._editionEvents.fnAfterFeatureModified=function(){var occurence;that._editionEvents.oModifificationTerminee?(occurence=that._editionEvents.oModifificationTerminee,that._editionEvents.oModifificationTerminee=undefined,that._editionEvents.oModifification.id===occurence.id&&(occurence=undefined)):(occurence=that._editionEvents -.oModifification,that._editionEvents.oModifification=undefined);if(!occurence)return!0;occurence.vecteur||couche._layer.removeFeatures(occurence._feature),that._desactiverEventsEdition(),occurence.deselectionner(),that._activerEventsEdition()},this._editionEvents.fnVecteurOccurenceSelectionnee=function(e){e.options.scope._desactiverEventsEdition(),couche.obtenirOccurencesSelectionnees().length>1&&(couche.deselectionnerTout(),e.occurence.selectionner()),e.options.scope.controleEdition.selectFeature(e.occurence._feature),e.options.scope._activerEventsEdition()},this._editionEvents.fnVecteurOccurenceDeselectionnee=function(e){e.occurence._feature===e.options.scope.controleEdition.feature&&(e.options.scope._desactiverEventsEdition(),e.options.scope.controleEdition.unselectFeature(e.occurence._feature),e.options.scope._activerEventsEdition())}},Carte.Controles.prototype.activerDessin=function(couche,type,options){options=options||{},couche=couche==="active"?this._.gestionCouches.coucheVecteurActive -:couche;if(options.releverBoutonOutil!==!1){var boutonActif=Ext.ButtonToggleMgr.getPressed("carte");boutonActif&&Ext.ButtonToggleMgr.getPressed("carte").toggle()}this._.declencher({type:"controleCarteActiver"});var typeHandler=OpenLayers.Handler.Point;type==="polygone"?typeHandler=OpenLayers.Handler.Polygon:type==="ligne"?typeHandler=OpenLayers.Handler.Path:type==="regulier"?typeHandler=OpenLayers.Handler.RegularPolygon:type==="cercle"&&(typeHandler=OpenLayers.Handler.CircleToMeasure,options.cotes=options.cotes||50);var typeControl=OpenLayers.Control.DrawFeatureEx;options.mesure&&(type==="cercle"?typeControl=OpenLayers.Control.MeasureCircle:typeHandler!==OpenLayers.Handler.Point?typeControl=OpenLayers.Control.Measure:options.mesure=!1);if(!options.mesure&&!couche)throw new Error("Carte.Controles.activerDessin : La couche est obligatoire");this.controleDessin&&(options.detruireControle||!couche||this.controleDessin.layer!==couche._layer||this.controleDessin.handler.CLASS_NAME!==typeHandler -.prototype.CLASS_NAME||this.controleDessin.CLASS_NAME!==typeControl.prototype.CLASS_NAME)&&(this._._carteOL.removeControl(this.controleDessin),this.controleDessin.destroy(),this.controleDessin=undefined),this.controleDessin||(this.controleDessin=new typeControl(typeHandler,{persist:couche?!1:!0,immediate:!0,geodesic:!0,handlerOptions:{holeModifier:"ctrlKey",sides:Number(options.cotes)>2&&Number(options.cotes)<=100?Number(options.cotes):undefined,irregular:Aide.toBoolean(options.irregulier),layer:couche?couche._layer:undefined,layerOptions:{styleMap:couche?couche._layer.styleMap:undefined}},featureAdded:function(feature){var occurence=new Occurence(feature);couche._layer.removeFeatures(feature),couche.ajouterOccurence(occurence,{existe:!1}),occurence.rafraichir()}}),options.mesure&&this.controleDessin.events.on({measure:function(e){var occ=new Occurence(e.geometry);couche?(couche.declencher({type:"mesure",occurence:occ}),couche.ajouterOccurence(occ)):this._.declencher({type:"mesure",occurence -:occ})},measurepartial:function(e){var occ=new Occurence(e.geometry);couche&&couche.declencher({type:"mesurePartielle",occurence:occ})},scope:this}),this._._carteOL.addControl(this.controleDessin)),Aide.obtenirNavigateur().evenements.ajouterDeclencheur("controleCarteActiver",function(e){e.options.scope.desactiverDessin()},{scope:this,id:"activerDessin-OutilExecuter"}),this.controleDessin.activate(),this.snap&&this.activerSnap(couche)},Carte.Controles.prototype.desactiverDessin=function(){this.controleDessin&&(Aide.obtenirNavigateur().evenements.enleverDeclencheur("controleCarteActiver","activerDessin-OutilExecuter"),this.controleDessin.deactivate())},Carte.Controles.prototype.activerSnap=function(couche){this.desactiverSnap(),this.snap=!0,couche=couche==="active"?this._.gestionCouches.coucheVecteurActive:couche;if(!couche)return!0;this.controleSnap||(this.controleSnap=new OpenLayers.Control.Snapping({layer:undefined,targets:[],greedy:!1})),this.controleSnap.setLayer(couche._layer);var listeVecteurs= -this._.gestionCouches.obtenirCouchesParType(["Vecteur","VecteurCluster","WFS"]),listLayerOL=[];$.each(listeVecteurs,function(key,value){value.estActive()&&listLayerOL.push(value._layer)}),this.controleSnap.setTargets(listLayerOL),this.controleSnap.activate(),this._.gestionCouches.ajouterDeclencheur("coucheVisibilit\u00e9Chang\u00e9e",function(e){if(e.couche.obtenirTypeClasse()==="Vecteur"||e.couche.obtenirTypeClasse()==="VecteurCluster"||e.couche.obtenirTypeClasse()==="WFS")e.couche.estActive()?this.controleSnap.addTargetLayer(e.couche._layer):this.controleSnap.removeTargetLayer(e.couche._layer)},{scope:this,id:"carteActiverSnap"})},Carte.Controles.prototype.desactiverSnap=function(){this.controleSnap&&(this.snap=!1,this._.gestionCouches.enleverDeclencheur("coucheVisibilit\u00e9Chang\u00e9e","carteActiverSnap"),this.controleSnap.deactivate())},Carte}),define("panneauCarte",["panneau","point","aide"],function(Panneau,Point,Aide){function PanneauCarte(options){this.barreOutils,this.options= -options||{},this.defautOptions=$.extend({},this.defautOptions,{id:"carte-panneau",titre:"",_margins:"0 5 0 0",reductible:!1,_layout:"border"})}return PanneauCarte.prototype=new Panneau,PanneauCarte.prototype.constructor=PanneauCarte,PanneauCarte.prototype._init=function(){var opt=this.options,centreString=Aide.obtenirParametreURL("centre")||opt.centre;if(centreString){var centre=centreString.split(/[,;]/);opt.x=centre[0],opt.y=centre[1];var centreProj=centre[2];if(centreProj){var igoPoint=new Point(opt.x,opt.y,centreProj),igoPointProj=igoPoint.projeter(this.carte.obtenirProjection());opt.x=igoPointProj.x,opt.y=igoPointProj.y}}var x=Aide.obtenirParametreURL("x")||opt.x||-7994004,y=Aide.obtenirParametreURL("y")||opt.y||6034079,z=Aide.obtenirParametreURL("zoom")||opt.zoom||7,barreOutilsExt;this.barreOutils?barreOutilsExt=this.barreOutils._getToolbar():barreOutilsExt=[],this.carte.parent=this;var oMapComponent=new GeoExt.MapPanel({border:!1,id:"mapComponent",region:"center",map:this.carte._getCarte -(),center:new OpenLayers.LonLat(x,y),zoom:z,tbar:barreOutilsExt,items:[{xtype:"gx_zoomslider",id:"idgx_zoomslider",vertical:!0,height:100,x:17,y:90,plugins:new GeoExt.ZoomSliderTip({template:"\u00c9chelle: 1 : {scale}"})},{id:"boutonConsoleDiv",html:""}]});this.barreOutils&&this.barreOutils._setPanelContainer(oMapComponent),this.defautOptions.items=[oMapComponent],this._extOptions={region:"center"},Panneau.prototype._init.call(this)},PanneauCarte.prototype._getMapComponent=function(){return this._panel.items.last()},PanneauCarte}),define("navigateur",["barreOutils","panneau","carte","panneauCarte","aide","evenement"],function(BarreOutils,Panneau,Carte,PanneauCarte,Aide,Evenement){function Navigateur(carte,options){this.options=options||{},Aide.definirNavigateur(this),carte||(carte=new Carte);if(carte.constructor.name!=="Carte"&&carte.constructor.toString().match(/function ([A-Z]{1}[a-zA-Z]*)/)[1]!=="Carte")throw new Error("new Igo.Navigateur(carte) a besoin d'un objet de type Igo.Carte()" -);this.carte=carte,this.listePanneaux=[]}return Navigateur.prototype=new Evenement,Navigateur.prototype.constructor=Navigateur,Navigateur.prototype.init=function(callback,cible,optCallback){var that=this;Ext.QuickTips.init(),Ext.state.Manager.setProvider(new Ext.state.CookieProvider);var listePanelExt=[],aPanneauCarte=!1;$.each(this.listePanneaux,function(key,value){value.obtenirTypeClasse()==="PanneauCarte"&&(aPanneauCarte=!0),value._getPanel()&&listePanelExt.push(value._getPanel())});if(aPanneauCarte===!1){var panneauCarte=new PanneauCarte;this.ajouterPanneau(panneauCarte),listePanelExt.push(panneauCarte._getPanel())}this.options.div?require(["libs/Ext.ux/FitToParent"],function(){this._viewport=new Ext.Panel({layout:"border",id:"monNavigateurIGO",items:listePanelExt,renderTo:that.options.div,border:that.options.aBordure||!1,plugins:["fittoparent"],scope:that,listeners:{afterrender:function(e){e.scope.isReady=!0,typeof callback=="function"&&callback.call(cible,optCallback),e.scope.carte -.declencher({type:"carteInit"}),e.scope.declencher({type:"navigateurInit"})}}})}):this._viewport=new Ext.Viewport({layout:"border",id:"monNavigateurIGO",items:listePanelExt,scope:this,listeners:{afterrender:function(e){e.scope.isReady=!0,typeof callback=="function"&&callback.call(cible,optCallback),e.scope.carte.declencher({type:"carteInit"}),e.scope.declencher({type:"navigateurInit"})}}}),$(document).on("keyup keydown",function(e){that.ctrlPressed=e.ctrlKey})},Navigateur.prototype.obtenirCtrl=function(){return this.ctrlPressed},Navigateur.prototype.creerBarreOutils=function(){var that=this;return this.barreOutils=new BarreOutils(this.carte),$.each(this.obtenirPanneaux(),function(key,panneau){panneau.obtenirTypeClasse()==="PanneauCarte"&&that.barreOutils._setPanelContainer(panneau._getMapComponent())}),this.barreOutils},Navigateur.prototype.obtenirBarreOutils=function(){return this.barreOutils},Navigateur.prototype.ajouterPanneau=function(panneau){if(panneau instanceof Panneau==0)throw new -Error("Igo.Navigateur.ajouterPanneau(panneau) a besoin d'un objet de type Igo.Panneaux");panneau.definirCarte(this.carte),panneau.obtenirTypeClasse()==="PanneauCarte"&&(panneau.barreOutils=this.barreOutils),panneau._init(),this.listePanneaux.push(panneau)},Navigateur.prototype.obtenirPanneaux=function(){return this.listePanneaux},Navigateur.prototype.obtenirPanneauxParChemin=function(chemin){var that=this,panneaux=[],cheminSplit=chemin.split(",");$.each(cheminSplit,function(key,sChemin){var indexFin,panneauxTemp=[that];do{var separator;sChemin.search(/>| /)===0&&(separator=sChemin[0],sChemin=sChemin.substr(1));var indexDeb=sChemin.search(/#|\.|>| /),directive=sChemin[indexDeb];indexFin=sChemin.substr(indexDeb+1).search(/#|\.|>| /);var nbCaractere;indexFin!==-1&&(nbCaractere=indexFin-indexDeb);var identifiant=sChemin.substr(indexDeb+1,nbCaractere);sChemin=sChemin.substr(indexFin+1);var panneauxLoop,niveau;directive==="#"?(niveau=-1,separator===">"&&(niveau=1),!separator&&panneauxTemp[0]. -obtenirTypeClasse()!==that.obtenirTypeClasse()?(panneauxLoop=[],$.each(panneauxTemp,function(keyTemp,panneauTemp){panneauTemp.obtenirId()===identifiant&&(panneauxLoop=panneauxLoop.concat([panneauTemp]))}),panneauxTemp=panneauxLoop):(panneauxLoop=[],$.each(panneauxTemp,function(keyTemp,panneauTemp){if(panneauTemp.obtenirPanneauParId){var p=panneauTemp.obtenirPanneauParId(identifiant,niveau);p&&(panneauxLoop=panneauxLoop.concat([p]))}}),panneauxTemp=panneauxLoop)):directive==="."?(niveau=-1,separator===">"&&(niveau=1),!separator&&panneauxTemp[0].obtenirTypeClasse()!==that.obtenirTypeClasse()?(panneauxLoop=[],$.each(panneauxTemp,function(keyTemp,panneauTemp){panneauTemp.obtenirTypeClasse()===identifiant&&(panneauxLoop=panneauxLoop.concat([panneauTemp]))}),panneauxTemp=panneauxLoop):(panneauxLoop=[],$.each(panneauxTemp,function(keyTemp,panneauTemp){panneauTemp.obtenirPanneauxParType&&(panneauxLoop=panneauxLoop.concat(panneauTemp.obtenirPanneauxParType(identifiant,niveau)))}),panneauxTemp=panneauxLoop -)):panneauxTemp=[],panneauxTemp.length||(indexFin=-1)}while(indexFin!==-1);panneaux=panneaux.concat(panneauxTemp)});var panneauxUniques=panneaux.filter(function(itm,i,a){return i==a.indexOf(itm)});return panneauxUniques},Navigateur.prototype.obtenirPanneauParId=function(id,niveau){niveau=niveau||1;var panneau;return $.each(this.listePanneaux,function(key,value){if(value.obtenirId()===id)return panneau=value,!1;if((niveau>1||niveau<0)&&value.obtenirPanneauParId){panneau=value.obtenirPanneauParId(id,niveau-1);if(panneau)return!1}}),panneau},Navigateur.prototype.obtenirPanneauxParType=function(type,niveau){niveau=niveau||1;var panneau=[];return $.each(this.listePanneaux,function(key,value){value.obtenirTypeClasse()===type&&panneau.push(value),(niveau>1||niveau<0)&&value.obtenirPanneauxParType&&(panneau=panneau.concat(value.obtenirPanneauxParType(type,niveau-1)))}),panneau},Navigateur}),define("browserDetect",[],function(){var BrowserDetect={init:function(){this.browser=this.searchString(this -.dataBrowser)||"An unknown browser",this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"an unknown version",this.OS=this.searchString(this.dataOS)||"an unknown OS"},searchString:function(data){for(var i=0;i=0){iCL++;if(!that.options._merge){var parcourirLayerXML=function(value,groupe,groupeNiveauBase){var layers=value;if(value.nestedLayers.length!==0)groupeNiveauBase?groupeNiveauBase--:(groupe=groupe?groupe+"/":"",groupe+=value.title),layers=value.nestedLayers,$.each(layers,function(key2,value2){parcourirLayerXML(value2,groupe,groupeNiveauBase)});else{xmlOptions={titre:value.title,droit:value.attribution?value.attribution.href:undefined,echelleMin -:value.minScale,echelleMax:value.maxScale};if(value.dataURL&&value.dataURL.format==="igo"){var idMeta=value.dataURL.href,igoClassMeta=idMeta;xmlOptions.metadonnee=igoClassMeta}$.extend(xmlOptions,that.options),xmlOptions.mode=!1,xmlOptions.nom=value.name;if(!xmlOptions.nom)return Aide.estDebug()&&(console.warn('Le url "'+xmlOptions.url+'" a un groupe vide.'),console.warn(xmlOptions)),!0;groupe&&Aide.toBoolean(that.options.garderGroupe)!==!1&&(xmlOptions.groupe=groupe),value.dimensions.time&&(xmlOptions.wms_timeextent=value.dimensions.time.values[0],xmlOptions.wms_timedefault=value.dimensions.time.defaults),target.ajouterCouche(new WMS(xmlOptions))}};parcourirLayerXML(value,that.options.groupe,that.options.groupeNiveauBase);if(len===1)return!1}else if(iCL===1){xmlOptions={titre:value.title,droit:value.attribution?value.attribution.href:undefined,echelleMin:value.minScale,echelleMax:value.maxScale,groupe:"Couches WMS ajout\u00e9es"};if(len===1)return!1}else{xmlOptions.titre=xmlOptions.titre? -xmlOptions.titre+", ":"",xmlOptions.titre+=value.title;if(!xmlOptions.echelleMin||value.minScale>xmlOptions.echelleMin)xmlOptions.echelleMin=value.minScale;if(!xmlOptions.echelleMax||value.maxScaleLe GetCapabilities pour '"+this.options.url+"' a \u00e9chou\u00e9.
        "+response.responseText),!1;if(BrowserDetect.browser=="Explorer"){var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async=!1,xmlDoc.validateOnParse=!1,xmlDoc.resolveExternals=!1;var parsed=xmlDoc.loadXML(response.responseText);if(!parsed){var myErr=xmlDoc -.parseError;Aide.afficherMessage("Erreur WMS: GetCapabilities","Le GetCapabilities pour '"+this.options.url+"' a \u00e9chou\u00e9.
        "+myErr.reason,"OK","ERREUR")}else this._getCapabilitiesSuccess(xmlDoc,target,callback,optCalback);return!1}Aide.afficherMessage("Erreur WMS: GetCapabilities","Le GetCapabilities pour '"+this.options.url+"' a \u00e9chou\u00e9.","OK","ERREUR")},WMS.prototype._ajoutCallback=function(target,callback,optCallback){this.options.mode==="getCapabilities"?this._getCapabilities(target,callback,optCallback):Couche.prototype._ajoutCallback.call(this,target,callback,optCallback)},WMS.prototype._validerChargement=function(e,a){e.object.div.innerHTML.indexOf("olImageLoadError")>-1&&$.ajax({url:Aide.utiliserProxy(decodeURIComponent($("'; + //die(); + // #fin recette métadata + + } + + /** + * Spécifier explicitement les métadata parce que Phalcon ne supporte pas + * les vues matérialisées + * @return onject + */ + public function metaData(){ + + // Nécessaire parce que Phalcon a de la misère avec les vues matérialisées + // La valeur de $m peut être générée en suivant la #recette métadata + $m = '{"0":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"contexte_id":0,"parent_groupe_id":0,"nom_complet":6,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"contexte_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"contexte_id":1,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; + return json_decode($m, true); + + } +} diff --git a/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php b/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php new file mode 100644 index 00000000..c40f4ab5 --- /dev/null +++ b/pilotage/app/models/IgoVueContexteGroupesRecursifMaterialized.php @@ -0,0 +1,55 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + + } + + public function refresh(){ + + $this->getDI()->get('db')->execute('REFRESH MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized'); + + // #recette métadata + // Décommenter les lignes suivantes, allez dans le pilotage et modifiez un Groupe. + //$m = ($this->getModelsMetaData()->readMetaData($this)); + //echo 'Contenu pour le $m de metaData de IgoVueContexteGroupesRecursifMaterialized.php
        '; + //echo ''; + //die(); + // #fin recette métadata + + } + + /** + * Spécifier explicitement les métadata parce que Phalcon ne supporte pas + * les vues matérialisées + * @return onject + */ + public function metaData(){ + + // Nécessaire parce que Phalcon a de la misère avec les vues matérialisées + // La valeur de $m peut être générée en suivant la #recette métadata + $m = '{"0":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","contexte_id","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"contexte_id":0,"parent_groupe_id":0,"nom_complet":6,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"contexte_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"contexte_id":1,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; + return json_decode($m, true); + + } +} diff --git a/pilotage/app/models/IgoVueCouche.php b/pilotage/app/models/IgoVueCouche.php new file mode 100644 index 00000000..03e4d5d2 --- /dev/null +++ b/pilotage/app/models/IgoVueCouche.php @@ -0,0 +1,95 @@ +setSchema($this->getDI()->getConfig()->database->schema); + $this->hasMany("id", "IgoCoucheContexte", "couche_id", array( + 'reusable' => true + )); + $this->hasMany("id", "IgoVueContexteCoucheNavigateur", "couche_id", array( + 'reusable' => true + )); + $this->hasMany("id", "IgoPermission", "couche_id", array( + 'reusable' => true + )); + $this->hasMany("id", "IgoClasse", "couche_id", array( + 'reusable' => true + )); + $this->belongsTo("geometrie_id", "IgoGeometrie", "id", array( + 'reusable' => true + )); + $this->belongsTo("groupe_id", "IgoGroupe", "id", array( + 'reusable' => true + )); + + } + + +} diff --git a/pilotage/app/models/IgoVueGroupesRecursif.php b/pilotage/app/models/IgoVueGroupesRecursif.php new file mode 100644 index 00000000..174705d4 --- /dev/null +++ b/pilotage/app/models/IgoVueGroupesRecursif.php @@ -0,0 +1,72 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + + } + + public function refresh(){ + + $this->getDI()->get('db')->execute('REFRESH MATERIALIZED VIEW igo_vue_groupes_recursif') ; + + // #recette métadata + // Recette pour obtenir les médatada ($m) + // Décommenter les lignes suivantes, allez dans le pilotage et modifiez un Groupe. + //echo 'Contenu pour le $m de metaData de IgoVueGroupesRecursif.php
        '; + //echo ''; + //die(); + // #fin recette métadata + + } + + /** + * Spécifier explicitement les métadata parce que Phalcon ne supporte pas + * les vues matérialisées + * @return onject + */ + public function metaData(){ + + // Nécessaire parce que phalcon a de la misère avec les vues matérialisées + // La valeur de $m peut être générée en suivant la #recette métadata + $m = '{"0":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"parent_groupe_id":0,"nom_complet":2,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; + return json_decode($m, true); + + } + +} diff --git a/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php b/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php new file mode 100644 index 00000000..79608d65 --- /dev/null +++ b/pilotage/app/models/IgoVueGroupesRecursifMaterialized.php @@ -0,0 +1,72 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + + } + + public function refresh(){ + + $this->getDI()->get('db')->execute('REFRESH MATERIALIZED VIEW igo_vue_groupes_recursif_materialized') ; + + // #recette métadata + // Recette pour obtenir les médatada ($m) + // Décommenter les lignes suivantes, allez dans le pilotage et modifiez un Groupe. + //echo 'Contenu pour le $m de metaData de IgoVueGroupesRecursif.php
        '; + //echo ''; + //die(); + // #fin recette métadata + + } + + /** + * Spécifier explicitement les métadata parce que Phalcon ne supporte pas + * les vues matérialisées + * @return onject + */ + public function metaData(){ + + // Nécessaire parce que phalcon a de la misère avec les vues matérialisées + // La valeur de $m peut être générée en suivant la #recette métadata + $m = '{"0":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"1":[],"2":["groupe_id","nom","parent_groupe_id","nom_complet","est_exclu_arbre","grp"],"3":[],"4":{"groupe_id":0,"nom":2,"parent_groupe_id":0,"nom_complet":2,"est_exclu_arbre":8,"grp":6},"5":{"groupe_id":true,"parent_groupe_id":true},"8":false,"9":{"groupe_id":1,"nom":2,"parent_groupe_id":1,"nom_complet":2,"est_exclu_arbre":5,"grp":2},"10":[],"11":[]}'; + return json_decode($m, true); + + } + +} diff --git a/pilotage/app/models/IgoVuePermissionProfil.php b/pilotage/app/models/IgoVuePermissionProfil.php new file mode 100644 index 00000000..9bb62e79 --- /dev/null +++ b/pilotage/app/models/IgoVuePermissionProfil.php @@ -0,0 +1,37 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + } + + /** + * Independent Column Mapping. + */ + public function columnMap() + { + return array( + 'profil_id' => 'profil_id', + 'couche_id' => 'couche_id', + 'groupe_id' => 'groupe_id', + 'est_lecture' => 'est_lecture', + 'est_analyse' => 'est_analyse', + 'est_ecriture' => 'est_ecriture', + 'est_export' => 'est_export' + ); + } +} + diff --git a/pilotage/app/models/IgoVuePermissionsPourCouches.php b/pilotage/app/models/IgoVuePermissionsPourCouches.php new file mode 100644 index 00000000..b5ab0da5 --- /dev/null +++ b/pilotage/app/models/IgoVuePermissionsPourCouches.php @@ -0,0 +1,37 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + } + + /** + * Independent Column Mapping. + */ + public function columnMap(){ + return array( + 'couche_id' => 'couche_id', + 'groupe_id' => 'groupe_id', + 'profil_id' => 'profil_id', + 'est_lecture' => 'est_lecture', + 'est_analyse' => 'est_analyse', + 'est_ecriture' => 'est_ecriture', + 'est_export' => 'est_export', + 'est_association' => 'est_association' + ); + } +} + diff --git a/pilotage/app/models/IgoVuePermissionsPourGroupes.php b/pilotage/app/models/IgoVuePermissionsPourGroupes.php new file mode 100644 index 00000000..bdb0447e --- /dev/null +++ b/pilotage/app/models/IgoVuePermissionsPourGroupes.php @@ -0,0 +1,35 @@ +setSchema($this->getDI()->getConfig()->database->schema); + + } + + /** + * Independent Column Mapping. + */ + public function columnMap(){ + return array( + 'groupe_id' => 'groupe_id', + 'profil_id' => 'profil_id', + 'est_lecture' => 'est_lecture', + 'est_analyse' => 'est_analyse', + 'est_ecriture' => 'est_ecriture', + 'est_export' => 'est_export', + 'est_association' => 'est_association' + ); + } +} + diff --git a/pilotage/app/plugins/SecurityPlugin.php b/pilotage/app/plugins/SecurityPlugin.php new file mode 100644 index 00000000..de71f144 --- /dev/null +++ b/pilotage/app/plugins/SecurityPlugin.php @@ -0,0 +1,276 @@ +getDI()->get("authentificationModule"); + if($authentificationModule == null){ + return; + } + + $controller = $dispatcher->getControllerName(); + $action = $dispatcher->getActionName(); + + if($controller === "connexion" || $controller === "error"){ + $config = $this->getDI()->get("config"); + $this->getDI()->get("view")->setViewsDir($config->application->services->viewsDir); + }else if(!$this->estAuthentifie()){ + return $this->forwardToLoginPage(); + } else if(!$this->session->get("info_utilisateur")->estAdmin && + !$this->session->get("info_utilisateur")->estPilote) { + $this->session->set("erreur", "Droits insuffisants"); + return $this->forwardToLoginPage(); + } + else { + + // Contrôle d'accès. + return $this->filtrerRoutes($controller, $action); + } + } + + private function filtrerRoutes($controller, $action) { + $info_utilisateur = $this->session->get('info_utilisateur'); + + if(!$info_utilisateur->estAdmin) { + // On est pilote ici + + switch($controller) { + // Menu Permissions + case "igo_utilisateur": + $this->forbidActions($action, array("all")); + break; + + case "utilisateur_et_profil": + $this->forbidActions($action, array("all")); + break; + + case "igo_permission": + $this->forbidActions($action, array()); + break; + + case "igo_profil": + $this->forbidActions($action, array()); + break; + + case "igo_utilisateur_profil": + $this->forbidActions($action, array("all")); + break; + + case "igo_service_profil": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + // Menu Classe d'entité + case "gestion_couche": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_classe_entite": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_geometrie": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_couche": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_attribut": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_groupe": + $this->forbidActions($action, array()); + break; + + case "igo_groupe_couche": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + // Menu Context + case "igo_contexte": + $this->forbidActions($action, array()); + break; + + case "igo_couche_contexte": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + // Menu Service + case "igo_service": + $this->forbidActions($action, array("all")); + break; + + // Menu Pilotage + case "igo_classe": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_source_entite": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_catalogue_csw": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_organisme_responsable": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_contact": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_classification": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_geometrie_type": + $this->forbidActions($action, array("new", + "edit", + "delete", + "create")); + break; + + case "igo_connexion": + $this->forbidActions($action, array("all")); + break; + + case "igo_connexion_type": + $this->forbidActions($action, array("all")); + break; + + // Menu Mapfile + case "mapfile": + $this->forbidActions($action, array("all")); + break; + + default: + $this->forbidActions($action, array()); + break; + } + } + } + + /* + * $action : action du controlleur + * $actions_interdites : array contenant les actions à filtrer. + */ + private function forbidActions($action, $actions_interdites) { + if(in_array("all", $actions_interdites)) { + $this->forwardToUnauthorizedPage(); + } + + if (in_array($action, $actions_interdites)) { + $this->forwardToUnauthorizedPage(); + } + + return; + } + + private function forwardToLoginPage(){ + $this->dispatcher->forward(array( + "controller" => "connexion", + "action" => "index" + )); + return; + } + + private function forwardToErrorPage(){ + $this->dispatcher->forward(array( + "controller" => "error", + "action" => "error404" + )); + return; + } + + private function forwardToUnauthorizedPage(){ + $this->dispatcher->forward(array( + "controller" => "error", + "action" => "error403" + )); + return; + } + private function forwardToRolePage(){ + $this->dispatcher->forward(array( + "controller" => "connexion", + "action" => "role" + )); + return; + } + + private function estAuthentifie(){ + return $this->session->has("info_utilisateur") + ? $this->session->get("info_utilisateur")->estAuthentifie + : false; + } + + private function estAnonyme(){ + return $this->session->get("info_utilisateur")->estAnonyme; + } + + private function estRoleSelectionneRequis(){ + return $this->getDi()->getConfig()->application->authentification->activerSelectionRole; + } + + private function estRoleSelectionne(){ + return !is_null($this->session->get("info_utilisateur")->profilActif); + } + + private function obtenirConfiguration($action, $dispatcher){ + if($action === "index"){ + $configuration = "defaut"; + }else { + $configuration = $dispatcher->getParam("configuration"); + } + return $configuration; + } + +} \ No newline at end of file diff --git a/pilotage/app/sql/creation_de_tables.sql b/pilotage/app/sql/creation_de_tables.sql new file mode 100644 index 00000000..125df707 --- /dev/null +++ b/pilotage/app/sql/creation_de_tables.sql @@ -0,0 +1,1223 @@ +-- Si ces fonction n'existent pas dans votre schema, commentez les lignes suivantes. +/* +DROP AGGREGATE IF EXISTS first(anyelement); +DROP AGGREGATE IF EXISTS last(anyelement); +DROP FUNCTION IF EXISTS first_agg(anyelement, anyelement); +DROP FUNCTION IF EXISTS last_agg(anyelement, anyelement); +*/ +-- Si ces fonction n'existent pas dans votre schema, commentez les lignes suivantes. + +DROP TABLE IF EXISTS igo_classe cascade; +DROP TABLE IF EXISTS igo_connexion cascade; +DROP TABLE IF EXISTS igo_connexion_type cascade; +DROP TABLE IF EXISTS igo_contexte cascade; +DROP TABLE IF EXISTS igo_geometrie_type cascade; +DROP TABLE IF EXISTS igo_service cascade; +DROP TABLE IF EXISTS igo_service_profil cascade; +DROP TABLE IF EXISTS igo_valeur cascade; +DROP TABLE IF EXISTS igo_utilisateur cascade; +DROP TABLE IF EXISTS igo_utilisateur_profil cascade; +DROP TABLE IF EXISTS igo_classification cascade; +DROP TABLE IF EXISTS igo_classe_entite cascade; +DROP TABLE IF EXISTS igo_contact cascade; +DROP TABLE IF EXISTS igo_attribut cascade; +DROP TABLE IF EXISTS igo_groupe cascade; +DROP TABLE IF EXISTS igo_groupe_couche cascade; -- vérifier pour l'ordre +DROP TABLE IF EXISTS igo_groupe_groupe cascade; +DROP TABLE IF EXISTS igo_permission cascade; +DROP TABLE IF EXISTS igo_organisme_responsable cascade; +DROP TABLE IF EXISTS igo_profil cascade; +DROP TABLE IF EXISTS igo_source_entite cascade; +DROP TABLE IF EXISTS igo_liste_valeur cascade; +DROP TABLE IF EXISTS igo_couche_contexte cascade; +DROP TABLE IF EXISTS igo_couche cascade; +DROP TABLE IF EXISTS igo_geometrie cascade; +DROP TABLE IF EXISTS igo_catalogue_csw cascade; + +/* +CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT $1; +$_$; + +CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT $2; +$_$; + +CREATE AGGREGATE first(anyelement) ( + SFUNC = first_agg, + STYPE = anyelement +); + +CREATE AGGREGATE last(anyelement) ( + SFUNC = last_agg, + STYPE = anyelement +); +*/ + +CREATE TABLE igo_attribut ( + id integer NOT NULL, + geometrie_id integer, + colonne character varying(50) NOT NULL, + alias character varying(50), + description character varying(2000), + est_cle boolean, + est_nom boolean, + est_description boolean, + est_filtre boolean, + est_geometrie boolean, + est_inclu boolean, + liste_valeur_id integer, + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_attribut_geometrie_def_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_attribut_geometrie_def_id_seq OWNED BY igo_attribut.geometrie_id; + +CREATE SEQUENCE igo_attribut_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_attribut_id_seq OWNED BY igo_attribut.id; + +CREATE TABLE igo_catalogue_csw ( + id integer NOT NULL, + url character varying(500), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_catalogue_csw_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_catalogue_csw_id_seq OWNED BY igo_catalogue_csw.id; + +CREATE TABLE igo_classe ( + id integer NOT NULL, + couche_id integer, + mf_class_def character varying(2000), + date_modif timestamp without time zone, + mf_class_z_order integer +); + +CREATE TABLE igo_classe_entite ( + id integer NOT NULL, + nom character varying(200), + description character varying(2000), + source_entite_id integer, + classification_id integer, + organisme_responsable_id integer, + contact_id integer, + remarque character varying(2000), + catalogue_csw_id integer, + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_classe_entite_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_classe_entite_id_seq OWNED BY igo_classe_entite.id; + +CREATE SEQUENCE igo_classe_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_classe_id_seq OWNED BY igo_classe.id; + +CREATE TABLE igo_classification ( + id integer NOT NULL, + nom character varying(50), + description character varying(2000), + code_geonetwork character varying(50), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_classification_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_classification_id_seq OWNED BY igo_classification.id; + +CREATE TABLE igo_connexion ( + id integer NOT NULL, + nom character varying(50), + connexion character varying(2000), + date_modif timestamp without time zone, + connexion_type_id integer +); + +CREATE SEQUENCE igo_connexion_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_connexion_id_seq OWNED BY igo_connexion.id; + +CREATE TABLE igo_connexion_type ( + id integer NOT NULL, + nom character varying(50), + connexion_type character varying(50), + date_modif timestamp without time zone, + geometrie_type character varying(1) +); + +CREATE SEQUENCE igo_connexion_type_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_connexion_type_id_seq OWNED BY igo_connexion_type.id; + +CREATE TABLE igo_contact ( + id integer NOT NULL, + organisme_responsable_id integer, + prenom character varying(50), + nom character varying(50), + poste character varying(70), + no_telephone character varying(30), + courriel character varying(100), + est_membre_acrigeo boolean, + remarque character varying(2000), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_contact_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_contact_id_seq OWNED BY igo_contact.id; + +CREATE TABLE igo_contexte ( + id integer NOT NULL, + mode character(1), + "position" character varying(50), + zoom numeric(4,2), + code character varying(100), + nom character varying(100), + description character varying(2000), + mf_map_def character varying(2000), + date_modif timestamp without time zone, + json character varying(2000), + mf_map_projection character varying(200), + mf_map_meta_onlineresource character varying(1000) NOT NULL, + ind_ordre_arbre character varying(1), + profil_proprietaire_id integer +); + +CREATE SEQUENCE igo_contexte_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_contexte_id_seq OWNED BY igo_contexte.id; + +CREATE TABLE igo_couche ( + id integer NOT NULL, + type character(1), + description character varying(2000), + geometrie_id integer, +-- groupe_id integer, + vue_validation character varying(250), + mf_layer_name character varying(150), + mf_layer_group character varying(300), + mf_layer_meta_name character varying(150), + mf_layer_filtre character varying(1000), + mf_layer_minscale bigint, + mf_layer_maxscale bigint, + mf_layer_labelminscale bigint, + mf_layer_labelmaxscale bigint, + mf_layer_def character varying(2000), + mf_layer_meta_def character varying(2000), + service_tuile character varying(500), + fiche_csw_id character varying(50), + mf_layer_meta_wfs_max_feature integer, + est_fond_de_carte boolean, + date_modif timestamp without time zone, + mf_layer_opacity integer, + mf_layer_meta_title character varying(150), + mf_layer_meta_group_title character varying(200), + mf_layer_labelitem character varying(50), + mf_layer_meta_z_order integer, + print_option_url character varying(200), + print_option_layer_name character varying(100), + max_zoom_level integer, + min_zoom_level integer +); + +CREATE TABLE igo_couche_contexte ( + contexte_id integer, + couche_id integer, + groupe_id integer, + arbre_id character varying(50), + est_visible boolean DEFAULT false, + est_active boolean DEFAULT false, + ind_fond_de_carte character(1), + mf_layer_meta_name character varying(150), + mf_layer_meta_title character varying(150), + mf_layer_meta_group_title character varying(200), + mf_layer_class_def character varying(500), + date_modif timestamp without time zone, + id integer NOT NULL, + est_exclu boolean DEFAULT false, + attribut_id integer, + mf_layer_meta_z_order integer, + mf_layer_filtre character varying(1000) +); + +CREATE SEQUENCE igo_couche_contexte_contexte_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_couche_contexte_contexte_id_seq OWNED BY igo_couche_contexte.contexte_id; + +CREATE SEQUENCE igo_couche_contexte_couche_def_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_couche_contexte_couche_def_id_seq OWNED BY igo_couche_contexte.couche_id; + +CREATE SEQUENCE igo_couche_contexte_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_couche_contexte_id_seq OWNED BY igo_couche_contexte.id; + +CREATE SEQUENCE igo_couche_geometrie_def_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_couche_geometrie_def_id_seq OWNED BY igo_couche.geometrie_id; + +CREATE SEQUENCE igo_couche_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_couche_id_seq OWNED BY igo_couche.id; + +CREATE TABLE igo_geometrie ( + id integer NOT NULL, + classe_entite_id integer, + geometrie_type_id integer NOT NULL, + vue_defaut character varying(250), + date_chargement timestamp without time zone, + connexion_id integer, + echelle_prod character varying(50), + remarque character varying(2000), + date_modif timestamp without time zone, + ind_inclusion character varying(1), + mf_layer_data character varying(500), + mf_layer_projection character varying(200), + mf_layer_meta_z_order integer +); + +CREATE SEQUENCE igo_geometrie_classe_entite_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_geometrie_classe_entite_id_seq OWNED BY igo_geometrie.classe_entite_id; + +CREATE SEQUENCE igo_geometrie_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_geometrie_id_seq OWNED BY igo_geometrie.id; + +CREATE TABLE igo_geometrie_type ( + id integer NOT NULL, + nom character varying(50), + layer_type character varying(50), + date_modif timestamp without time zone, + mf_layer_meta_z_order integer +); + +CREATE SEQUENCE igo_geometrie_type_id_seq + START WITH 1 + INCREMENT BY 1 + MINVALUE 0 + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_geometrie_type_id_seq OWNED BY igo_geometrie_type.id; + +CREATE TABLE igo_groupe ( + id integer NOT NULL, + nom character varying(150), + description character varying(200), + date_modif timestamp without time zone, + profil_proprietaire_id integer, + mf_layer_meta_z_order integer, + est_exclu_arbre boolean +); + +CREATE TABLE igo_groupe_couche +( + id integer NOT NULL , + groupe_id integer, + couche_id integer +); + +CREATE SEQUENCE igo_groupe_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_groupe_id_seq OWNED BY igo_groupe.id; + +drop sequence IF EXISTS igo_groupe_couche_id_seq; +CREATE SEQUENCE igo_groupe_couche_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_groupe_couche_id_seq OWNED BY igo_groupe_couche.id; + + +CREATE TABLE igo_groupe_groupe +( + id integer NOT NULL , + groupe_id integer, + parent_groupe_id integer +); + +drop sequence if exists igo_groupe_groupe_id_seq; +CREATE SEQUENCE igo_groupe_groupe_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_groupe_groupe_id_seq OWNED BY igo_groupe_groupe.id; + + +CREATE TABLE igo_liste_valeur ( + id integer NOT NULL, + description character varying(2000), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_liste_valeur_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_liste_valeur_id_seq OWNED BY igo_liste_valeur.id; + +CREATE TABLE igo_organisme_responsable ( + id integer NOT NULL, + acronyme character(10), + nom character varying(100), + url character varying(500), + contact_id integer, + remarque character varying(2000), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_organisme_responsable_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_organisme_responsable_id_seq OWNED BY igo_organisme_responsable.id; + +CREATE TABLE igo_permission ( + id integer NOT NULL, + profil_id integer, + couche_id integer, + est_lecture boolean DEFAULT false, + est_analyse boolean DEFAULT false, + est_ecriture boolean DEFAULT false, + est_export boolean DEFAULT false, + est_association boolean DEFAULT false, + date_modif timestamp without time zone, + groupe_id integer, + est_exclu boolean DEFAULT false, + attribut_id integer, + mf_layer_filtre character varying(200) +); + +CREATE SEQUENCE igo_permission_couche_def_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_permission_couche_def_id_seq OWNED BY igo_permission.couche_id; + +CREATE SEQUENCE igo_permission_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_permission_id_seq OWNED BY igo_permission.id; + +CREATE SEQUENCE igo_permission_profil_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_permission_profil_id_seq OWNED BY igo_permission.profil_id; + +CREATE TABLE igo_profil ( + id integer NOT NULL, + nom character varying(50) NOT NULL, + profil_proprietaire_id integer, + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_profil_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_profil_id_seq OWNED BY igo_profil.id; + +CREATE TABLE igo_service ( + id integer NOT NULL, + nom character varying(50), + description character varying(2000), + wsdl character varying(500), + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_service_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_service_id_seq OWNED BY igo_service.id; + +CREATE TABLE igo_service_profil ( + profil_id integer, + service_id integer, + date_modif timestamp without time zone, + id integer NOT NULL +); + +CREATE SEQUENCE igo_service_profil_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; +ALTER SEQUENCE igo_service_profil_id_seq OWNED BY igo_service_profil.id; + +CREATE TABLE igo_source_entite ( + id integer NOT NULL, + url character varying(500) NOT NULL, + organisme_responsable_id integer, + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_source_entite_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_source_entite_id_seq OWNED BY igo_source_entite.id; + +CREATE TABLE igo_utilisateur ( + id integer NOT NULL, + nom character varying(50), + est_admin boolean NOT NULL, + est_pilote boolean NOT NULL, + date_modif timestamp without time zone +); + +CREATE SEQUENCE igo_utilisateur_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_utilisateur_id_seq OWNED BY igo_utilisateur.id; + +CREATE TABLE igo_utilisateur_profil ( + profil_id integer NOT NULL, + utilisateur_id integer NOT NULL, + date_modif timestamp without time zone, + id integer NOT NULL +); + +CREATE SEQUENCE igo_utilisateur_profil_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_utilisateur_profil_id_seq OWNED BY igo_utilisateur_profil.id; + +CREATE TABLE igo_valeur ( + id integer NOT NULL, + description character varying(2000), + liste_valeur_id integer, + valeur character varying(200), + date_modif timestamp without time zone +); + +DROP SEQUENCE IF EXISTS igo_valeur_id_seq; +CREATE SEQUENCE igo_valeur_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE igo_valeur_id_seq OWNED BY igo_valeur.id; + +ALTER TABLE ONLY igo_attribut ALTER COLUMN id SET DEFAULT nextval('igo_attribut_id_seq'::regclass); + +ALTER TABLE ONLY igo_catalogue_csw ALTER COLUMN id SET DEFAULT nextval('igo_catalogue_csw_id_seq'::regclass); + +ALTER TABLE ONLY igo_classe ALTER COLUMN id SET DEFAULT nextval('igo_classe_id_seq'::regclass); + +ALTER TABLE ONLY igo_classe_entite ALTER COLUMN id SET DEFAULT nextval('igo_classe_entite_id_seq'::regclass); + +ALTER TABLE ONLY igo_classification ALTER COLUMN id SET DEFAULT nextval('igo_classification_id_seq'::regclass); + +ALTER TABLE ONLY igo_connexion ALTER COLUMN id SET DEFAULT nextval('igo_connexion_id_seq'::regclass); + +ALTER TABLE ONLY igo_connexion_type ALTER COLUMN id SET DEFAULT nextval('igo_connexion_type_id_seq'::regclass); + +ALTER TABLE ONLY igo_contact ALTER COLUMN id SET DEFAULT nextval('igo_contact_id_seq'::regclass); + +ALTER TABLE ONLY igo_contexte ALTER COLUMN id SET DEFAULT nextval('igo_contexte_id_seq'::regclass); + +ALTER TABLE ONLY igo_couche ALTER COLUMN id SET DEFAULT nextval('igo_couche_id_seq'::regclass); + +ALTER TABLE ONLY igo_couche_contexte ALTER COLUMN id SET DEFAULT nextval('igo_couche_contexte_id_seq'::regclass); + +ALTER TABLE ONLY igo_geometrie ALTER COLUMN id SET DEFAULT nextval('igo_geometrie_id_seq'::regclass); + +ALTER TABLE ONLY igo_geometrie_type ALTER COLUMN id SET DEFAULT nextval('igo_geometrie_type_id_seq'::regclass); + +ALTER TABLE ONLY igo_groupe ALTER COLUMN id SET DEFAULT nextval('igo_groupe_id_seq'::regclass); + +ALTER TABLE ONLY igo_groupe_couche ALTER COLUMN id SET DEFAULT nextval('igo_groupe_couche_id_seq'::regclass); + +ALTER TABLE ONLY igo_groupe_groupe ALTER COLUMN id SET DEFAULT nextval('igo_groupe_groupe_id_seq'::regclass); + +ALTER TABLE ONLY igo_liste_valeur ALTER COLUMN id SET DEFAULT nextval('igo_liste_valeur_id_seq'::regclass); + +ALTER TABLE ONLY igo_organisme_responsable ALTER COLUMN id SET DEFAULT nextval('igo_organisme_responsable_id_seq'::regclass); + +ALTER TABLE ONLY igo_permission ALTER COLUMN id SET DEFAULT nextval('igo_permission_id_seq'::regclass); + +ALTER TABLE ONLY igo_profil ALTER COLUMN id SET DEFAULT nextval('igo_profil_id_seq'::regclass); + +ALTER TABLE ONLY igo_service ALTER COLUMN id SET DEFAULT nextval('igo_service_id_seq'::regclass); + +ALTER TABLE ONLY igo_service_profil ALTER COLUMN id SET DEFAULT nextval('igo_service_profil_id_seq'::regclass); + +ALTER TABLE ONLY igo_source_entite ALTER COLUMN id SET DEFAULT nextval('igo_source_entite_id_seq'::regclass); + +ALTER TABLE ONLY igo_utilisateur ALTER COLUMN id SET DEFAULT nextval('igo_utilisateur_id_seq'::regclass); + +ALTER TABLE ONLY igo_utilisateur_profil ALTER COLUMN id SET DEFAULT nextval('igo_utilisateur_profil_id_seq'::regclass); + +ALTER TABLE ONLY igo_valeur ALTER COLUMN id SET DEFAULT nextval('igo_valeur_id_seq'::regclass); + +ALTER TABLE ONLY igo_connexion_type + ADD CONSTRAINT "PK_connexion_type" PRIMARY KEY (id); + +ALTER TABLE ONLY igo_attribut + ADD CONSTRAINT pk_attribut PRIMARY KEY (id); + +ALTER TABLE ONLY igo_source_entite + ADD CONSTRAINT pk_catalogue PRIMARY KEY (id); + +ALTER TABLE ONLY igo_catalogue_csw + ADD CONSTRAINT pk_catalogue_csw PRIMARY KEY (id); + +ALTER TABLE ONLY igo_classe + ADD CONSTRAINT pk_classe PRIMARY KEY (id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT pk_classe_entite PRIMARY KEY (id); + +ALTER TABLE ONLY igo_classification + ADD CONSTRAINT pk_classification PRIMARY KEY (id); + +ALTER TABLE ONLY igo_connexion + ADD CONSTRAINT pk_connexion PRIMARY KEY (id); + +ALTER TABLE ONLY igo_contact + ADD CONSTRAINT pk_contact PRIMARY KEY (id); + +ALTER TABLE ONLY igo_contexte + ADD CONSTRAINT pk_contexte PRIMARY KEY (id); + +ALTER TABLE ONLY igo_couche + ADD CONSTRAINT pk_couche PRIMARY KEY (id); + +ALTER TABLE ONLY igo_couche_contexte + ADD CONSTRAINT pk_couche_contexte PRIMARY KEY (id); + +ALTER TABLE ONLY igo_geometrie + ADD CONSTRAINT pk_geometrie PRIMARY KEY (id); + +ALTER TABLE ONLY igo_geometrie_type + ADD CONSTRAINT pk_geometrie_type PRIMARY KEY (id); + +ALTER TABLE ONLY igo_groupe + ADD CONSTRAINT pk_groupe PRIMARY KEY (id); + +ALTER TABLE ONLY igo_groupe_couche + ADD CONSTRAINT pk_groupe_couche PRIMARY KEY (id); + +ALTER TABLE ONLY igo_groupe_groupe + ADD CONSTRAINT pk_groupe_groupe PRIMARY KEY (id); + +ALTER TABLE ONLY igo_liste_valeur + ADD CONSTRAINT pk_liste_valeur PRIMARY KEY (id); + +ALTER TABLE ONLY igo_organisme_responsable + ADD CONSTRAINT pk_organisme_responsable PRIMARY KEY (id); + +ALTER TABLE ONLY igo_permission + ADD CONSTRAINT pk_permission PRIMARY KEY (id); + +ALTER TABLE ONLY igo_profil + ADD CONSTRAINT pk_profil PRIMARY KEY (id); + +ALTER TABLE ONLY igo_service + ADD CONSTRAINT pk_service_cartographique PRIMARY KEY (id); + +ALTER TABLE ONLY igo_service_profil + ADD CONSTRAINT pk_service_profil PRIMARY KEY (id); + +ALTER TABLE ONLY igo_utilisateur + ADD CONSTRAINT pk_utilisateur PRIMARY KEY (id); + +ALTER TABLE ONLY igo_utilisateur_profil + ADD CONSTRAINT pk_utilisateur_profil PRIMARY KEY (id); + +ALTER TABLE ONLY igo_valeur + ADD CONSTRAINT pk_valeur PRIMARY KEY (id); + +ALTER TABLE ONLY igo_contexte + ADD CONSTRAINT uq_contexte_code UNIQUE (code); + +ALTER TABLE ONLY igo_couche + ADD CONSTRAINT uq_couche_mf_layer_name UNIQUE (mf_layer_name); + + +CREATE INDEX igo_attribut_id_idx ON igo_attribut USING btree (geometrie_id); + +CREATE INDEX igo_couche_contexte_contexte_id_idx ON igo_couche_contexte USING btree (contexte_id); + +CREATE INDEX igo_couche_contexte_couche_id_contexte_id_est_exclu_idx ON igo_couche_contexte USING btree (couche_id, contexte_id, est_exclu); + +CREATE INDEX igo_couche_contexte_couche_id_idx ON igo_couche_contexte USING btree (couche_id); + +CREATE INDEX igo_couche_contexte_est_exclu_idx ON igo_couche_contexte USING btree (est_exclu); + +CREATE INDEX igo_couche_contexte_groupe_id_idx ON igo_couche_contexte USING btree (groupe_id); + +CREATE INDEX igo_permission_couche_id_idx ON igo_permission USING btree (couche_id); + +CREATE INDEX igo_permission_couche_id_profil_id_est_exclu_idx ON igo_permission USING btree (couche_id, profil_id, est_exclu); + +CREATE INDEX igo_permission_est_exclu_idx ON igo_permission USING btree (est_exclu); + +CREATE INDEX igo_permission_profil_id_idx ON igo_permission USING btree (profil_id); + +ALTER TABLE ONLY igo_connexion + ADD CONSTRAINT "FK_connexion_connexion_type" FOREIGN KEY (connexion_type_id) REFERENCES igo_connexion_type(id); + +ALTER TABLE ONLY igo_attribut + ADD CONSTRAINT fk_attribut_geometrie FOREIGN KEY (geometrie_id) REFERENCES igo_geometrie(id); + +ALTER TABLE ONLY igo_attribut + ADD CONSTRAINT fk_attribut_liste_valeur FOREIGN KEY (liste_valeur_id) REFERENCES igo_liste_valeur(id); + +ALTER TABLE ONLY igo_classe + ADD CONSTRAINT fk_classe_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT fk_classe_entite_catalogue_csw FOREIGN KEY (catalogue_csw_id) REFERENCES igo_catalogue_csw(id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT fk_classe_entite_classification FOREIGN KEY (classification_id) REFERENCES igo_classification(id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT fk_classe_entite_contact FOREIGN KEY (contact_id) REFERENCES igo_contact(id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT fk_classe_entite_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); + +ALTER TABLE ONLY igo_classe_entite + ADD CONSTRAINT fk_classe_entite_source_entite FOREIGN KEY (source_entite_id) REFERENCES igo_source_entite(id); + +ALTER TABLE ONLY igo_contact + ADD CONSTRAINT fk_contact_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); + +ALTER TABLE ONLY igo_contexte + ADD CONSTRAINT fk_contexte_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_couche_contexte + ADD CONSTRAINT fk_couche_contexte_contexte FOREIGN KEY (contexte_id) REFERENCES igo_contexte(id); + +ALTER TABLE ONLY igo_couche_contexte + ADD CONSTRAINT fk_couche_contexte_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); + +ALTER TABLE ONLY igo_couche_contexte + ADD CONSTRAINT fk_couche_contexte_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); + +ALTER TABLE ONLY igo_couche + ADD CONSTRAINT fk_couche_geometrie FOREIGN KEY (geometrie_id) REFERENCES igo_geometrie(id); + +ALTER TABLE ONLY igo_geometrie + ADD CONSTRAINT fk_geometrie_classe_entite FOREIGN KEY (classe_entite_id) REFERENCES igo_classe_entite(id); + +ALTER TABLE ONLY igo_geometrie + ADD CONSTRAINT fk_geometrie_connexion FOREIGN KEY (connexion_id) REFERENCES igo_connexion(id); + +ALTER TABLE ONLY igo_geometrie + ADD CONSTRAINT fk_geometrie_geometrie_type FOREIGN KEY (geometrie_type_id) REFERENCES igo_geometrie_type(id); + +ALTER TABLE ONLY igo_groupe + ADD CONSTRAINT fk_groupe_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_organisme_responsable + ADD CONSTRAINT fk_organisme_responsable_contact FOREIGN KEY (contact_id) REFERENCES igo_contact(id); + +ALTER TABLE ONLY igo_permission + ADD CONSTRAINT fk_permission_attribut FOREIGN KEY (attribut_id) REFERENCES igo_attribut(id); + +ALTER TABLE ONLY igo_permission + ADD CONSTRAINT fk_permission_couche FOREIGN KEY (couche_id) REFERENCES igo_couche(id); + +ALTER TABLE ONLY igo_permission + ADD CONSTRAINT fk_permission_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); + +ALTER TABLE ONLY igo_permission + ADD CONSTRAINT fk_permission_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_profil + ADD CONSTRAINT fk_profil_proprietaire_id FOREIGN KEY (profil_proprietaire_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_service_profil + ADD CONSTRAINT fk_service_profil_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_service_profil + ADD CONSTRAINT fk_service_profil_service_cartographique FOREIGN KEY (service_id) REFERENCES igo_service(id); + +ALTER TABLE ONLY igo_source_entite + ADD CONSTRAINT fk_source_entite_organisme_responsable FOREIGN KEY (organisme_responsable_id) REFERENCES igo_organisme_responsable(id); + +ALTER TABLE ONLY igo_utilisateur_profil + ADD CONSTRAINT fk_utilisateur_profil_profil FOREIGN KEY (profil_id) REFERENCES igo_profil(id); + +ALTER TABLE ONLY igo_utilisateur_profil + ADD CONSTRAINT fk_utilisateur_profil_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES igo_utilisateur(id); + +ALTER TABLE ONLY igo_valeur + ADD CONSTRAINT fk_valeur_liste_de_valeur FOREIGN KEY (liste_valeur_id) REFERENCES igo_liste_valeur(id); + + +ALTER TABLE ONLY igo_groupe_couche + ADD CONSTRAINT "FK_groupe_couche_groupe" FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); +ALTER TABLE ONLY igo_groupe_couche + ADD CONSTRAINT "FK_groupe_couche_couche" FOREIGN KEY (couche_id) REFERENCES igo_couche(id); + + + +-- commit 7bbe036f1fc49cea17179874ed73422b861f70d0 du projet metadonnees par Francois Gourdeau +ALTER TABLE igo_couche ADD COLUMN est_commune BOOLEAN; +ALTER TABLE igo_couche ADD COLUMN est_publique BOOLEAN; +ALTER TABLE igo_connexion_type ADD COLUMN ind_vue BOOLEAN; +ALTER TABLE igo_connexion_type ADD COLUMN ind_data BOOLEAN; +ALTER TABLE igo_connexion_type ADD COLUMN ind_projection BOOLEAN; +ALTER TABLE igo_geometrie_type ADD COLUMN geometrie_type CHARACTER VARYING(1); +ALTER TABLE igo_classe ALTER COLUMN mf_class_def TYPE CHARACTER VARYING(5000); + +-- merge request #22 du projet metadonnees +ALTER TABLE igo_couche RENAME COLUMN mf_layer_minscale TO mf_layer_minscale_denom; +ALTER TABLE igo_couche RENAME COLUMN mf_layer_maxscale TO mf_layer_maxscale_denom; +ALTER TABLE igo_couche RENAME COLUMN mf_layer_labelminscale TO mf_layer_labelminscale_denom; +ALTER TABLE igo_couche RENAME COLUMN mf_layer_labelmaxscale TO mf_layer_labelmaxscale_denom; + +-- merge request #30 du projet metadonnees + +ALTER TABLE igo_geometrie ADD COLUMN acces CHARACTER VARYING(1); +ALTER TABLE igo_couche ADD COLUMN layer_a_order CHARACTER VARYING(1); +ALTER TABLE igo_couche_contexte ADD COLUMN layer_a_order CHARACTER VARYING(1); +ALTER TABLE igo_couche DROP COLUMN type; + + +ALTER TABLE igo_profil ADD COLUMN libelle character varying; +ALTER TABLE igo_profil ALTER COLUMN nom TYPE character varying(200); + +drop view if exists igo_vue_permission_profil; +drop view if exists igo_vue_contexte_couche_navigateur; +drop view if exists igo_vue_groupes_recursif; + +-- Aussi inclus dans migration-0.3-vers-0.4.sql pour ceux qui sont une maj +ALTER TABLE igo_couche_contexte ALTER COLUMN layer_a_order TYPE integer USING 0; +ALTER TABLE igo_couche ALTER COLUMN layer_a_order TYPE integer USING 0; + + +CREATE VIEW igo_vue_groupes_recursif AS + WITH RECURSIVE s(id, nom, groupe_id, grp) AS ( + SELECT g.id, + g.nom, + gg_1.parent_groupe_id AS groupe_id, + g.id::text AS grp, + g.nom::character varying(500) AS nom_complet, + g.est_exclu_arbre + FROM igo_groupe g + LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id + UNION + SELECT igo_groupe.id, + igo_groupe.nom, + s_1.id AS groupe_id, + (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, + CASE igo_groupe.est_exclu_arbre + WHEN false THEN (((s_1.nom_complet::text || '/'::text) || igo_groupe.nom::character varying(500)::text))::character varying(500) + ELSE s_1.nom_complet + END AS nom_complet, + igo_groupe.est_exclu_arbre + FROM igo_groupe, + igo_groupe_groupe gg_1 + JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id + WHERE gg_1.groupe_id = igo_groupe.id + ) + SELECT s.id AS groupe_id, + s.nom, + s.groupe_id AS parent_groupe_id, + s.nom_complet, + s.est_exclu_arbre, + s.grp + FROM s + WHERE NOT (s.grp IN ( SELECT substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1) AS substr + FROM s s_1)) + ORDER BY s.grp; + +CREATE MATERIALIZED VIEW igo_vue_groupes_recursif_materialized AS + SELECT * FROM igo_vue_groupes_recursif +WITH DATA; + +CREATE OR REPLACE VIEW igo_vue_couche AS + SELECT c.id, + c.description, + c.geometrie_id, + c.vue_validation, + c.mf_layer_name, + c.mf_layer_group, + c.mf_layer_meta_name, + c.mf_layer_filtre, + c.mf_layer_minscale_denom, + c.mf_layer_maxscale_denom, + c.mf_layer_labelminscale_denom, + c.mf_layer_labelmaxscale_denom, + c.mf_layer_def, + c.mf_layer_meta_def, + c.service_tuile, + e.catalogue_csw_id, + c.fiche_csw_id, + c.mf_layer_meta_wfs_max_feature, + c.est_fond_de_carte, + c.mf_layer_opacity, + c.mf_layer_meta_title, + c.mf_layer_meta_group_title, + c.mf_layer_labelitem, + COALESCE(c.mf_layer_meta_z_order, g.mf_layer_meta_z_order, gt.mf_layer_meta_z_order) AS mf_layer_meta_z_order, + c.print_option_url, + c.print_option_layer_name, + c.est_commune, + c.est_publique, + c.layer_a_order, + c.max_zoom_level, + c.min_zoom_level, + g.classe_entite_id, + g.geometrie_type_id, + g.vue_defaut, + g.date_chargement, + g.connexion_id, + g.echelle_prod, + g.remarque AS remarque_geometrie, + g.ind_inclusion, + g.mf_layer_data, + g.mf_layer_projection, + g.acces, + e.nom AS nom_classe_entite, + e.description AS description_classe_entite, + e.source_entite_id, + e.classification_id, + e.organisme_responsable_id, + e.contact_id, + e.remarque AS remarque_classe_entite, + x.nom AS nom_connexion, + x.connexion, + x.connexion_type_id, + t.nom AS nom_connexion_type, + t.connexion_type, + gt.nom AS nom_geometrie_type, + gt.layer_type, + gt.geometrie_type + FROM igo_couche c, + igo_classe_entite e, + igo_geometrie g + LEFT JOIN igo_connexion x ON g.connexion_id = x.id + LEFT JOIN igo_connexion_type t ON x.connexion_type_id = t.id + LEFT JOIN igo_geometrie_type gt ON g.geometrie_type_id = gt.id + WHERE c.geometrie_id = g.id AND g.classe_entite_id = e.id; + + + + +--ALTER TABLE igo_couche_contexte ADD COLUMN groupe_couche_id INTEGER; +--ALTER TABLE ONLY igo_couche_contexte +-- ADD CONSTRAINT "FK_couche_contexte_groupe_couche" FOREIGN KEY (groupe_couche_id) REFERENCES igo_groupe_couche(id); + +--ALTER TABLE igo_permission ADD COLUMN groupe_couche_id INTEGER; +--ALTER TABLE ONLY igo_permission + -- ADD CONSTRAINT "FK_permission_groupe_couche" FOREIGN KEY (groupe_couche_id) REFERENCES igo_groupe_couche(id); + +-- Vieille vue inutile +DROP VIEW IF EXISTS igo_vue_profils_pour_groupes; + + +DROP VIEW if exists igo_vue_permissions_pour_groupes; + +DROP VIEW IF EXISTS igo_vue_permissions_pour_couches; + +CREATE OR REPLACE VIEW igo_vue_permissions_pour_couches AS + SELECT igo_couche.id AS couche_id, + COALESCE(igo_permission.profil_id, 0) AS profil_id, + COALESCE(igo_couche.est_publique, false) OR COALESCE(igo_permission.est_lecture, false) OR COALESCE(igo_permission.est_association, false) AS est_lecture, + COALESCE(igo_permission.est_analyse, false) OR COALESCE(igo_permission.est_association, false) AS est_analyse, + COALESCE(igo_permission.est_ecriture, false) OR COALESCE(igo_permission.est_association, false) AS est_ecriture, + COALESCE(igo_permission.est_export, false) OR COALESCE(igo_permission.est_association, false) AS est_export, + COALESCE(igo_permission.est_association, false) OR COALESCE(igo_permission.est_association, false) AS est_association + FROM igo_couche + LEFT JOIN igo_permission ON igo_couche.id = igo_permission.couche_id; + +ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_utilisateur_nom_unique UNIQUE (nom); +ALTER TABLE igo_utilisateur ADD CONSTRAINT igo_profil_nom_unique UNIQUE (nom); + + +ALTER TABLE igo_couche ADD COLUMN mf_layer_meta_attribution_title CHARACTER VARYING(5000); + + +DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif; + +CREATE VIEW igo_vue_contexte_groupes_recursif AS + WITH RECURSIVE s(id, nom, contexte_id, groupe_id, grp) AS ( + SELECT g.id, + g.nom, + cc.contexte_id, + gg_1.parent_groupe_id AS groupe_id, + g.id::text AS grp, + CASE + WHEN COALESCE(cc.est_visible, false) AND NOT g.est_exclu_arbre THEN COALESCE(cc.mf_layer_meta_group_title, g.nom)::character varying(500) + ELSE ''::character varying(500) + END AS nom_complet, + g.est_exclu_arbre + FROM igo_groupe g + LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id + LEFT JOIN igo_couche_contexte cc ON cc.arbre_id::text = g.id::text AND cc.couche_id IS NULL + UNION + SELECT igo_groupe.id, + igo_groupe.nom, + cc.contexte_id, + s_1.id AS groupe_id, + (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, + CASE + WHEN COALESCE(cc.est_visible, false) AND NOT s_1.est_exclu_arbre THEN (((s_1.nom_complet::text || '/'::text) || COALESCE(cc.mf_layer_meta_group_title, igo_groupe.nom)::character varying(500)::text))::character varying(500) + ELSE ''::character varying(500) + END AS nom_complet, + igo_groupe.est_exclu_arbre + FROM igo_groupe, + igo_groupe_groupe gg_1 + JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id + LEFT JOIN igo_couche_contexte cc ON s_1.contexte_id = cc.contexte_id AND cc.arbre_id::text = concat(s_1.grp, '_', gg_1.groupe_id) AND cc.couche_id IS NULL + WHERE gg_1.groupe_id = igo_groupe.id + ) + SELECT s.id AS groupe_id, + s.nom, + s.contexte_id, + s.groupe_id AS parent_groupe_id, + btrim(s.nom_complet::text, '/'::text) AS nom_complet, + s.est_exclu_arbre, + s.grp + FROM s + WHERE NOT (concat(s.contexte_id, s.grp) IN ( SELECT concat(s_1.contexte_id, substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1)) AS substr + FROM s s_1)) AND s.contexte_id IS NOT NULL AND NULLIF(s.nom_complet::text, ''::text) IS NOT NULL + ORDER BY s.grp; + +DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif_materialized; +CREATE MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized AS + SELECT * FROM igo_vue_contexte_groupes_recursif +WITH DATA; + +-- +DROP VIEW IF EXISTS igo_vue_contexte_couche_navigateur; +CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS + WITH a AS ( + SELECT cc.contexte_id, + cc.couche_id, + cgr.groupe_id, + cc.est_visible, + cc.arbre_id, + cgr.parent_groupe_id, + cc.est_active, + igo_couche.est_fond_de_carte, + igo_couche.mf_layer_name::text, + igo_couche.mf_layer_name AS mf_layer_name_igo, + COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, + igo_couche.mf_layer_meta_name, + cc.mf_layer_meta_title AS mf_layer_meta_title2, + COALESCE(NULLIF(cc.mf_layer_meta_group_title::text, ''::text), igo_couche.mf_layer_meta_title::text) AS mf_layer_meta_title, + cgr.nom_complet AS mf_layer_meta_group_title, + igo_couche.mf_layer_group, + igo_couche.mf_layer_meta_def, + igo_couche.mf_layer_meta_z_order, + igo_couche.mf_layer_minscale_denom, + igo_couche.mf_layer_maxscale_denom, + igo_couche.mf_layer_labelminscale_denom, + igo_couche.mf_layer_labelmaxscale_denom, + igo_couche.print_option_url, + igo_couche.print_option_layer_name, + igo_couche.fiche_csw_id, + igo_couche.mf_layer_opacity, + igo_couche.mf_layer_meta_attribution_title, + cc.layer_a_order, + cgr.nom_complet AS nom_groupe, + igo_couche.geometrie_id, + cc.ind_fond_de_carte, + cgr.est_exclu_arbre, + cgr.grp, + igo_couche.max_zoom_level, + igo_couche.min_zoom_level + FROM igo_couche_contexte cc + JOIN igo_couche ON cc.couche_id = igo_couche.id + JOIN igo_vue_contexte_groupes_recursif cgr ON cgr.contexte_id = cc.contexte_id AND cgr.grp = cc.arbre_id::text + ORDER BY length(cc.arbre_id::text) - length(replace(cc.arbre_id::text, '_'::text, ''::text)) + ) + SELECT a.contexte_id, + a.couche_id, + a.groupe_id, + last(a.est_visible) AS est_visible, + last(a.est_active) AS est_active, + last(a.est_fond_de_carte) AS est_fond_de_carte, + last(a.mf_layer_name) AS mf_layer_name, + a.mf_layer_name_igo, + last(a.mf_layer_meta_name) AS mf_layer_meta_name, + last(a.mf_layer_meta_title) AS mf_layer_meta_title, + last(a.mf_layer_group) AS mf_layer_group, + last(a.mf_layer_meta_def) AS mf_layer_meta_def, + last(COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order)) AS mf_layer_meta_z_order, + last(a.mf_layer_minscale_denom) AS mf_layer_minscale_denom, + last(a.mf_layer_maxscale_denom) AS mf_layer_maxscale_denom, + last(a.mf_layer_labelminscale_denom) AS mf_layer_labelminscale_denom, + last(a.mf_layer_labelmaxscale_denom) AS mf_layer_labelmaxscale_denom, + last(a.print_option_url) AS print_option_url, + last(a.print_option_layer_name) AS print_option_layer_name, + last(a.fiche_csw_id) AS fiche_csw_id, + last(a.mf_layer_opacity) AS mf_layer_opacity, + last(a.mf_layer_meta_attribution_title) AS mf_layer_meta_attribution_title, + last(a.layer_a_order) AS layer_a_order, + last(a.mf_layer_meta_group_title) AS mf_layer_meta_group_title, + last(igo_connexion_type.connexion_type) AS connexion_type, + last(igo_catalogue_csw.url) AS catalogue_csw_url, + last(igo_connexion.connexion) AS connexion, + last(a.max_zoom_level) AS max_zoom_level, + last(a.min_zoom_level) AS min_zoom_level, + last(COALESCE(igo_connexion_type.ind_data, true)) AS ind_data + FROM a + JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id + JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id + LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id + LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id + LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id + LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id + WHERE a.est_visible OR a.est_active + GROUP BY a.couche_id, a.groupe_id, a.contexte_id, a.arbre_id, a.mf_layer_name_igo + ORDER BY last(a.layer_a_order); + + +alter table igo_contexte add column generer_onlineResource boolean; + +ALTER TABLE ONLY igo_groupe_groupe + ADD CONSTRAINT fk_groupe_groupe_groupe FOREIGN KEY (groupe_id) REFERENCES igo_groupe(id); + +ALTER TABLE ONLY igo_groupe_groupe + ADD CONSTRAINT fk_groupe_groupe_groupe_parent FOREIGN KEY (parent_groupe_id) REFERENCES igo_groupe(id); diff --git a/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql new file mode 100644 index 00000000..6fcb3ea2 --- /dev/null +++ b/pilotage/app/sql/igo_migration_1.0.0_vers_1.1.0.sql @@ -0,0 +1,181 @@ +-- Pour les vues matérialisées +DROP VIEW IF EXISTS igo_vue_contexte_couche_navigateur; +DROP MATERIALIZED VIEW IF EXISTS igo_vue_contexte_groupes_recursif_materialized; +DROP VIEW IF EXISTS igo_vue_contexte_groupes_recursif; +DROP MATERIALIZED VIEW IF EXISTS igo_vue_groupes_recursif_materialized; +DROP VIEW IF EXISTS igo_vue_groupes_recursif; + +CREATE VIEW igo_vue_contexte_groupes_recursif AS + WITH RECURSIVE s(id, nom, contexte_id, groupe_id, grp) AS ( + SELECT g.id, + g.nom, + cc.contexte_id, + gg_1.parent_groupe_id AS groupe_id, + g.id::text AS grp, + CASE + WHEN COALESCE(cc.est_visible, false) AND NOT g.est_exclu_arbre THEN COALESCE(cc.mf_layer_meta_group_title, g.nom)::character varying(500) + ELSE ''::character varying(500) + END AS nom_complet, + g.est_exclu_arbre + FROM igo_groupe g + LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id + LEFT JOIN igo_couche_contexte cc ON cc.arbre_id::text = g.id::text AND cc.couche_id IS NULL + UNION + SELECT igo_groupe.id, + igo_groupe.nom, + cc.contexte_id, + s_1.id AS groupe_id, + (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, + CASE + WHEN COALESCE(cc.est_visible, false) AND NOT s_1.est_exclu_arbre THEN (((s_1.nom_complet::text || '/'::text) || COALESCE(cc.mf_layer_meta_group_title, igo_groupe.nom)::character varying(500)::text))::character varying(500) + ELSE ''::character varying(500) + END AS nom_complet, + igo_groupe.est_exclu_arbre + FROM igo_groupe, + igo_groupe_groupe gg_1 + JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id + LEFT JOIN igo_couche_contexte cc ON s_1.contexte_id = cc.contexte_id AND cc.arbre_id::text = concat(s_1.grp, '_', gg_1.groupe_id) AND cc.couche_id IS NULL + WHERE gg_1.groupe_id = igo_groupe.id + ) + SELECT s.id AS groupe_id, + s.nom, + s.contexte_id, + s.groupe_id AS parent_groupe_id, + btrim(s.nom_complet::text, '/'::text) AS nom_complet, + s.est_exclu_arbre, + s.grp + FROM s + WHERE NOT (concat(s.contexte_id, s.grp) IN ( SELECT concat(s_1.contexte_id, substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1)) AS substr + FROM s s_1)) AND s.contexte_id IS NOT NULL AND NULLIF(s.nom_complet::text, ''::text) IS NOT NULL + ORDER BY s.grp; + +CREATE MATERIALIZED VIEW igo_vue_contexte_groupes_recursif_materialized AS + SELECT * FROM igo_vue_contexte_groupes_recursif +WITH DATA; + +CREATE OR REPLACE VIEW igo_vue_contexte_couche_navigateur AS + WITH a AS ( + SELECT cc.contexte_id, + cc.couche_id, + cgr.groupe_id, + cc.est_visible, + cc.arbre_id, + cgr.parent_groupe_id, + cc.est_active, + igo_couche.est_fond_de_carte, + igo_couche.mf_layer_name::text, + igo_couche.mf_layer_name AS mf_layer_name_igo, + COALESCE(cc.mf_layer_meta_name, igo_couche.mf_layer_meta_name) AS mf_layer_meta_name2, + igo_couche.mf_layer_meta_name, + cc.mf_layer_meta_title AS mf_layer_meta_title2, + COALESCE(NULLIF(cc.mf_layer_meta_group_title::text, ''::text), igo_couche.mf_layer_meta_title::text) AS mf_layer_meta_title, + cgr.nom_complet AS mf_layer_meta_group_title, + igo_couche.mf_layer_group, + igo_couche.mf_layer_meta_def, + igo_couche.mf_layer_meta_z_order, + igo_couche.mf_layer_minscale_denom, + igo_couche.mf_layer_maxscale_denom, + igo_couche.mf_layer_labelminscale_denom, + igo_couche.mf_layer_labelmaxscale_denom, + igo_couche.print_option_url, + igo_couche.print_option_layer_name, + igo_couche.fiche_csw_id, + igo_couche.mf_layer_opacity, + igo_couche.mf_layer_meta_attribution_title, + cc.layer_a_order, + cgr.nom_complet AS nom_groupe, + igo_couche.geometrie_id, + cc.ind_fond_de_carte, + cgr.est_exclu_arbre, + cgr.grp, + igo_couche.max_zoom_level, + igo_couche.min_zoom_level + FROM igo_couche_contexte cc + JOIN igo_couche ON cc.couche_id = igo_couche.id + JOIN igo_vue_contexte_groupes_recursif cgr ON cgr.contexte_id = cc.contexte_id AND cgr.grp = cc.arbre_id::text + ORDER BY length(cc.arbre_id::text) - length(replace(cc.arbre_id::text, '_'::text, ''::text)) + ) + SELECT a.contexte_id, + a.couche_id, + a.groupe_id, + last(a.est_visible) AS est_visible, + last(a.est_active) AS est_active, + last(a.est_fond_de_carte) AS est_fond_de_carte, + last(a.mf_layer_name) AS mf_layer_name, + a.mf_layer_name_igo, + last(a.mf_layer_meta_name) AS mf_layer_meta_name, + last(a.mf_layer_meta_title) AS mf_layer_meta_title, + last(a.mf_layer_group) AS mf_layer_group, + last(a.mf_layer_meta_def) AS mf_layer_meta_def, + last(COALESCE(a.mf_layer_meta_z_order, igo_geometrie.mf_layer_meta_z_order, igo_geometrie_type.mf_layer_meta_z_order)) AS mf_layer_meta_z_order, + last(a.mf_layer_minscale_denom) AS mf_layer_minscale_denom, + last(a.mf_layer_maxscale_denom) AS mf_layer_maxscale_denom, + last(a.mf_layer_labelminscale_denom) AS mf_layer_labelminscale_denom, + last(a.mf_layer_labelmaxscale_denom) AS mf_layer_labelmaxscale_denom, + last(a.print_option_url) AS print_option_url, + last(a.print_option_layer_name) AS print_option_layer_name, + last(a.fiche_csw_id) AS fiche_csw_id, + last(a.mf_layer_opacity) AS mf_layer_opacity, + last(a.mf_layer_meta_attribution_title) AS mf_layer_meta_attribution_title, + last(a.layer_a_order) AS layer_a_order, + last(a.mf_layer_meta_group_title) AS mf_layer_meta_group_title, + last(igo_connexion_type.connexion_type) AS connexion_type, + last(igo_catalogue_csw.url) AS catalogue_csw_url, + last(igo_connexion.connexion) AS connexion, + last(a.max_zoom_level) AS max_zoom_level, + last(a.min_zoom_level) AS min_zoom_level, + last(COALESCE(igo_connexion_type.ind_data, true)) AS ind_data + FROM a + JOIN igo_geometrie ON a.geometrie_id = igo_geometrie.id + JOIN igo_geometrie_type ON igo_geometrie.geometrie_type_id = igo_geometrie_type.id + LEFT JOIN igo_connexion ON igo_geometrie.connexion_id = igo_connexion.id + LEFT JOIN igo_connexion_type ON igo_connexion.connexion_type_id = igo_connexion_type.id + LEFT JOIN igo_classe_entite ON igo_geometrie.classe_entite_id = igo_classe_entite.id + LEFT JOIN igo_catalogue_csw ON igo_classe_entite.catalogue_csw_id = igo_catalogue_csw.id + WHERE a.est_visible OR a.est_active + GROUP BY a.couche_id, a.groupe_id, a.contexte_id, a.arbre_id, a.mf_layer_name_igo + ORDER BY last(a.layer_a_order); + +CREATE VIEW igo_vue_groupes_recursif AS + WITH RECURSIVE s(id, nom, groupe_id, grp) AS ( + SELECT g.id, + g.nom, + gg_1.parent_groupe_id AS groupe_id, + g.id::text AS grp, + g.nom::character varying(500) AS nom_complet, + g.est_exclu_arbre + FROM igo_groupe g + LEFT JOIN igo_groupe_groupe gg_1 ON gg_1.groupe_id = g.id + UNION + SELECT igo_groupe.id, + igo_groupe.nom, + s_1.id AS groupe_id, + (s_1.grp || '_'::text) || igo_groupe.id::character varying(10)::text AS grp, + CASE igo_groupe.est_exclu_arbre + WHEN false THEN (((s_1.nom_complet::text || '/'::text) || igo_groupe.nom::character varying(500)::text))::character varying(500) + ELSE s_1.nom_complet + END AS nom_complet, + igo_groupe.est_exclu_arbre + FROM igo_groupe, + igo_groupe_groupe gg_1 + JOIN s s_1 ON s_1.id = gg_1.parent_groupe_id + WHERE gg_1.groupe_id = igo_groupe.id + ) + SELECT s.id AS groupe_id, + s.nom, + s.groupe_id AS parent_groupe_id, + s.nom_complet, + s.est_exclu_arbre, + s.grp + FROM s + WHERE NOT (s.grp IN ( SELECT substr(s_1.grp, strpos(concat(s_1.grp, '_'), '_'::text) + 1) AS substr + FROM s s_1)) + ORDER BY s.grp; + +CREATE MATERIALIZED VIEW igo_vue_groupes_recursif_materialized AS + SELECT * FROM igo_vue_groupes_recursif +WITH DATA; + +ALTER SEQUENCE igo.igo_groupe_groupe_id_seq OWNED BY igo.igo_groupe_groupe.id; +ALTER SEQUENCE igo.igo_groupe_id_seq OWNED BY igo.igo_groupe.id; +ALTER TABLE ONLY igo.igo_groupe ALTER COLUMN id SET DEFAULT nextval('igo.igo_groupe_id_seq'::regclass); diff --git a/pilotage/app/validators/IgoEntier.php b/pilotage/app/validators/IgoEntier.php new file mode 100644 index 00000000..63f53781 --- /dev/null +++ b/pilotage/app/validators/IgoEntier.php @@ -0,0 +1,21 @@ + $params['field'], + 'pattern' => '/^\d{0,}$/', + 'message' => $message + )); + } +} diff --git a/pilotage/app/validators/IgoStringLength.php b/pilotage/app/validators/IgoStringLength.php new file mode 100644 index 00000000..9df5f90c --- /dev/null +++ b/pilotage/app/validators/IgoStringLength.php @@ -0,0 +1,40 @@ + $params['field'], + 'max' => $max, + 'min' => $min, + 'messageMaximum' => $messageMaximum, + 'messageMinimum' => $messageMinimum + )); + + } + +} diff --git a/pilotage/app/views/classe_entite_et_geometrie/do.phtml b/pilotage/app/views/classe_entite_et_geometrie/do.phtml new file mode 100644 index 00000000..fb77dbb3 --- /dev/null +++ b/pilotage/app/views/classe_entite_et_geometrie/do.phtml @@ -0,0 +1,4 @@ +getContent(); ?> + +view->includeCTL("igo_classe_entite","search?id=".$id); ?> +view->includeFrame($baseUri."/igo_geometrie","search?classe_entite_id=".$id); ?> diff --git a/pilotage/app/views/commun/date_modification.phtml b/pilotage/app/views/commun/date_modification.phtml new file mode 100644 index 00000000..74683663 --- /dev/null +++ b/pilotage/app/views/commun/date_modification.phtml @@ -0,0 +1,16 @@ + +
        +
        + +
        +
        + tag->textField(array( + "date_modif", + "class" => "form-control", + 'readonly' => 'readonly', + 'disabled' => 'disabled')); + ?> +
        +
        + \ No newline at end of file diff --git a/pilotage/app/views/commun/edit.phtml b/pilotage/app/views/commun/edit.phtml new file mode 100644 index 00000000..b0e194f0 --- /dev/null +++ b/pilotage/app/views/commun/edit.phtml @@ -0,0 +1,34 @@ + + +getContent(); ?> + +tag->form($controller."/save/".$retour) ?> + +
        +
        + tag->linkTo(array($retour, "")); ?> +
        +
        + +
        +
        +

        +
        +
        +partial($controller . "/table") ?> +
        +
        + tag->submitButton(array("Enregistrer", "class" => "btn btn-primary")) ?> +
        +
        + +tag->hiddenField("id") ?> + + \ No newline at end of file diff --git a/pilotage/app/views/commun/index.phtml b/pilotage/app/views/commun/index.phtml new file mode 100644 index 00000000..e867d90b --- /dev/null +++ b/pilotage/app/views/commun/index.phtml @@ -0,0 +1,53 @@ + +getContent() ?> + +
        +
        + tag->linkTo(array($retour, "")); ?> +
        +
        + igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> +
        +
        + +tag->form(array($controller . "/search", "autocomplete" => "off")) ?> + +
        +
        +

        +
        +
        + +
        +
        +

        Recherche par ID

        +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "id", + "class"=>"form-control" + )); + ?> +
        +
        +
        +
        +

        ou par critères

        +
        +
        +partial($controller . "/table") ?> +
        +
        +
        +
        + tag->submitButton(array("Rechercher", "class" => "btn btn-primary")) ?> +
        +
        + + + diff --git a/pilotage/app/views/commun/new.phtml b/pilotage/app/views/commun/new.phtml new file mode 100644 index 00000000..7f896c21 --- /dev/null +++ b/pilotage/app/views/commun/new.phtml @@ -0,0 +1,31 @@ + + + +
        +
        + tag->linkTo(array($retour, "")); ?> +
        +
        + +getContent(); ?> + +partial("commun/titre", array( "titre" =>$titre)) ?> + +tag->form($controller . "/create/" . $retour) ?> + +partial($controller . "/table") ?> +
        +
        + tag->submitButton(array("Enregistrer", 'class' => 'btn btn-primary')) ?> +
        +
        + + + + diff --git a/pilotage/app/views/commun/search_entete.phtml b/pilotage/app/views/commun/search_entete.phtml new file mode 100644 index 00000000..ca24a739 --- /dev/null +++ b/pilotage/app/views/commun/search_entete.phtml @@ -0,0 +1,15 @@ +
        +
        + tag->linkTo(array($controller."/index"."/".$r_controller."/".$action."/".$parameters, "")); ?> +
        +
        + escaper->escapeHtml(str_replace("%","",$criteres)). "
        ".$this->tag->linkTo($controller."/searchAll", ""); + } + ?> +
        +
        + igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> +
        +
        \ No newline at end of file diff --git a/pilotage/app/views/commun/search_pagination.phtml b/pilotage/app/views/commun/search_pagination.phtml new file mode 100644 index 00000000..ce4c9f34 --- /dev/null +++ b/pilotage/app/views/commun/search_pagination.phtml @@ -0,0 +1,12 @@ +total_pages > 1) { + $estPremierePage = $page->current == 1; + $estDernierePage = ($page->total_pages == $page->current); +?> +
          +
        • tag->linkTo($controller."/$action?page=1", "Premier") ?>
        • +
        • tag->linkTo($controller."/$action?page=" . $page->before, "Précédent") ?>
        • +
        • page current, " de ", $page->total_pages ?>
        • +
        • tag->linkTo($controller."/$action?page=" . ((!$estDernierePage)?$page->next:$page->current), "Suivant") ?>
        • +
        • tag->linkTo($controller."/$action?page=" . $page->last, "Dernier") ?>
        • +
        + \ No newline at end of file diff --git a/pilotage/app/views/commun/titre.phtml b/pilotage/app/views/commun/titre.phtml new file mode 100644 index 00000000..393c90f7 --- /dev/null +++ b/pilotage/app/views/commun/titre.phtml @@ -0,0 +1,5 @@ +
        +
        +

        +
        +
        \ No newline at end of file diff --git a/pilotage/app/views/contexte_et_couche/do.phtml b/pilotage/app/views/contexte_et_couche/do.phtml new file mode 100644 index 00000000..f48a4f7e --- /dev/null +++ b/pilotage/app/views/contexte_et_couche/do.phtml @@ -0,0 +1,4 @@ +getContent(); ?> + +view->includeCTL("igo_contexte","search?id=".$id); ?> +view->includeFrame($baseUri."/igo_couche_contexte","search?contexte_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/contexte_permission_profil/formulaire.phtml b/pilotage/app/views/contexte_permission_profil/formulaire.phtml new file mode 100644 index 00000000..6e3005da --- /dev/null +++ b/pilotage/app/views/contexte_permission_profil/formulaire.phtml @@ -0,0 +1,31 @@ +getContent(); ?> +
        +
        +

        +
        +
        +tag->form($controller . "/submit/") ?> +
        +
        + +
        +
        + render('idContexte');?> +
        +
        +
        +
        + +
        +
        + render('idProfil');?> +
        +
        +
        +
        + +
        +
        + + + diff --git a/pilotage/app/views/contexte_permission_profil/submit.phtml b/pilotage/app/views/contexte_permission_profil/submit.phtml new file mode 100644 index 00000000..d2e9bf56 --- /dev/null +++ b/pilotage/app/views/contexte_permission_profil/submit.phtml @@ -0,0 +1,13 @@ +getContent(); ?> +
        +
        +

        +
        +
        +
        +
        +

        + Accéder au profil"));?> +
        +
        + diff --git a/pilotage/app/views/couche_et_classe/do.phtml b/pilotage/app/views/couche_et_classe/do.phtml new file mode 100644 index 00000000..418a1ff1 --- /dev/null +++ b/pilotage/app/views/couche_et_classe/do.phtml @@ -0,0 +1,4 @@ +getContent(); ?> + +view->includeCTL("igo_couche","search?id=".$id); ?> +view->includeFrame($baseUri."/igo_classe","search?couche_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/geometrie_et_attribut/do.phtml b/pilotage/app/views/geometrie_et_attribut/do.phtml new file mode 100644 index 00000000..efb5b046 --- /dev/null +++ b/pilotage/app/views/geometrie_et_attribut/do.phtml @@ -0,0 +1,6 @@ + getContent(); ?> + +view->includeCTL("igo_classe_entite","search?id=".$classe_entite_id); ?> +view->includeCTL("igo_geometrie","search?id=".$id); ?> +view->includeFrame($baseUri."/igo_attribut","search?geometrie_id=".$id); ?> + diff --git a/pilotage/app/views/geometrie_et_couche/do.phtml b/pilotage/app/views/geometrie_et_couche/do.phtml new file mode 100644 index 00000000..05a8b1d7 --- /dev/null +++ b/pilotage/app/views/geometrie_et_couche/do.phtml @@ -0,0 +1,5 @@ +getContent(); ?> + +view->includeCTL("igo_classe_entite","search?id=".$classe_entite_id); ?> + +view->includeFrame($baseUri."/igo_couche","search?geometrie_id=".$id); ?> \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/creation.phtml b/pilotage/app/views/gestion_couche/creation.phtml new file mode 100644 index 00000000..29baf8d0 --- /dev/null +++ b/pilotage/app/views/gestion_couche/creation.phtml @@ -0,0 +1,68 @@ + + +partial("commun/new", array( "titre" =>"Création rapide d'une couche")) ?> diff --git a/pilotage/app/views/gestion_couche/edition.phtml b/pilotage/app/views/gestion_couche/edition.phtml new file mode 100644 index 00000000..068f8bad --- /dev/null +++ b/pilotage/app/views/gestion_couche/edition.phtml @@ -0,0 +1,77 @@ + + +getContent(); ?> +
        +
        + +
        +
        +view->includeCTL("igo_classe_entite","edit?".$classe_entite_id); ?> +
        +
        +
        +
        + +
        +
        +view->includeCTL("igo_connexion","edit?".$connexion_id); ?> +
        +
        +
        +
        + +
        +
        +view->includeCTL("igo_geometrie","edit?".$geometrie_id,$r_controller); ?> +
        +
        +
        +
        +
        +

        + + Couche + +

        +
        +
        +
        +view->includeCTL("igo_couche","edit?".$id,$r_controller); ?>
        +
        +
        +
        \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/loadMapfile.phtml b/pilotage/app/views/gestion_couche/loadMapfile.phtml new file mode 100644 index 00000000..182bea00 --- /dev/null +++ b/pilotage/app/views/gestion_couche/loadMapfile.phtml @@ -0,0 +1,24 @@ +tag->form("gestion_couche/traiteMapfile") ?> + +partial("commun/titre", array("titre" =>"Charger une définition de LAYER")) ?> + +
        +
        + tag->textArea(array( + 'code', + 'cols' => 120, + 'rows' => 40, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        +
        tag->submitButton(array("Traiter", "class" => 'btn btn-primary')) ?>
        +
        +
        + tag->hiddenField("id") ?> + + + \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/mapfile.volt b/pilotage/app/views/gestion_couche/mapfile.volt new file mode 100644 index 00000000..3811b640 --- /dev/null +++ b/pilotage/app/views/gestion_couche/mapfile.volt @@ -0,0 +1,90 @@ +{{ content() }} +{% if preview%}
        {% endif %}
        +#DEBUG 5
        +MAP
        +    #INCLUDE "../include/ec/ec_map.map"
        +    #INCLUDE "../include/ec/ec_web.map"
        +    {{ mapfileInclude }}
        +    NAME "{{ couche['mf_layer_name'] }}"
        +    EXTENT -1100000 -23500 1100000 2253500
        +    WEB
        +        METADATA
        +           "wms_title"                  "{{ couche['mf_layer_meta_title']}}"
        +           "wms_name"                   "{{ couche['mf_layer_meta_name']}}"
        +           "wms_abstract"               ""
        +           "wms_description"            ""
        +           "wms_keywordlist"            ""
        +           "wms_onlineresource"         ""
        +        END
        +    END
        +    PROJECTION
        +                {% if 'proj=' in (couche['mf_layer_projection']| trim) %}{{couche['mf_layer_projection']}}{% else %}"init=epsg:{{couche['mf_layer_projection']}}"{% endif %}
        +
        +    END
        +
        +    LEGEND
        +        STATUS ON
        +        KEYSIZE 22 22
        +		LABEL
        +			TYPE TRUETYPE
        +			FONT "arial"
        +			COLOR 0 0 0
        +			SIZE 10
        +			POSITION CL
        +			OFFSET 0 0
        +			SHADOWSIZE 2 2
        +			ANTIALIAS TRUE
        +		END
        +    END
        +    LAYER
        +            #INCLUDE "../include/ec/ec_getfeature.map"
        +            NAME '{{ couche['mf_layer_name']}}'
        +            TYPE {{couche['layer_type']}}
        +
        +            GROUP "{{ couche['mf_layer_group']}}"
        +
        +           {% if couche['connexion_type'] is defined %} CONNECTIONTYPE {{couche['connexion_type']}}{% endif %}
        +
        +           {% if couche['connexion'] is defined %} CONNECTION "{{couche['connexion']}}"   
        +            PROCESSING "CLOSE_CONNECTION=DEFER"{% endif %}
        +
        +            {% if couche['mf_layer_data'] is defined and couche['mf_layer_data']<>""%}DATA "{{ couche['mf_layer_data']}}"{% endif %}
        +
        +            {% if couche['mf_layer_minscale_denom']|trim<>"" %}MINSCALE  {{ couche['mf_layer_minscale_denom']}}{% endif %}
        +
        +            {% if couche['mf_layer_maxscale_denom']|trim<>"" %}MAXSCALE  {{ couche['mf_layer_maxscale_denom']}}{% endif %}
        +
        +            {% if couche['mf_layer_labelminscale_denom']|trim<>"" %}LABELMINSCALE {{ couche['mf_layer_labelminscale_denom']}}{% endif %}
        +
        +            {% if couche['mf_layer_labelmaxscale_denom']|trim<>"" %}LABELMAXSCALE {{ couche['mf_layer_labelmaxscale_denom']}}{% endif %}
        +
        +            {% if couche['mf_layer_opacity']|trim<>"" %}OPACITY {{ couche['mf_layer_opacity']}}{% endif %}             
        +
        +            {% if couche['mf_layer_filter']|trim<>"" %}FILTER "{{ couche['mf_layer_filter']}}"{% endif %}
        +
        +            {% if couche['mf_layer_projection']|trim<>"" %}
        +
        +            PROJECTION
        +                    {% if 'proj=' in (couche['mf_layer_projection']| trim) %} {{couche['mf_layer_projection']}} {% else %}  "init=epsg:{{couche['mf_layer_projection']}}"   {% endif %}
        +
        +            END
        +            {% endif  %}
        +
        +            METADATA
        +                    #INCLUDE  "../include/ec/ec_meta_layer.map"   
        +                    "wms_group_title"      "{{ couche['mf_layer_meta_group_title']}}" 
        +                    "wms_name"             "{{ couche['mf_layer_name']}}"
        +                    "wms_title"            "{{ couche['mf_layer_meta_title']}}"                        
        +                    "z_order"              "{{ couche['mf_layer_meta_z_order']}}"                        
        +
        +                    {{ couche['mf_layer_meta_def']}}
        +
        +            END
        +
        +            {{ couche['mf_layer_def']}}
        +
        +            {{ couche['mf_layer_class_def']}}
        +
        +    END
        +END
        +{% if preview %}
        {% endif %} diff --git a/pilotage/app/views/gestion_couche/table.phtml b/pilotage/app/views/gestion_couche/table.phtml new file mode 100644 index 00000000..c50c3ee9 --- /dev/null +++ b/pilotage/app/views/gestion_couche/table.phtml @@ -0,0 +1,554 @@ +CONNECTIONTYPE {type_connexion}
        END"); +?> +
        +

        Géométrie

        +
        + +
        +
        + +
        +
        + tag->select(array( + "classe_entite_id", + IgoClasseEntite::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        \"wms_name\" \"{nom_classe_entite}\"
        END
        END")); + ?> +
        +
        + tag->linkTo(array("igo_classe_entite/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, "Créer", 'class'=>'creer')); ?> + tag->linkTo(array("igo_classe_entite/edit" . "/" . $this->tag->getValue("classe_entite_id") . "/" . $r_controller . "/" . $action . "/" . $parameters, " Modifier")); ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "geometrie_type_id", + IgoGeometrieType::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        TYPE {type_geometrie}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "acces", + ($this->view->getActionName() == "index") ? + array("D" => "Distant", + "L" => "Local") : + array("D" => "Distant", + "L" => "Local"), + "class" => "form-control")); ?> +
        +
        + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_data", + "class" => "form-control", + "placeholder" => "Ex : Vigilance/Inondation-crue/Instruments de surveillance", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        DATA \"{chemin_acces_donnees}\"
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_projection", + "class" => "form-control", + "placeholder" => "Ex : init=epsg:32198", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        PROJECTION
        \"{projection}\"
        END
        END" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "id_ici", + IgoGroupe::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control")); + ?> +
        Reste à définir comment on gère l'inclusion des attributs +
        +
        +

        Connexion

        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_type_id_vertoriel", + "name" => "connexion_type_id", + IgoConnexionType::find(array("geometrie_type='V'", "order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => TOOLTIP_CONNECTION_TYPE)); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_type_id_raster", + "name" => "connexion_type_id", + IgoConnexionType::find(array("geometrie_type='R'", "order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => TOOLTIP_CONNECTION_TYPE)); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_type_id_chart", + "name" => "connexion_type_id", + IgoConnexionType::find(array("geometrie_type='C'", "order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => TOOLTIP_CONNECTION_TYPE)); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_type_id_query", + "name" => "connexion_type_id", + IgoConnexionType::find(array("geometrie_type='Q'", "order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => TOOLTIP_CONNECTION_TYPE)); + ?> +
        +
        +
        +

        Couche

        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_name", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        NAME \"{nom_code}\"
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_title", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        \"wms_title\" \"{titre}\"
        END
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_group", + "class" => "form-control", + "placeholder" => "Ex : chemin/vers/le/groupe/nom_du_groupe", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        GROUP \"{code_groupe}\"
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_group_title", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        \"wms_group_title\" \"{titre_groupe}\"
        END
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "fiche_csw_id", + "class" => "form-control", + "placeholder" => "Ex : 557940e9-5dfa-4a92-a140-8afd1618975d")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_minscale_denom", + "type" => "number", + "placeholder" => "Ex : 2", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        MINSCALE {min}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_maxscale_denom", + "type" => "number", + "placeholder" => "Ex : 8", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        MAXSCALE {max}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_opacity", + "type" => "number", + "placeholder" => "Ex : 80", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        CLASS
        STYLE
        OPACITY {opacite}
        END
        END
        END")); + ?> +
        +
        +
        +

        Classe

        +
        + +
        +
        + +
        +
        + tag->textArea(array( + 'mf_class_def', + "class" => "form-control", + 'cols' => 80, + 'rows' => 20, + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        CLASS
        {class_def}
        END
        END")); + ?> +
        +
        +
        +
        +
        +
        + tag->checkField(array('vue-avancee', "value" => '1')); ?> + +
        +
        +
        +

        Couche

        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelminscale_denom", + "type" => "number", + "placeholder" => "Ex : 2", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        LABELMINSCALE {min}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelmaxscale_denom", + "type" => "number", + "placeholder" => "Ex : 10", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        LABELMAXSCALE {max}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_wfs_max_feature", + "type" => "number", + "placeholder" => "Ex : 500", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        \"wfs_maxfeatures\" {max}
        END
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelitem", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        LABELITEM \"{nom_attribut_affichage}\"
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textArea(array( + 'mf_layer_def', + "class" => "form-control", + 'cols' => 50, + 'rows' => 10, + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        {layer_def}
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textArea(array( + 'mf_layer_meta_def', + "class" => "form-control", + 'cols' => 50, + 'rows' => 5, + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        {layer_meta_def}
        END
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_z_order", + "class" => "form-control", + "placeholder" => "Ex : 100", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        METADATA
        z_order {ordre}
        END
        END")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_filtre", + "class" => "form-control", + "placeholder" => "Ex : champ_un = \"toto\" AND champ_deux > 100", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "LAYER
        FILTER {filtre}
        END" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "groupe_id", + "class" => "form-control", + IgoGroupe::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true)); + ?> +
        +
        + tag->linkTo(array( + "igo_groupe/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, + "Créer")); + ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_fond_de_carte", "value" => 1)); ?> + +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "vue_validation", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "Description textuelle de la couche. Utilisée dans l'outil de gestion uniquement.")); + ?> +
        +
        +tag->hiddenField(array('connexion_type_id')); ?> +tag->hiddenField(array('connexion_id')); ?> +tag->hiddenField(array('mf_layer_filter')); ?> +tag->hiddenField(array('z_order')); ?> \ No newline at end of file diff --git a/pilotage/app/views/gestion_couche/traiteMapfile.phtml b/pilotage/app/views/gestion_couche/traiteMapfile.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/gestion_couche/traiteMapfile.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_attribut/edit.phtml b/pilotage/app/views/igo_attribut/edit.phtml new file mode 100644 index 00000000..5436a7ad --- /dev/null +++ b/pilotage/app/views/igo_attribut/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/index.phtml b/pilotage/app/views/igo_attribut/index.phtml new file mode 100644 index 00000000..52c2ed24 --- /dev/null +++ b/pilotage/app/views/igo_attribut/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/new.phtml b/pilotage/app/views/igo_attribut/new.phtml new file mode 100644 index 00000000..043590ad --- /dev/null +++ b/pilotage/app/views/igo_attribut/new.phtml @@ -0,0 +1,2 @@ + +partial("commun/new", array( "titre" =>"Créer un attribut")) ?> diff --git a/pilotage/app/views/igo_attribut/search.phtml b/pilotage/app/views/igo_attribut/search.phtml new file mode 100644 index 00000000..1f5e37ed --- /dev/null +++ b/pilotage/app/views/igo_attribut/search.phtml @@ -0,0 +1,54 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Attributs")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + + + + + + items as $igo_attribut) { ?> + + + + + + + + + + + + + + + + + + + + + +
        tag->linkTo("igo_attribut/search?order=id", "Attribut") ?>GéometrieColonneAliastag->linkTo("igo_attribut/search?order=description", "Description") ?>CléNomDescriptionFiltreGéométrieIncluListe de valeurtag->linkTo("igo_attribut/search?order=date_modif", "Date de modification") ?>
        id ?>IgoGeometrie){echo $igo_attribut->IgoGeometrie->IgoClasseEntite->nom.":".$igo_attribut->IgoGeometrie->IgoGeometrieType->nom;} ?>colonne ?>alias ?>description ?>tag->setDefault("est_cle", $igo_attribut->est_cle); + echo $this->tag->checkField(array("est_cle", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_nom", $igo_attribut->est_nom); + echo $this->tag->checkField(array("est_nom", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_description", $igo_attribut->est_description); + echo $this->tag->checkField(array("est_description", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_filtre", $igo_attribut->est_filtre); + echo $this->tag->checkField(array("est_filtre", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_geometrie", $igo_attribut->est_geometrie); + echo $this->tag->checkField(array("est_geometrie", "value" => 1, "disabled" =>1)) ?>tag->setDefault("est_inclu", $igo_attribut->est_inclu); + echo $this->tag->checkField(array("est_inclu", "value" => 1, "disabled" =>1)) ?>IgoListeValeur){echo $igo_attribut->ListeValeur->description;} ?>date_modif ?>tag->linkTo(array("igo_attribut/edit/" . $igo_attribut->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_attribut/delete/" . $igo_attribut->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation' => 'supprimer')); ?>
        +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_attribut/table.phtml b/pilotage/app/views/igo_attribut/table.phtml new file mode 100644 index 00000000..aa02f476 --- /dev/null +++ b/pilotage/app/views/igo_attribut/table.phtml @@ -0,0 +1,106 @@ +
        +
        + +
        +
        + session->has("geometrie_id")) { + $this->tag->setDefault("geometrie_id", $this->session->get("geometrie_id")); + } + ?> + tag->select(array( + "geometrie_id", + IgoGeometrie::find(array("order" => "vue_defaut")), + "using" => array("id", "vue_defaut"), + "emptyText" => "Choisir...", + "useEmpty" => true + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("colonne", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("alias", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("description", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_cle", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_nom", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_description", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_filtre", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_geometrie", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_inclu", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "liste_valeur_id", + IgoListeValeur::find(array("order" => "description")), + "using" => array("id", "description"), + "emptyText" => "Choisir...", + "useEmpty" => true)) ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/edit.phtml b/pilotage/app/views/igo_catalogue_csw/edit.phtml new file mode 100644 index 00000000..806a8f45 --- /dev/null +++ b/pilotage/app/views/igo_catalogue_csw/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/index.phtml b/pilotage/app/views/igo_catalogue_csw/index.phtml new file mode 100644 index 00000000..ee3c6571 --- /dev/null +++ b/pilotage/app/views/igo_catalogue_csw/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/new.phtml b/pilotage/app/views/igo_catalogue_csw/new.phtml new file mode 100644 index 00000000..0c980c22 --- /dev/null +++ b/pilotage/app/views/igo_catalogue_csw/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un catalogue")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/search.phtml b/pilotage/app/views/igo_catalogue_csw/search.phtml new file mode 100644 index 00000000..175734d1 --- /dev/null +++ b/pilotage/app/views/igo_catalogue_csw/search.phtml @@ -0,0 +1,41 @@ + + +partial("commun/titre", array("titre" =>"Catalogues CSW")) ?> + +getContent(); ?> + +partial("commun/search_entete") ?> + + + + + + + + + + + + items as $igo_catalogue_csw) { ?> + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_catalogue_csw/table.phtml b/pilotage/app/views/igo_catalogue_csw/table.phtml new file mode 100644 index 00000000..d8352f95 --- /dev/null +++ b/pilotage/app/views/igo_catalogue_csw/table.phtml @@ -0,0 +1,13 @@ +
        +
        + +
        +
        + tag->textField(array( + "url", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_classe/edit.phtml b/pilotage/app/views/igo_classe/edit.phtml new file mode 100644 index 00000000..22a8b039 --- /dev/null +++ b/pilotage/app/views/igo_classe/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une classe")) ?> diff --git a/pilotage/app/views/igo_classe/index.phtml b/pilotage/app/views/igo_classe/index.phtml new file mode 100644 index 00000000..be254c4c --- /dev/null +++ b/pilotage/app/views/igo_classe/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une classe")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe/new.phtml b/pilotage/app/views/igo_classe/new.phtml new file mode 100644 index 00000000..dd3f4aa9 --- /dev/null +++ b/pilotage/app/views/igo_classe/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une classe")) ?> diff --git a/pilotage/app/views/igo_classe/search.phtml b/pilotage/app/views/igo_classe/search.phtml new file mode 100644 index 00000000..7cd6e5eb --- /dev/null +++ b/pilotage/app/views/igo_classe/search.phtml @@ -0,0 +1,41 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Classes")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + items as $igo_classe) { ?> + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe/table.phtml b/pilotage/app/views/igo_classe/table.phtml new file mode 100644 index 00000000..3fdb870b --- /dev/null +++ b/pilotage/app/views/igo_classe/table.phtml @@ -0,0 +1,33 @@ + +
        +
        + +
        +
        + tag->select(array( + "couche_id", + IgoCouche::find(array("order" => "mf_layer_name")), + "using" => array("id", "mf_layer_name"), + "emptyText" => "Choisir...", + "useEmpty" => true)) + ?> +
        +
        +
        +
        + +
        +
        +tag->textArea(array('mf_class_def', 'cols' => 80, 'rows' => 20)) ?> +
        +
        +
        +
        + +
        +
        +tag->textField(array("mf_class_z_order", "size" => 10)) ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/edit.phtml b/pilotage/app/views/igo_classe_entite/edit.phtml new file mode 100644 index 00000000..04633edc --- /dev/null +++ b/pilotage/app/views/igo_classe_entite/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/index.phtml b/pilotage/app/views/igo_classe_entite/index.phtml new file mode 100644 index 00000000..312275db --- /dev/null +++ b/pilotage/app/views/igo_classe_entite/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/new.phtml b/pilotage/app/views/igo_classe_entite/new.phtml new file mode 100644 index 00000000..b68a3e2a --- /dev/null +++ b/pilotage/app/views/igo_classe_entite/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une classe entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/search.phtml b/pilotage/app/views/igo_classe_entite/search.phtml new file mode 100644 index 00000000..49c73bd7 --- /dev/null +++ b/pilotage/app/views/igo_classe_entite/search.phtml @@ -0,0 +1,60 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Classes entité")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + items as $igo_classe_entite) { ?> + + + + + + + + IgoCatalogueCsw) { ?> + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classe_entite/table.phtml b/pilotage/app/views/igo_classe_entite/table.phtml new file mode 100644 index 00000000..c35777d5 --- /dev/null +++ b/pilotage/app/views/igo_classe_entite/table.phtml @@ -0,0 +1,125 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "source_entite_id", + IgoSourceEntite::find(array("order" => "url")), + "using" => array("id", "url"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "classification_id", + IgoClassification::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "organisme_responsable_id", + $organisme_desc, + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "contact_id", + IgoContact::find(array( + 'columns' => 'id, ' . new RawValue('CONCAT (nom, ", ", prenom) as nomPrenom'), + "order" => "nom")), + "using" => array("id", "nomPrenom"), + "useEmpty" => true, + 'emptyText' => 'Choisir...', + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "remarque", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "catalogue_csw_id", + IgoCatalogueCsw::find(array("order" => "url")), + "using" => array("id", "url"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classification/edit.phtml b/pilotage/app/views/igo_classification/edit.phtml new file mode 100644 index 00000000..881f1086 --- /dev/null +++ b/pilotage/app/views/igo_classification/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une classification")) ?> diff --git a/pilotage/app/views/igo_classification/index.phtml b/pilotage/app/views/igo_classification/index.phtml new file mode 100644 index 00000000..2e9010e3 --- /dev/null +++ b/pilotage/app/views/igo_classification/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une classification")) ?> diff --git a/pilotage/app/views/igo_classification/new.phtml b/pilotage/app/views/igo_classification/new.phtml new file mode 100644 index 00000000..774f5c27 --- /dev/null +++ b/pilotage/app/views/igo_classification/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une classification")) ?> diff --git a/pilotage/app/views/igo_classification/search.phtml b/pilotage/app/views/igo_classification/search.phtml new file mode 100644 index 00000000..bf470031 --- /dev/null +++ b/pilotage/app/views/igo_classification/search.phtml @@ -0,0 +1,41 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Classifications")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + items as $igo_classification) { ?> + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_classification/table.phtml b/pilotage/app/views/igo_classification/table.phtml new file mode 100644 index 00000000..3afff009 --- /dev/null +++ b/pilotage/app/views/igo_classification/table.phtml @@ -0,0 +1,35 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "code_geonetwork", + "class" => "form-control" + )); ?> +
        +
        +partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_connexion/edit.phtml b/pilotage/app/views/igo_connexion/edit.phtml new file mode 100644 index 00000000..6e315ffe --- /dev/null +++ b/pilotage/app/views/igo_connexion/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/index.phtml b/pilotage/app/views/igo_connexion/index.phtml new file mode 100644 index 00000000..2995259c --- /dev/null +++ b/pilotage/app/views/igo_connexion/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/new.phtml b/pilotage/app/views/igo_connexion/new.phtml new file mode 100644 index 00000000..666e2ce8 --- /dev/null +++ b/pilotage/app/views/igo_connexion/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/search.phtml b/pilotage/app/views/igo_connexion/search.phtml new file mode 100644 index 00000000..7d852dfc --- /dev/null +++ b/pilotage/app/views/igo_connexion/search.phtml @@ -0,0 +1,41 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Connexions")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + items as $igo_connexion) { ?> + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion/table.phtml b/pilotage/app/views/igo_connexion/table.phtml new file mode 100644 index 00000000..22732751 --- /dev/null +++ b/pilotage/app/views/igo_connexion/table.phtml @@ -0,0 +1,42 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textArea(array( + "connexion", + "cols" => 100, + "rows" => 20, + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_type_id", + IgoConnexionType::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_connexion_type/edit.phtml b/pilotage/app/views/igo_connexion_type/edit.phtml new file mode 100644 index 00000000..053324e0 --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un type de connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml b/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml new file mode 100644 index 00000000..a57a1619 --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/igo_contact/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml b/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml new file mode 100644 index 00000000..df1665a5 --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/igo_contact/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/index.phtml b/pilotage/app/views/igo_connexion_type/index.phtml new file mode 100644 index 00000000..f002e784 --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un type de connexion")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/new.phtml b/pilotage/app/views/igo_connexion_type/new.phtml new file mode 100644 index 00000000..0cb1f820 --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un type de connexion")) ?> diff --git a/pilotage/app/views/igo_connexion_type/search.phtml b/pilotage/app/views/igo_connexion_type/search.phtml new file mode 100644 index 00000000..f69a72fb --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/search.phtml @@ -0,0 +1,41 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Types de connexion")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + items as $igo_connexion_type) { ?> + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_connexion_type/table.phtml b/pilotage/app/views/igo_connexion_type/table.phtml new file mode 100644 index 00000000..f857ffab --- /dev/null +++ b/pilotage/app/views/igo_connexion_type/table.phtml @@ -0,0 +1,73 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "connexion_type", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "geometrie_type", + ($this->view->getActionName() == "index") ? + array( + "" => " ", + "C" => "Chart", + "Q" => "Query", + "R" => "Raster", + "V" => "Vectoriel") : + array( + "C" => "Chart", + "Q" => "Query", + "R" => "Raster", + "V" => "Vectoriel"), + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("ind_data", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("ind_vue", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("ind_projection", "value" => 1)) ?> +
        +
        +partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_contact/edit.phtml b/pilotage/app/views/igo_contact/edit.phtml new file mode 100644 index 00000000..a57a1619 --- /dev/null +++ b/pilotage/app/views/igo_contact/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/index.phtml b/pilotage/app/views/igo_contact/index.phtml new file mode 100644 index 00000000..df1665a5 --- /dev/null +++ b/pilotage/app/views/igo_contact/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/new.phtml b/pilotage/app/views/igo_contact/new.phtml new file mode 100644 index 00000000..10c9b99d --- /dev/null +++ b/pilotage/app/views/igo_contact/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un contact")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/search.phtml b/pilotage/app/views/igo_contact/search.phtml new file mode 100644 index 00000000..ce41ed02 --- /dev/null +++ b/pilotage/app/views/igo_contact/search.phtml @@ -0,0 +1,49 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Contacts")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + + + items as $igo_contact) { ?> + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contact/table.phtml b/pilotage/app/views/igo_contact/table.phtml new file mode 100644 index 00000000..2e758eb5 --- /dev/null +++ b/pilotage/app/views/igo_contact/table.phtml @@ -0,0 +1,116 @@ + +
        +
        + +
        +
        + tag->select(array( + "organisme_responsable_id", + IgoOrganismeResponsable::find(array("order" => "nom")), "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "prenom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "poste", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "no_telephone", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "courriel", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array( + "est_membre_acrigeo", + "value" => 1 + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "remarque", + "class" => "form-control" + )); + ?> +
        +
        + +
        +
        + +
        +
        + tag->textField(array( + "date_modif", + "class" => "form-control", + 'readonly' => 'readonly', + 'disabled' => 'disabled')); + ?> +
        +
        + \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/edit.phtml b/pilotage/app/views/igo_contexte/edit.phtml new file mode 100644 index 00000000..1e267e48 --- /dev/null +++ b/pilotage/app/views/igo_contexte/edit.phtml @@ -0,0 +1,2 @@ + +partial("commun/edit", array( "titre" =>"Modifier un contexte")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/index.phtml b/pilotage/app/views/igo_contexte/index.phtml new file mode 100644 index 00000000..445cd0a9 --- /dev/null +++ b/pilotage/app/views/igo_contexte/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un contexte")) ?> diff --git a/pilotage/app/views/igo_contexte/mapfile.volt b/pilotage/app/views/igo_contexte/mapfile.volt new file mode 100644 index 00000000..ef87f084 --- /dev/null +++ b/pilotage/app/views/igo_contexte/mapfile.volt @@ -0,0 +1,127 @@ +{{ content() }} +{% if preview%}
        {% endif %}
        +MAP
        +    #DEBUG 5
        +    #INCLUDE "../include/ec/ec_map.map"  
        +    #INCLUDE "../include/ec/ec_web.map"
        +    {{ mapfileInclude }}
        +
        +    NAME "{{ contexte['code'] }}"
        +    EXTENT -1100000 -23500 1100000 2253500
        +    WEB
        +        METADATA
        +           "wms_title"                  "{{ contexte['code']}}"
        +           "wms_name"                   "{{ contexte['nom'] }}"
        +           "wms_abstract"               ""
        +           "wms_description"            "{{ contexte['description'] }}"
        +           "wms_keywordlist"            ""
        +            {% if contexte['generer_onlineresource'] == true %}
        +           "wms_onlineresource"         "{{ contexte['wms_onlineresource'] }}"
        +           {% endif %}
        +        END
        +    END
        +    PROJECTION
        +        {{contexte['mf_map_projection']}}
        +
        +    END
        +
        +    LEGEND
        +        STATUS ON
        +        KEYSIZE 22 22
        +		LABEL
        +			TYPE TRUETYPE
        +			FONT "arial"
        +			COLOR 0 0 0
        +			SIZE 10
        +			POSITION CL
        +			OFFSET 0 0
        +			SHADOWSIZE 2 2
        +			ANTIALIAS TRUE
        +		END
        +    END
        +    		{{ contexte['mf_map_def']}} 
        +
        +{% for couche in contexteCouches %}
        +    
        +    {% if couche.ind_data and (couche.est_visible or couche.est_active) %}
        +        LAYER
        +            NAME "{{couche.mf_layer_name}}"
        +            TYPE {{couche.IgoCouche.IgoGeometrie.IgoGeometrieType.layer_type}}
        +
        +            GROUP "{{couche.mf_layer_group}}"
        +
        +            {% if couche.connexion_type is defined %} CONNECTIONTYPE {{couche.connexion_type}}{% endif %}
        +
        +            {% if couche.connexion is defined %} CONNECTION "{{couche.connexion}}"   
        +            PROCESSING "CLOSE_CONNECTION=DEFER"{% endif %}
        +
        +            {% if couche.IgoCouche.IgoGeometrie.mf_layer_data is defined and couche.IgoCouche.IgoGeometrie.mf_layer_data<>""%}DATA "{{ couche.IgoCouche.IgoGeometrie.mf_layer_data}}"{% endif %}
        +
        +            {% if couche.mf_layer_minscale_denom|trim<>"" %}MINSCALE  {{ couche.mf_layer_minscale_denom}}{% endif %}
        +
        +            {% if couche.mf_layer_maxscale_denom|trim<>"" %}MAXSCALE  {{ couche.mf_layer_maxscale_denom}}{% endif %}
        +
        +            {% if couche.mf_layer_labelminscale_denom is defined and couche.mf_layer_labelminscale_denom|trim<>""  %}LABELMINSCALE {{ couche.mf_layer_labelminscale_denom}}{% endif %}
        +
        +            {% if couche.mf_layer_labelmaxscale_denom is defined and  couche.mf_layer_labelmaxscale_denom|trim<>"" %}LABELMAXSCALE {{ couche.mf_layer_labelmaxscale_denom}}{% endif %}
        +
        +            {% if couche.mf_layer_filter is defined and couche.mf_layer_filter|trim<>"" %}FILTER "{{ couche.mf_layer_filter}}"{% endif %}
        +
        +            {% if couche.IgoCouche.IgoGeometrie.mf_layer_projection is defined and couche.IgoCouche.IgoGeometrie.mf_layer_projection|trim<>"" %}
        +
        +            PROJECTION
        +                 {% if 'proj=' in (couche.IgoCouche.IgoGeometrie.mf_layer_projection | trim) %} {{couche.IgoCouche.IgoGeometrie.mf_layer_projection}} {% else %}  "init=epsg:{{couche.IgoCouche.IgoGeometrie.mf_layer_projection}}"   {% endif %}
        +            END
        +            {% endif  %}
        +
        +            METADATA
        +                {% if couche.mf_layer_name_igo|trim<>couche.mf_layer_name|trim %}layer_name_igo  {{ couche.mf_layer_name_igo}}{% endif %}
        +                "wms_group_title"      "{{ couche.mf_layer_meta_group_title}}"
        +                "wms_name"             "{{ couche.mf_layer_meta_name}}"
        +                "wms_title"            "{{ couche.mf_layer_meta_title}}"
        +                "z_order"              "{{ couche.mf_layer_meta_z_order}}"
        +                "msp_classe_meta"      "{{ couche.fiche_csw_id}}"
        +                {% if couche.mf_layer_opacity|trim<>"" %}"OPACITY" "{{ couche.mf_layer_opacity}}"{% endif %}
        +
        +                {% if couche.IgoCouche.mf_layer_meta_wfs_max_feature is defined and couche.IgoCouche.mf_layer_meta_wfs_max_feature|trim<>"" %}
        +                "wfs_maxfeatures" "{{ couche.IgoCouche.mf_layer_meta_wfs_max_feature}}"
        +
        +                {% endif  %}
        +                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "E"%}
        +                "gml_include_items" "all"
        +                "gml_exclude_items" "{% set firsthit = true %}{% for attribut in couche.IgoCouche.IgoGeometrie.IgoAttribut%}{% if attribut.est_inclu == false%}{% if firsthit==false %},{% else %}{% set firsthit=false %}{% endif %}{{attribut.colonne}}{% endif %}{% endfor %}"
        +                {% endif %}
        +                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "I"%}
        +                "gml_exclude_items" "all"
        +                "gml_include_items" "{% set firsthit = true %}{% for attribut in couche.IgoCouche.IgoGeometrie.IgoAttribut%}{% if attribut.est_inclu == true%}{% if firsthit==false %},{% else %}{% set firsthit=false %}{% endif %}{{attribut.colonne}}{% endif %}{% endfor %}"
        +                {% endif %}
        +                {% if couche.IgoCouche.IgoGeometrie.ind_inclusion == "T"%}
        +                "gml_include_items" "all"
        +                {% endif %}
        +
        +                {#{{ couche['include_items']}}#}
        +                {#{{ couche['exclude_items']}}#}
        +                {{ couche.IgoCouche.mf_layer_meta_def}}
        +
        +                {% if couche.IgoCouche.mf_layer_meta_attribution_title is defined and couche.IgoCouche.mf_layer_meta_attribution_title|trim<>"" %}
        +                "wms_attribution_title" "{{ couche.IgoCouche.mf_layer_meta_attribution_title }}"
        +                {% endif %}			
        +            END
        +
        +
        +            {{couche.IgoCouche.mf_layer_def}}
        +
        +            {% if couche.IgoCouche.mf_layer_labelitem|trim<>"" %}
        +            LABELITEM "{{ couche.IgoCouche.mf_layer_labelitem}}"
        +            {% endif  %}              
        +            {#{{ couche['mf_layer_class_def']}}#}
        +
        +            {% for classe in couchesClasses[couche.couche_id] %}
        +            {{classe.mf_class_def}}
        +            {% endfor %}
        +
        +        END
        +    {% endif %}
        +{% endfor  %}	
        +END
        +{% if preview %}
        {% endif %} diff --git a/pilotage/app/views/igo_contexte/new.phtml b/pilotage/app/views/igo_contexte/new.phtml new file mode 100644 index 00000000..d11d8ca2 --- /dev/null +++ b/pilotage/app/views/igo_contexte/new.phtml @@ -0,0 +1,2 @@ + +partial("commun/new", array( "titre" =>"Créer un contexte")) ?> diff --git a/pilotage/app/views/igo_contexte/search.phtml b/pilotage/app/views/igo_contexte/search.phtml new file mode 100644 index 00000000..f8461bac --- /dev/null +++ b/pilotage/app/views/igo_contexte/search.phtml @@ -0,0 +1,66 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Contextes")) ?> +partial("igo_contexte/search_entete") ?> + + + + + + + + + + + + + + + + + + + + items as $igo_contexte) { ?> + + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/search_entete.phtml b/pilotage/app/views/igo_contexte/search_entete.phtml new file mode 100644 index 00000000..a3c5c1ef --- /dev/null +++ b/pilotage/app/views/igo_contexte/search_entete.phtml @@ -0,0 +1,15 @@ +
        +
        + tag->linkTo(array($controller."/index"."/".$r_controller."/".$action."/".$parameters, "")); ?> +
        +
        + escaper->escapeHtml(str_replace("%","",$criteres)). "
        ".$this->tag->linkTo($controller."/searchAll", ""); + } + ?> +
        +
        + igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> +
        +
        \ No newline at end of file diff --git a/pilotage/app/views/igo_contexte/table.phtml b/pilotage/app/views/igo_contexte/table.phtml new file mode 100644 index 00000000..284c23d0 --- /dev/null +++ b/pilotage/app/views/igo_contexte/table.phtml @@ -0,0 +1,213 @@ +session->get("info_utilisateur")->estAdmin; +?> + +
        +
        + +
        +
        + tag->textField(array("nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "profil_proprietaire_id", + IgoProfil::findAllProfils(), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("code", + "class" => "form-control", + "placeholder" => "Caractères acceptés : a-z et 0-9" + )); + ?> +
        +
        + +
        +
        + +
        +
        + tag->textField(array("description", + "class" => "form-control" + )); + ?> +
        +
        + + + +
        +
        + +
        +
        + tag->textField(array( + "zoom", + "type" => "number", + "class" => "form-control", + "placeholder" => "Ex : 12,34" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textArea(array( + "mf_map_def", + "class" => "form-control", + 'cols' => 80, + 'rows' => 5 + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_map_projection", + "type" => "number", + "class" => "form-control", + "placeholder" => "Ex : 32198" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_map_meta_onlineresource", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + Vous pouvez insérer automatiquement le Code du contexte en utilisant le mot clé {Code}. Par ex : /cgi-wms/mapserv.fcgi?map={Code}.map +
        +
        +
        +
        + +
        +
        + tag->checkField(array( + "generer_onlineresource", + "value" => true + )); + ?> +
        +
        +partial("commun/date_modification"); ?> +
        +
        + +
        +
        + tag->textField(array( + "json", + "class" => "form-control" + )); + ?> +
        +
        +view->getActionName()): +?> +
        +
        +

        Fonctionalitées avancées

        +
        +
        + +
        +
        +
        +
        + +
        +
        + tag->select(array( + "id_contexte_a_dupliquer", + $igoContextesQuilPossede, + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + Les groupes et les couches du contexte sélectionné seront automatiquement ajouté au nouveau contexte. +
        +
        + \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/associerContexte.phtml b/pilotage/app/views/igo_couche/associerContexte.phtml new file mode 100644 index 00000000..dee1436c --- /dev/null +++ b/pilotage/app/views/igo_couche/associerContexte.phtml @@ -0,0 +1,5 @@ + +getContent(); ?> +view->includeCTL("igo_contexte","search?id=".$id); ?> +view->includeCTL("igo_couche","associerContexteEdit?contexte_id=".$id."&page=".$page,$r_controller); ?> + diff --git a/pilotage/app/views/igo_couche/associerContexteEdit.phtml b/pilotage/app/views/igo_couche/associerContexteEdit.phtml new file mode 100644 index 00000000..8a4371e3 --- /dev/null +++ b/pilotage/app/views/igo_couche/associerContexteEdit.phtml @@ -0,0 +1,59 @@ + +partial("commun/titre", array("titre" =>"Associer des couches")) ?> +getContent(); ?> +tag->form() ?> + + + + + + + + + + + + + + + + + + items as $row) { ?> + + + + + + + + + + + + + + + + + + + + total_pages>1) { ?> + + + + + + +
        Id Assoc.TypeDescriptionInd. fond de carteFond de carteVisibleActivemf layer meta namemf layer meta titlemf layer meta group title
        id ?>type ?>description ?>tag->textField(array("ind_fond_de_carte_".$row->couche_id."_".$row->id,"value" => $row->ind_fond_de_carte, "size" => 1)) ?>tag->checkField(array("est_fond_de_carte_".$row->couche_id."_".$row->id, "value" => 1,"disabled" =>1, $row->est_fond_de_carte?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_visible_".$row->couche_id."_".$row->id, "value" => 1, $row->est_visible?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_active_".$row->couche_id."_".$row->id, "value" => 1, $row->est_active?"checked":"unchecked" => 1)) ?>tag->textField(array("mf_layer_meta_name_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_name,"value" => $row->mf_layer_meta_name,"size" => 10)) ?>tag->textField(array("mf_layer_meta_title_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_title, "size" => 10)) ?>tag->textField(array("mf_layer_meta_group_title_".$row->couche_id."_".$row->id,"value" => $row->mf_layer_meta_group_title, "size" => 10)) ?>tag->linkTo(array("igo_couche_contexte/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
        tag->submitButton("Sauver") ?>
        + + + + + + + + +
        tag->linkTo("igo_couche/associerContexte/".$contexte_id, "Premier") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->before, "Précédent") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->next, "Suivant") ?>tag->linkTo("igo_couche/associerContexte/".$contexte_id."/".$page->last, "Dernier") ?>current, "/", $page->total_pages ?>
        +
        diff --git a/pilotage/app/views/igo_couche/associerProfil.phtml b/pilotage/app/views/igo_couche/associerProfil.phtml new file mode 100644 index 00000000..7d60c4e1 --- /dev/null +++ b/pilotage/app/views/igo_couche/associerProfil.phtml @@ -0,0 +1,7 @@ + + +getContent(); ?> + +view->includeCTL("igo_profil","search?id=".$id); ?> +view->includeCTL("igo_couche","associerProfilEdit?profil_id=".$id,$r_controller); ?> + diff --git a/pilotage/app/views/igo_couche/associerProfilEdit.phtml b/pilotage/app/views/igo_couche/associerProfilEdit.phtml new file mode 100644 index 00000000..b53b2b9c --- /dev/null +++ b/pilotage/app/views/igo_couche/associerProfilEdit.phtml @@ -0,0 +1,58 @@ + + +getContent(); ?> + +tag->form() ?> + +partial("commun/titre", array("titre" =>"Associer des couches")) ?> + + + + + + + + + + + + + + + + items as $row) { ?> + + + + + + + + + + + + + + + + + + total_pages>1) { ?> + + + + + + +
        IdTypeDescriptionLectureAnalyseAnalyse(Sortie)ÉcritureExportation
        id ?>type ?>description ?>tag->checkField(array("est_lecture_".$row->id, "value" => 1, $row->est_lecture?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_analyse_".$row->id, "value" => 1, $row->est_analyse?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_analyse_out_".$row->id, "value" => 1, $row->est_analyse_out?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_ecriture_".$row->id, "value" => 1, $row->est_ecriture?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_exportation_".$row->id, "value" => 1, $row->est_exportation?"checked":"unchecked" => 1)) ?>tag->linkTo(array("igo_permission/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
        tag->submitButton("Sauver") ?>
        + + + + + + + + +
        tag->linkTo("igo_couche/search", "Premier") ?>tag->linkTo("igo_couche/search?page=" . $page->before, "Précédent") ?>tag->linkTo("igo_couche/search?page=" . $page->next, "Suivant") ?>tag->linkTo("igo_couche/search?page=" . $page->last, "Dernier") ?>current, "/", $page->total_pages ?>
        +
        diff --git a/pilotage/app/views/igo_couche/edit.phtml b/pilotage/app/views/igo_couche/edit.phtml new file mode 100644 index 00000000..a911c7c4 --- /dev/null +++ b/pilotage/app/views/igo_couche/edit.phtml @@ -0,0 +1,2 @@ + +partial("commun/edit", array( "titre" =>"Modifier une couche")) ?> diff --git a/pilotage/app/views/igo_couche/fiche.phtml b/pilotage/app/views/igo_couche/fiche.phtml new file mode 100644 index 00000000..7a7ec77d --- /dev/null +++ b/pilotage/app/views/igo_couche/fiche.phtml @@ -0,0 +1,12 @@ +getContent(); ?> + + + + +
        tag->linkTo(array($retour, "")); ?>
        +tag->stylesheetLink("csw/fiche.css");?> +
        +
        + +
        +
        diff --git a/pilotage/app/views/igo_couche/fiche_csw.phtml b/pilotage/app/views/igo_couche/fiche_csw.phtml new file mode 100644 index 00000000..7a7ec77d --- /dev/null +++ b/pilotage/app/views/igo_couche/fiche_csw.phtml @@ -0,0 +1,12 @@ +getContent(); ?> + + + + +
        tag->linkTo(array($retour, "")); ?>
        +tag->stylesheetLink("csw/fiche.css");?> +
        +
        + +
        +
        diff --git a/pilotage/app/views/igo_couche/index.phtml b/pilotage/app/views/igo_couche/index.phtml new file mode 100644 index 00000000..2dfd57af --- /dev/null +++ b/pilotage/app/views/igo_couche/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/new.phtml b/pilotage/app/views/igo_couche/new.phtml new file mode 100644 index 00000000..e43890fe --- /dev/null +++ b/pilotage/app/views/igo_couche/new.phtml @@ -0,0 +1,2 @@ +partial("commun/new", array( "titre" =>"Créer une couche")) ?> + diff --git a/pilotage/app/views/igo_couche/search.phtml b/pilotage/app/views/igo_couche/search.phtml new file mode 100644 index 00000000..e16917b8 --- /dev/null +++ b/pilotage/app/views/igo_couche/search.phtml @@ -0,0 +1,70 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Couches")) ?> + +
        +
        + tag->linkTo(array($controller."/index"."/".$r_controller."/".$action."/".$parameters, "")); ?> +
        +
        + escaper->escapeHtml(str_replace("%","",$criteres)). "
        ".$this->tag->linkTo($controller."/searchAll", ""); + } + ?> +
        +
        + igo_tag->createButton(array($controller."/new"."/".$r_controller."/".$action."/".$parameters, ""), $controller); ?> + +
        +
        + + + + + + + + + + + + + + + + + items as $row) { ?> + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche/table.phtml b/pilotage/app/views/igo_couche/table.phtml new file mode 100644 index 00000000..ddf0fcb1 --- /dev/null +++ b/pilotage/app/views/igo_couche/table.phtml @@ -0,0 +1,440 @@ + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_title", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_name", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control" + )); + ?> +
        +
        + +
        +
        + +
        +
        + tag->textField(array( + "fiche_csw_id", + "class" => "form-control" + )); + ?> +
        +
        + tag->linkTo(array("igo_couche/fiche" . "/" . $this->tag->getValue("id") . "/" . + $r_controller . "/" . $action . "/" . $parameters, + "Consulter")); + + ?> +
        +
        + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_group_title", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_group", + "class" => "form-control", + "data-toggle" => "tooltip", + "data-placement" => "right", + "title" => "Paramètre Group du mapfile" + )); + ?> +
        +
        + +
        +
        + +
        +
        + tag->select(array( + "geometrie_id", + $geometrie_desc, + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        + +
        + + +
        +
        +
        +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "layer_a_order", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + + + +
        +
        + tag->textField(array( + "mf_layer_meta_z_order", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_minscale_denom", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_maxscale_denom", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelminscale_denom", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelmaxscale_denom", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + 0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, + 6=>6, 7=>7, 8=>8, 9=>9, 10=>10, 11=>11, + 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, + 17=>17, 18=>18, 19=>19, 20=>20); + + echo $this->tag->select(array( + "max_zoom_level", + $zoomLevel, + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->select(array( + "min_zoom_level", + $zoomLevel, + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_opacity", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        +
        +
        +
        +
        +
         
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_commune", "value" => 1)) ?> +
        +
        + + +
        +
        + +
        +
        + tag->checkField(array("est_publique", "value" => 1)) ?> +
        +
        + + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_name", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_filtre", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_labelitem", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textArea(array( + 'mf_layer_meta_def', + 'cols' => 50, + 'rows' => 5, + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textArea(array( + 'mf_layer_def', + 'cols' => 50, + 'rows' => 10, + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "service_tuile", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_wfs_max_feature", + "type" => "number", + "class" => "form-control" + )); + ?> +
        +
        + + +
        +
        + +
        +
        + tag->checkField(array("est_fond_de_carte", "value" => 1)) ?> + +
        +
        + + +
        +
        + +
        +
        + tag->textArea(array( + 'mf_layer_meta_attribution_title', + 'cols' => 50, + 'rows' => 5, + "class" => "form-control" + )); + ?> +
        +
        + +partial("commun/date_modification"); ?> +tag->hiddenField(array('acces')) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml b/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml new file mode 100644 index 00000000..4d2928f1 --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/arbreCouches.phtml @@ -0,0 +1,5 @@ + +getContent(); ?> +view->includeCTL("igo_contexte","search?id=".$id); ?> +view->includeCTL("igo_couche_contexte","arbreCouchesEdit?contexte_id=".$id); ?> + diff --git a/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml b/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml new file mode 100644 index 00000000..3e58a43e --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/arbreCouchesEdit.phtml @@ -0,0 +1,186 @@ + + + + + + + + + + + + +getContent(); ?> + +tag->form(array("/igo_couche_contexte/arbreCouches/" . $contexte_id, 'id'=>'formArbo')); ?> + + +partial("commun/titre", array("titre" =>"Associer des groupes et des couches à un contexte")); ?> + +
        +
          +
        • Ouvrir
        • +
        • Fermer
        • +
        • Commun
        • +
        • tag->submitButton(array("Enregistrer", "class"=>"btn btn-primary", "id" =>"enregistrer")); ?>
        • +
        +
        + +
        +
        +
        + + +
        +
        +

        Légende

        +
          +
        • Visible
        • +
        • Actif
        • +
        • Coché
        • +
        • Partiel
        • +
        • Complet
        • +
        • Partiel grisé
        • +
        • Complet grisé
        • +
        • Exclu
        • +
        +
        +
        \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/edit.phtml b/pilotage/app/views/igo_couche_contexte/edit.phtml new file mode 100644 index 00000000..61c823ac --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une association au contexte")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/editw.phtml b/pilotage/app/views/igo_couche_contexte/editw.phtml new file mode 100644 index 00000000..57eab744 --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/editw.phtml @@ -0,0 +1,27 @@ +tag->stylesheetLink("css/bootstrap.css"); ?> +getContent(); ?> +flash->output() ?> +tag->form($controller."/save/".$retour) ?> + + + + + + + + +
        Fermer
        + +partial("commun/titre", array("titre" =>"Modifier une association contexte/couche")) ?> + + + partial($controller."/table") ?> + + + + + +
        tag->hiddenField("id") ?>tag->submitButton("Sauver") ?>
        + + + diff --git a/pilotage/app/views/igo_couche_contexte/index.phtml b/pilotage/app/views/igo_couche_contexte/index.phtml new file mode 100644 index 00000000..69bb27bd --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une association contexte/couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/new.phtml b/pilotage/app/views/igo_couche_contexte/new.phtml new file mode 100644 index 00000000..793c5d3b --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une association contexte/couche")) ?> diff --git a/pilotage/app/views/igo_couche_contexte/search.phtml b/pilotage/app/views/igo_couche_contexte/search.phtml new file mode 100644 index 00000000..d4bc1899 --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/search.phtml @@ -0,0 +1,56 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Associations contextes/couches")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + + + + + items as $igo_couche_contexte) { ?> + + + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_couche_contexte/table.phtml b/pilotage/app/views/igo_couche_contexte/table.phtml new file mode 100644 index 00000000..24710f04 --- /dev/null +++ b/pilotage/app/views/igo_couche_contexte/table.phtml @@ -0,0 +1,166 @@ + +
        +
        + +
        +
        + tag->select(array( + "contexte_id", + IgoContexte::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        +
        +
        + view->estGroupeDeCouche ? 'checked': ''; ?>>
        + view->estGroupeDeCouche ? 'checked': ''; ?>> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "groupe_couche_id", + $this->modelsManager->executeQuery('SELECT mf_layer_name, couche_id AS groupe_couche_id FROM IgoGroupeCouche AS gc INNER JOIN IgoCouche AS c ON c.id = gc.couche_id ORDER BY mf_layer_name'), + "using" => array("groupe_couche_id", "mf_layer_name"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "groupe_id", + IgoGroupe::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_visible", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_active", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "ind_fond_de_carte", + array( + "D" => "Défaut de la couche", + "O" => "Oui", + "N" => "Non"), + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_name", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_title", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_group_title", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "layer_a_order", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_z_order", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_class_def", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/edit.phtml b/pilotage/app/views/igo_geometrie/edit.phtml new file mode 100644 index 00000000..8b5589b3 --- /dev/null +++ b/pilotage/app/views/igo_geometrie/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/index.phtml b/pilotage/app/views/igo_geometrie/index.phtml new file mode 100644 index 00000000..72de58d6 --- /dev/null +++ b/pilotage/app/views/igo_geometrie/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/new.phtml b/pilotage/app/views/igo_geometrie/new.phtml new file mode 100644 index 00000000..4d14c3f5 --- /dev/null +++ b/pilotage/app/views/igo_geometrie/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une géométrie")) ?> diff --git a/pilotage/app/views/igo_geometrie/search.phtml b/pilotage/app/views/igo_geometrie/search.phtml new file mode 100644 index 00000000..bc8b7519 --- /dev/null +++ b/pilotage/app/views/igo_geometrie/search.phtml @@ -0,0 +1,45 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Géométries")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + items as $igo_geometrie) { ?> + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie/table.phtml b/pilotage/app/views/igo_geometrie/table.phtml new file mode 100644 index 00000000..7311f5e2 --- /dev/null +++ b/pilotage/app/views/igo_geometrie/table.phtml @@ -0,0 +1,183 @@ + + +
        +
        + +
        +
        + tag->select(array( + "classe_entite_id", + IgoClasseEntite::find(array("order" => "nom")), "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control")); + ?> + +
        +
        +
        +
        + +
        +
        + tag->select(array( + "geometrie_type_id", + IgoGeometrieType::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control")); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "acces", + ($this->view->getActionName() == "index") ? + array( + "D" => "Distant", + "L" => "Local") : + array( + "D" => "Distant", + "L" => "Local"), + "class" => "form-control")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "vue_defaut", + "class" => "form-control")); ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "ind_inclusion", + ($this->view->getActionName() == "index") ? + array( + "" => " ", + "T" => "Tous", + "E" => "Liste d'exclusion", + "I" => "Liste d'inclusion") : + array( + "T" => "Tous", + "E" => "Liste d'exclusion", + "I" => "Liste d'inclusion"), + "class" => "form-control")); + ?> + +
        +
        +
        +
        + +
        +
        +
        + tag->textField(array("date_chargement", "class" => "form-control")) ?> +
        + +
        +
        +
        +
        + +
        +
        + tag->select(array( + "connexion_id", + IgoConnexion::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control")) + ?> +
        +
        + igo_tag->linkIfAdmin(array("igo_connexion/new" . "/" . $r_controller . "/" . $action . "/" . $parameters, "Créer")); ?> +
        +
        + igo_tag->linkIfAdmin(array( + '', + " Modifier", + 'id'=>'editer-connexion_id', + 'data-suivilien-href' => $this->config->uri->pilotage."/igo_connexion/edit" . "/{valeur}/" . $r_controller . "/" . $action . "/" . $parameters, + 'target' => '_blank' + )); ?> +
        + +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_data", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "echelle_prod", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_projection", + "class" => "form-control" + )); ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("remarque", + "class" => "form-control" + )); ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/edit.phtml b/pilotage/app/views/igo_geometrie_type/edit.phtml new file mode 100644 index 00000000..4fa27c72 --- /dev/null +++ b/pilotage/app/views/igo_geometrie_type/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un type de géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/index.phtml b/pilotage/app/views/igo_geometrie_type/index.phtml new file mode 100644 index 00000000..b55c3c85 --- /dev/null +++ b/pilotage/app/views/igo_geometrie_type/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un type de géométrie")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/new.phtml b/pilotage/app/views/igo_geometrie_type/new.phtml new file mode 100644 index 00000000..163fa305 --- /dev/null +++ b/pilotage/app/views/igo_geometrie_type/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un type de géométrie")) ?> diff --git a/pilotage/app/views/igo_geometrie_type/search.phtml b/pilotage/app/views/igo_geometrie_type/search.phtml new file mode 100644 index 00000000..474a6166 --- /dev/null +++ b/pilotage/app/views/igo_geometrie_type/search.phtml @@ -0,0 +1,43 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Types de géométrie")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + items as $igo_geometrie_type) { ?> + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_geometrie_type/table.phtml b/pilotage/app/views/igo_geometrie_type/table.phtml new file mode 100644 index 00000000..52ef9910 --- /dev/null +++ b/pilotage/app/views/igo_geometrie_type/table.phtml @@ -0,0 +1,63 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "layer_type", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "geometrie_type", + ($this->view->getActionName() == "index") ? + array( + "" => " ", + "C" => "Chart", + "Q" => "Query", + "R" => "Raster", + "V" => "Vectoriel") : + array( + "C" => "Chart", + "Q" => "Query", + "R" => "Raster", + "V" => "Vectoriel"), + "class" => "form-control", + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_meta_z_order", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> diff --git a/pilotage/app/views/igo_groupe/associerContexte.phtml b/pilotage/app/views/igo_groupe/associerContexte.phtml new file mode 100644 index 00000000..9d1d0d97 --- /dev/null +++ b/pilotage/app/views/igo_groupe/associerContexte.phtml @@ -0,0 +1,7 @@ + + +getContent(); ?> + +view->includeCTL("igo_contexte","search?id=".$id); ?> +view->includeCTL("igo_groupe","associerContexteEdit?contexte_id=".$id,$r_controller); ?> + diff --git a/pilotage/app/views/igo_groupe/associerContexteEdit.phtml b/pilotage/app/views/igo_groupe/associerContexteEdit.phtml new file mode 100644 index 00000000..15982c0d --- /dev/null +++ b/pilotage/app/views/igo_groupe/associerContexteEdit.phtml @@ -0,0 +1,56 @@ + + +getContent(); ?> + + +tag->form() ?> + +partial("commun/titre", array("titre" =>"Associer des groupes de couches")) ?> + + + + + + + + + + + + + + + items as $row) { ?> + + + + + + + + + + + + + + + + total_pages>1) { ?> + + + + + + +
        Id groupeTypeNomInd. fond de carteVisibleActive
        groupe_id ?>nom ?>description ?>tag->textField(array("ind_fond_de_carte_".$row->groupe_id."_".$row->id,"value" => $row->ind_fond_de_carte, "size" => 1)) ?>tag->checkField(array("est_visible_".$row->groupe_id."_".$row->id, "value" => 1, $row->est_visible?"checked":"unchecked" => 1)) ?>tag->checkField(array("est_active_".$row->groupe_id."_".$row->id, "value" => 1, $row->est_active?"checked":"unchecked" => 1)) ?>tag->linkTo(array("igo_couche_contexte/edit/" . $row->id."/".$controller."/".$action."/".$parameters, " Modifier")) ?>
        tag->submitButton("Sauver") ?>
        + + + + + + + + +
        tag->linkTo("igo_couche/search", "Premier") ?>tag->linkTo("igo_couche/search?page=" . $page->before, "Précédent") ?>tag->linkTo("igo_couche/search?page=" . $page->next, "Suivant") ?>tag->linkTo("igo_couche/search?page=" . $page->last, "Dernier") ?>current, "/", $page->total_pages ?>
        +
        diff --git a/pilotage/app/views/igo_groupe/edit.phtml b/pilotage/app/views/igo_groupe/edit.phtml new file mode 100644 index 00000000..c48887d6 --- /dev/null +++ b/pilotage/app/views/igo_groupe/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/index.phtml b/pilotage/app/views/igo_groupe/index.phtml new file mode 100644 index 00000000..a7a2a625 --- /dev/null +++ b/pilotage/app/views/igo_groupe/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/new.phtml b/pilotage/app/views/igo_groupe/new.phtml new file mode 100644 index 00000000..b3f41651 --- /dev/null +++ b/pilotage/app/views/igo_groupe/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un groupe de couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/search.phtml b/pilotage/app/views/igo_groupe/search.phtml new file mode 100644 index 00000000..51286559 --- /dev/null +++ b/pilotage/app/views/igo_groupe/search.phtml @@ -0,0 +1,55 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Groupes de couche")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + items as $igo_groupe) { ?> + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe/table.phtml b/pilotage/app/views/igo_groupe/table.phtml new file mode 100644 index 00000000..3cf8f79a --- /dev/null +++ b/pilotage/app/views/igo_groupe/table.phtml @@ -0,0 +1,124 @@ +session->get("info_utilisateur")->estAdmin; +?> + + + + + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control" + )) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_exclu_arbre", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "profil_proprietaire_id", + $estAdmin ? IgoProfil::find(array("order" => "libelle")) : IgoProfil::findAllProfils(), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        + +
        +
        + +
        +
        + 'groupe_parent', + 'listeDe' => $this->view->groupesPasParentsDeGroupe, + 'listeA' => $this->view->groupesParentsDeGroupe + )); + ?> +
        +
        + + +
        +
        + +
        +
        + view->estGroupeDeCouche ? 'checked': ''; ?>>
        + view->estGroupeDeCouche ? 'checked': ''; ?>> +
        +
        +
        +
        + +
        +
        + + 'couche_enfant', + 'listeDe' => $this->view->couchesPasEnfantDeGroupe, + 'listeA' => $this->view->couchesEnfantDeGroupe + )); + + ?> +
        +
        +
        +
        + +
        +
        + 'groupe_enfant', + 'listeDe' => $this->view->groupesPasEnfantsDeGroupe, + 'listeA' => $this->view->groupesEnfantsDeGroupe + )); + + + ?> +
        +
        +partial("commun/date_modification"); ?> + \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/edit.phtml b/pilotage/app/views/igo_groupe_couche/edit.phtml new file mode 100644 index 00000000..6de58322 --- /dev/null +++ b/pilotage/app/views/igo_groupe_couche/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/index.phtml b/pilotage/app/views/igo_groupe_couche/index.phtml new file mode 100644 index 00000000..33173d26 --- /dev/null +++ b/pilotage/app/views/igo_groupe_couche/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/new.phtml b/pilotage/app/views/igo_groupe_couche/new.phtml new file mode 100644 index 00000000..086c2f7f --- /dev/null +++ b/pilotage/app/views/igo_groupe_couche/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une association groupe et couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/search.phtml b/pilotage/app/views/igo_groupe_couche/search.phtml new file mode 100644 index 00000000..2b93a43f --- /dev/null +++ b/pilotage/app/views/igo_groupe_couche/search.phtml @@ -0,0 +1,31 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Association groupes et couches")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + items as $igo_groupe_couche) { ?> + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_groupe_couche/table.phtml b/pilotage/app/views/igo_groupe_couche/table.phtml new file mode 100644 index 00000000..2aa9929d --- /dev/null +++ b/pilotage/app/views/igo_groupe_couche/table.phtml @@ -0,0 +1,36 @@ + +
        +
        + +
        +
        + tag->select(array( + "groupe_id", + IgoGroupe::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "couche_id", + IgoCouche::find(array("order" => "mf_layer_meta_title")), + "using" => array("id", "mf_layer_meta_title"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/edit.phtml b/pilotage/app/views/igo_liste_valeur/edit.phtml new file mode 100644 index 00000000..e34b98c6 --- /dev/null +++ b/pilotage/app/views/igo_liste_valeur/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/index.phtml b/pilotage/app/views/igo_liste_valeur/index.phtml new file mode 100644 index 00000000..7c761522 --- /dev/null +++ b/pilotage/app/views/igo_liste_valeur/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/new.phtml b/pilotage/app/views/igo_liste_valeur/new.phtml new file mode 100644 index 00000000..f8814f7a --- /dev/null +++ b/pilotage/app/views/igo_liste_valeur/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une liste de valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/search.phtml b/pilotage/app/views/igo_liste_valeur/search.phtml new file mode 100644 index 00000000..ddd39e19 --- /dev/null +++ b/pilotage/app/views/igo_liste_valeur/search.phtml @@ -0,0 +1,26 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Liste de valeurs")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + items as $igo_liste_valeur) { ?> + + + + + + + + + +
        tag->linkTo("igo_liste_valeur/search?order=id", "Liste de valeur") ?>tag->linkTo("igo_liste_valeur/search?order=description", "Description") ?>tag->linkTo("igo_liste_valeur/search?order=date_modif", "Date de modification") ?>
        id ?>description ?>date_modif ?>tag->linkTo(array("igo_liste_valeur/edit/" . $igo_liste_valeur->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_liste_valeur/delete/" . $igo_liste_valeur->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation'=>'supprimer')); ?>
        +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_liste_valeur/table.phtml b/pilotage/app/views/igo_liste_valeur/table.phtml new file mode 100644 index 00000000..89a38275 --- /dev/null +++ b/pilotage/app/views/igo_liste_valeur/table.phtml @@ -0,0 +1,10 @@ + +
        +
        + +
        +
        + tag->textField(array("description", "size" => 30)); ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/edit.phtml b/pilotage/app/views/igo_organisme_responsable/edit.phtml new file mode 100644 index 00000000..2701fe84 --- /dev/null +++ b/pilotage/app/views/igo_organisme_responsable/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/index.phtml b/pilotage/app/views/igo_organisme_responsable/index.phtml new file mode 100644 index 00000000..341cdb56 --- /dev/null +++ b/pilotage/app/views/igo_organisme_responsable/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/new.phtml b/pilotage/app/views/igo_organisme_responsable/new.phtml new file mode 100644 index 00000000..21cfa182 --- /dev/null +++ b/pilotage/app/views/igo_organisme_responsable/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un organisme responsable")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/search.phtml b/pilotage/app/views/igo_organisme_responsable/search.phtml new file mode 100644 index 00000000..01fb01d3 --- /dev/null +++ b/pilotage/app/views/igo_organisme_responsable/search.phtml @@ -0,0 +1,45 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Organismes responsables")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + items as $igo_organisme_responsable) { ?> + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_organisme_responsable/table.phtml b/pilotage/app/views/igo_organisme_responsable/table.phtml new file mode 100644 index 00000000..e5469f20 --- /dev/null +++ b/pilotage/app/views/igo_organisme_responsable/table.phtml @@ -0,0 +1,65 @@ +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "acronyme", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "url", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "contact_id", + $contact_desc, + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control")); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "remarque", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/arbreCouches.phtml b/pilotage/app/views/igo_permission/arbreCouches.phtml new file mode 100644 index 00000000..80af2a5e --- /dev/null +++ b/pilotage/app/views/igo_permission/arbreCouches.phtml @@ -0,0 +1,4 @@ + +getContent(); ?> +view->includeCTL("igo_profil","search?id=".$id); ?> +view->includeCTL("igo_permission","arbreCouchesEdit?profil_id=".$id,$r_controller); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml b/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml new file mode 100644 index 00000000..8f444689 --- /dev/null +++ b/pilotage/app/views/igo_permission/arbreCouchesEdit.phtml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + +getContent(); ?> + +tag->form(array("/igo_permission/arbreCouches/" . $profil_id, 'id' => 'formArbo')); ?> + + +partial("commun/titre", array("titre" => "Donner des permissions à des groupes et des couches")) ?> + +
        +
        + +
          +
        • Ouvrir
        • +
        • Fermer
        • +
        • tag->submitButton(array("Enregistrer", "class" => "btn btn-primary", "id" => "enregistrer")); ?>
        • +
        +
        +
        + + +
        +
        +
        + + +
        +
        +

        Légende

        +
          +
        • Lecture
        • +
        • Analyse
        • +
        • Écriture
        • +
        • Export
        • +
        • Association
        • +
        • Coché
        • +
        • Partiel
        • +
        • Complet
        • +
        +
        +
        diff --git a/pilotage/app/views/igo_permission/edit.phtml b/pilotage/app/views/igo_permission/edit.phtml new file mode 100644 index 00000000..6cddc2cf --- /dev/null +++ b/pilotage/app/views/igo_permission/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/editw.phtml b/pilotage/app/views/igo_permission/editw.phtml new file mode 100644 index 00000000..7fde090d --- /dev/null +++ b/pilotage/app/views/igo_permission/editw.phtml @@ -0,0 +1,28 @@ + +tag->stylesheetLink("css/bootstrap.css"); ?> +getContent(); ?> +flash->output() ?> +tag->form($controller."/save/".$retour) ?> + + + + + + + + +
        Fermer
        + +partial("commun/titre", array("titre" =>"Modifier une association profil/couche")) ?> + + + partial($controller."/table") ?> + + + + + +
        tag->hiddenField("id") ?>tag->submitButton("Sauver") ?>
        + + + diff --git a/pilotage/app/views/igo_permission/index.phtml b/pilotage/app/views/igo_permission/index.phtml new file mode 100644 index 00000000..94f6661b --- /dev/null +++ b/pilotage/app/views/igo_permission/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/new.phtml b/pilotage/app/views/igo_permission/new.phtml new file mode 100644 index 00000000..fa7011e4 --- /dev/null +++ b/pilotage/app/views/igo_permission/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une permission")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/search.phtml b/pilotage/app/views/igo_permission/search.phtml new file mode 100644 index 00000000..cf29c0af --- /dev/null +++ b/pilotage/app/views/igo_permission/search.phtml @@ -0,0 +1,96 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Permissions sur les couches")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + + + + + + items as $igo_permission) { + ?> + + + + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_permission/table.phtml b/pilotage/app/views/igo_permission/table.phtml new file mode 100644 index 00000000..793345e0 --- /dev/null +++ b/pilotage/app/views/igo_permission/table.phtml @@ -0,0 +1,117 @@ +session->get("info_utilisateur")->estAdmin; +?> + + +
        +
        + +
        +
        + tag->select(array( + "profil_id", + $estAdmin ? IgoProfil::find(array("order" => "libelle")) : IgoProfil::findProfilsByProfilsProprietaires(), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        +
        +
        + tag->getValue('groupe_id') ? 'checked': ''; ?>>
        + tag->getValue('groupe_id') ? 'checked': ''; ?>> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "groupe_couche_id", + $estAdmin ? IgoCouche::find() : IgoCouche::findEstAssociable(), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "groupe_id", + $estAdmin ? IgoGroupe::find() : IgoGroupe::findEstAssociable(), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_lecture", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_analyse", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_ecriture", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_export", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->checkField(array("est_association", "value" => 1)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "mf_layer_filtre", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/edit.phtml b/pilotage/app/views/igo_profil/edit.phtml new file mode 100644 index 00000000..f85219ec --- /dev/null +++ b/pilotage/app/views/igo_profil/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/index.phtml b/pilotage/app/views/igo_profil/index.phtml new file mode 100644 index 00000000..784fd833 --- /dev/null +++ b/pilotage/app/views/igo_profil/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/new.phtml b/pilotage/app/views/igo_profil/new.phtml new file mode 100644 index 00000000..f2d8fe45 --- /dev/null +++ b/pilotage/app/views/igo_profil/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/search.phtml b/pilotage/app/views/igo_profil/search.phtml new file mode 100644 index 00000000..66161c4a --- /dev/null +++ b/pilotage/app/views/igo_profil/search.phtml @@ -0,0 +1,44 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Profils")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + +items as $igo_profil) { ?> + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_profil/table.phtml b/pilotage/app/views/igo_profil/table.phtml new file mode 100644 index 00000000..bd660ac0 --- /dev/null +++ b/pilotage/app/views/igo_profil/table.phtml @@ -0,0 +1,46 @@ +session->get("info_utilisateur")->estAdmin; +?> + +
        +
        + +
        +
        + tag->textField(array( + "libelle", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "profil_proprietaire_id", + IgoProfil::findAllProfils(), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/edit.phtml b/pilotage/app/views/igo_service/edit.phtml new file mode 100644 index 00000000..d1296bbd --- /dev/null +++ b/pilotage/app/views/igo_service/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/index.phtml b/pilotage/app/views/igo_service/index.phtml new file mode 100644 index 00000000..acf08902 --- /dev/null +++ b/pilotage/app/views/igo_service/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/new.phtml b/pilotage/app/views/igo_service/new.phtml new file mode 100644 index 00000000..260c4ece --- /dev/null +++ b/pilotage/app/views/igo_service/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/search.phtml b/pilotage/app/views/igo_service/search.phtml new file mode 100644 index 00000000..90237efe --- /dev/null +++ b/pilotage/app/views/igo_service/search.phtml @@ -0,0 +1,32 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Services")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + items as $igo_service) { ?> + + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service/table.phtml b/pilotage/app/views/igo_service/table.phtml new file mode 100644 index 00000000..2c3c17c1 --- /dev/null +++ b/pilotage/app/views/igo_service/table.phtml @@ -0,0 +1,37 @@ +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "description", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array( + "wsdl", + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/edit.phtml b/pilotage/app/views/igo_service_profil/edit.phtml new file mode 100644 index 00000000..a1e8dff6 --- /dev/null +++ b/pilotage/app/views/igo_service_profil/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une permission sur un service")) ?> diff --git a/pilotage/app/views/igo_service_profil/index.phtml b/pilotage/app/views/igo_service_profil/index.phtml new file mode 100644 index 00000000..bcc59f97 --- /dev/null +++ b/pilotage/app/views/igo_service_profil/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une permission sur un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/new.phtml b/pilotage/app/views/igo_service_profil/new.phtml new file mode 100644 index 00000000..81f5a6bf --- /dev/null +++ b/pilotage/app/views/igo_service_profil/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une permission sur un service")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/search.phtml b/pilotage/app/views/igo_service_profil/search.phtml new file mode 100644 index 00000000..55ac67a6 --- /dev/null +++ b/pilotage/app/views/igo_service_profil/search.phtml @@ -0,0 +1,28 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Permissions sur les services")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + items as $igo_service_profil) { ?> + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_service_profil/table.phtml b/pilotage/app/views/igo_service_profil/table.phtml new file mode 100644 index 00000000..fdc86b84 --- /dev/null +++ b/pilotage/app/views/igo_service_profil/table.phtml @@ -0,0 +1,41 @@ + +
        +
        + +
        +
        + session->has("profil_id")) { + $this->tag->setDefault("profil_id", $this->session->get("profil_id")); + } + ?> + tag->select(array( + "profil_id", + IgoProfil::find(array("order" => "libelle")), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "service_id", + IgoService::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/edit.phtml b/pilotage/app/views/igo_source_entite/edit.phtml new file mode 100644 index 00000000..efe4477f --- /dev/null +++ b/pilotage/app/views/igo_source_entite/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/index.phtml b/pilotage/app/views/igo_source_entite/index.phtml new file mode 100644 index 00000000..a7eeb849 --- /dev/null +++ b/pilotage/app/views/igo_source_entite/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/new.phtml b/pilotage/app/views/igo_source_entite/new.phtml new file mode 100644 index 00000000..e1f641b3 --- /dev/null +++ b/pilotage/app/views/igo_source_entite/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une source d'entité")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/search.phtml b/pilotage/app/views/igo_source_entite/search.phtml new file mode 100644 index 00000000..7d06854e --- /dev/null +++ b/pilotage/app/views/igo_source_entite/search.phtml @@ -0,0 +1,39 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Sources entitée")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + items as $igo_source_entite) { ?> + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_source_entite/table.phtml b/pilotage/app/views/igo_source_entite/table.phtml new file mode 100644 index 00000000..f2d58ad1 --- /dev/null +++ b/pilotage/app/views/igo_source_entite/table.phtml @@ -0,0 +1,30 @@ +
        +
        + +
        +
        + tag->textField(array( + "url", + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "organisme_responsable_id", + IgoOrganismeResponsable::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "class" => "form-control", + "useEmpty" => true + )); + ?> +
        +
        + +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/edit.phtml b/pilotage/app/views/igo_utilisateur/edit.phtml new file mode 100644 index 00000000..a1064977 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/index.phtml b/pilotage/app/views/igo_utilisateur/index.phtml new file mode 100644 index 00000000..e43749d4 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/new.phtml b/pilotage/app/views/igo_utilisateur/new.phtml new file mode 100644 index 00000000..cd1b23db --- /dev/null +++ b/pilotage/app/views/igo_utilisateur/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un utilisateur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/search.phtml b/pilotage/app/views/igo_utilisateur/search.phtml new file mode 100644 index 00000000..2d19c8ea --- /dev/null +++ b/pilotage/app/views/igo_utilisateur/search.phtml @@ -0,0 +1,54 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Utilisateurs")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + items as $igo_utilisateur) { ?> + + + + + + + + + + + +partial("commun/search_pagination") ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur/table.phtml b/pilotage/app/views/igo_utilisateur/table.phtml new file mode 100644 index 00000000..b8fb4ea9 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur/table.phtml @@ -0,0 +1,33 @@ + +
        +
        + +
        +
        + tag->textField(array( + "nom", + "class" => "form-control" + )); + ?> +
        +
        + +
        +
        + +
        +
        + tag->checkField(array("est_admin", "value" => 1)) ?> +
        +
        + +
        +
        + +
        +
        + tag->checkField(array("est_pilote", "value" => 1)) ?> +
        +
        + +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/edit.phtml b/pilotage/app/views/igo_utilisateur_profil/edit.phtml new file mode 100644 index 00000000..bf245d88 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur_profil/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un lien utilisateur/profil")) ?> diff --git a/pilotage/app/views/igo_utilisateur_profil/index.phtml b/pilotage/app/views/igo_utilisateur_profil/index.phtml new file mode 100644 index 00000000..a5badbce --- /dev/null +++ b/pilotage/app/views/igo_utilisateur_profil/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un lien utilisateur/profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/new.phtml b/pilotage/app/views/igo_utilisateur_profil/new.phtml new file mode 100644 index 00000000..a372045a --- /dev/null +++ b/pilotage/app/views/igo_utilisateur_profil/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un lien utilisateur/profil")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_utilisateur_profil/search.phtml b/pilotage/app/views/igo_utilisateur_profil/search.phtml new file mode 100644 index 00000000..c4aed466 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur_profil/search.phtml @@ -0,0 +1,39 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Association utilisateur/profil")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + items as $igo_utilisateur_profil) { ?> + + + + + + + + + + +partial("commun/search_pagination") ?> diff --git a/pilotage/app/views/igo_utilisateur_profil/table.phtml b/pilotage/app/views/igo_utilisateur_profil/table.phtml new file mode 100644 index 00000000..4b22e898 --- /dev/null +++ b/pilotage/app/views/igo_utilisateur_profil/table.phtml @@ -0,0 +1,34 @@ + +
        +
        + +
        +
        + tag->select(array( + "profil_id", + IgoProfil::find(array("order" => "libelle")), + "using" => array("id", "libelle"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +
        +
        + +
        +
        + tag->select(array( + "utilisateur_id", + IgoUtilisateur::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/edit.phtml b/pilotage/app/views/igo_valeur/edit.phtml new file mode 100644 index 00000000..60666e52 --- /dev/null +++ b/pilotage/app/views/igo_valeur/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier une valeur")) ?> diff --git a/pilotage/app/views/igo_valeur/index.phtml b/pilotage/app/views/igo_valeur/index.phtml new file mode 100644 index 00000000..8d047de7 --- /dev/null +++ b/pilotage/app/views/igo_valeur/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher une valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/new.phtml b/pilotage/app/views/igo_valeur/new.phtml new file mode 100644 index 00000000..1329728a --- /dev/null +++ b/pilotage/app/views/igo_valeur/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer une valeur")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_valeur/search.phtml b/pilotage/app/views/igo_valeur/search.phtml new file mode 100644 index 00000000..f1267537 --- /dev/null +++ b/pilotage/app/views/igo_valeur/search.phtml @@ -0,0 +1,30 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Valeurs")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + items as $igo_valeur) { ?> + + + + + + + + + + + +
        tag->linkTo("igo_valeur/search?order=id", "Valeur") ?>tag->linkTo("igo_valeur/search?order=description", "Description") ?>Liste de valeurValeurtag->linkTo("igo_valeur/search?order=date_modif", "Date de modification") ?>
        id ?>description ?>liste_valeur_id ?>valeur ?>date_modif ?>tag->linkTo(array("igo_valeur/edit/" . $igo_valeur->id."/".$r_controller."/".$action."/".$parameters, " Modifier")); ?>tag->linkTo(array("igo_valeur/delete/" . $igo_valeur->id."/".$r_controller."/".$action."/".$parameters, " Détruire", 'data-confirmation'=>'supprimer')); ?>
        +partial("commun/search_pagination") ?> diff --git a/pilotage/app/views/igo_valeur/table.phtml b/pilotage/app/views/igo_valeur/table.phtml new file mode 100644 index 00000000..7cd5da8d --- /dev/null +++ b/pilotage/app/views/igo_valeur/table.phtml @@ -0,0 +1,26 @@ + +
        +
        + +
        +
        + tag->textField(array("description", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->select(array("liste_valeur_id", IgoListeValeur::find(array("order" => "description")), "using" => array("id", "nom"), "emptyText" => "Choisir...", "useEmpty" => true)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("valeur", "size" => 30)) ?> +
        +
        +partial("commun/date_modification"); ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_vue_couche/edit.phtml b/pilotage/app/views/igo_vue_couche/edit.phtml new file mode 100644 index 00000000..fe782cf8 --- /dev/null +++ b/pilotage/app/views/igo_vue_couche/edit.phtml @@ -0,0 +1 @@ +partial("commun/edit", array( "titre" =>"Modifier un igo_vue_couche")) ?> diff --git a/pilotage/app/views/igo_vue_couche/index.phtml b/pilotage/app/views/igo_vue_couche/index.phtml new file mode 100644 index 00000000..a7f89338 --- /dev/null +++ b/pilotage/app/views/igo_vue_couche/index.phtml @@ -0,0 +1 @@ +partial("commun/index", array( "titre" =>"Rechercher un igo_vue_couche")) ?> \ No newline at end of file diff --git a/pilotage/app/views/igo_vue_couche/new.phtml b/pilotage/app/views/igo_vue_couche/new.phtml new file mode 100644 index 00000000..73a85047 --- /dev/null +++ b/pilotage/app/views/igo_vue_couche/new.phtml @@ -0,0 +1 @@ +partial("commun/new", array( "titre" =>"Créer un igo_vue_couche")) ?> diff --git a/pilotage/app/views/igo_vue_couche/search.phtml b/pilotage/app/views/igo_vue_couche/search.phtml new file mode 100644 index 00000000..8d484418 --- /dev/null +++ b/pilotage/app/views/igo_vue_couche/search.phtml @@ -0,0 +1,52 @@ + +getContent(); ?> +partial("commun/titre", array("titre" =>"Lister une couche")) ?> +partial("commun/search_entete") ?> + + + + + + + + + + + + + + + + + + items as $igo_vue_couche) { ?> + + + + + + + + + + + + + + + +partial("commun/search_pagination") ?> + + + + + diff --git a/pilotage/app/views/igo_vue_couche/table.phtml b/pilotage/app/views/igo_vue_couche/table.phtml new file mode 100644 index 00000000..b2f68daa --- /dev/null +++ b/pilotage/app/views/igo_vue_couche/table.phtml @@ -0,0 +1,456 @@ +
        +
        + +
        +
        + tag->textField(array("id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("description", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("geometrie_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("vue_validation", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_name", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_group", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_name", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_filtre", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_minscale_denom", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_maxscale_denom", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_labelminscale_denom", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_labelmaxscale_denom", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_def", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_def", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("service_tuile", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("catalogue_csw_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("fiche_csw_id", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_wfs_max_feature", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("est_fond_de_carte", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_opacity", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_title", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_group_title", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_labelitem", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_meta_z_order", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("print_option_url", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("print_option_layer_name", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("est_commune", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("est_publique", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("layer_a_order", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("max_zoom_level", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("min_zoom_level", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("classe_entite_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("geometrie_type_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("vue_defaut", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("date_chargement", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("connexion_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("echelle_prod", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("remarque_geometrie", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("ind_inclusion", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_data", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("mf_layer_projection", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("acces", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("nom_classe_entite", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("description_classe_entite", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("source_entite_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("classification_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("organisme_responsable_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("contact_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("remarque_classe_entite", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("nom_connexion", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("connexion", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("connexion_type_id", "type" => "number")) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("nom_connexion_type", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("connexion_type", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("nom_geometrie_type", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("layer_type", "size" => 30)) ?> +
        +
        +
        +
        + +
        +
        + tag->textField(array("geometrie_type", "size" => 30)) ?> +
        +
        diff --git a/pilotage/app/views/index.volt b/pilotage/app/views/index.volt new file mode 100644 index 00000000..e49fca81 --- /dev/null +++ b/pilotage/app/views/index.volt @@ -0,0 +1,49 @@ + + + + + + + + {{ javascript_include("js/jquery-1.11.0.js") }} + {{ javascript_include("/igo/librairie/jquery-ui/jquery-ui.min.js", false) }} + {{ javascript_include("js/bootstrap.js") }} + {{ javascript_include("js/moment.js") }} + {{ javascript_include("js/bootstrap-datetimepicker.js") }} + {{ javascript_include("js/bootstrap-datetimepicker.fr.js") }} + + {{ javascript_include("js/main.js") }} + + {{ stylesheet_link("css/bootstrap.css") }} + {{ stylesheet_link("css/bootstrap-theme.min.css") }} + {{ stylesheet_link("css/bootstrap.override.css") }} + + {{ stylesheet_link("css/main.css") }} + {{ stylesheet_link("css/mapfile.css") }} + {{ stylesheet_link("css/arborescence/tree.css") }} + {{ stylesheet_link("css/datepicker.css") }} + + IGO - Gestion des métadonnées + + +
        +
        + + {{ image("img/banniere_geo.jpg") }} + {% include "menu/menu.volt" %} + +
        + flash->output(); ?> + {{ content() }} +
        + + + diff --git a/pilotage/app/views/index/index.volt b/pilotage/app/views/index/index.volt new file mode 100644 index 00000000..dbd54686 --- /dev/null +++ b/pilotage/app/views/index/index.volt @@ -0,0 +1,6 @@ +
        +

        IGO - Infrastructure géomatique ouverte

        + +

        Gestion des métadonnées

        + +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/catalogue.phtml b/pilotage/app/views/layouts/catalogue.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/catalogue.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/classe_entite.phtml b/pilotage/app/views/layouts/classe_entite.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/classe_entite.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/contexte.phtml b/pilotage/app/views/layouts/contexte.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/contexte.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/geometrie_def.phtml b/pilotage/app/views/layouts/geometrie_def.phtml new file mode 100644 index 00000000..74e7c85c --- /dev/null +++ b/pilotage/app/views/layouts/geometrie_def.phtml @@ -0,0 +1,3 @@ +
        + getContent(); ?> +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_attribut.phtml b/pilotage/app/views/layouts/igo_attribut.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_attribut.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_catalogue_csw.phtml b/pilotage/app/views/layouts/igo_catalogue_csw.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_catalogue_csw.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classe.phtml b/pilotage/app/views/layouts/igo_classe.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_classe.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classe_entite.phtml b/pilotage/app/views/layouts/igo_classe_entite.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_classe_entite.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_classification.phtml b/pilotage/app/views/layouts/igo_classification.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_classification.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_connexion.phtml b/pilotage/app/views/layouts/igo_connexion.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_connexion.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_contact.phtml b/pilotage/app/views/layouts/igo_contact.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_contact.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_contexte.phtml b/pilotage/app/views/layouts/igo_contexte.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_contexte.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche.phtml b/pilotage/app/views/layouts/igo_couche.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_couche.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche_contexte.phtml b/pilotage/app/views/layouts/igo_couche_contexte.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_couche_contexte.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_couche_def.phtml b/pilotage/app/views/layouts/igo_couche_def.phtml new file mode 100644 index 00000000..74e7c85c --- /dev/null +++ b/pilotage/app/views/layouts/igo_couche_def.phtml @@ -0,0 +1,3 @@ +
        + getContent(); ?> +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_geometrie.phtml b/pilotage/app/views/layouts/igo_geometrie.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_geometrie.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_geometrie_type.phtml b/pilotage/app/views/layouts/igo_geometrie_type.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_geometrie_type.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_groupe_couche.phtml b/pilotage/app/views/layouts/igo_groupe_couche.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_groupe_couche.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_liste_valeur.phtml b/pilotage/app/views/layouts/igo_liste_valeur.phtml new file mode 100644 index 00000000..74e7c85c --- /dev/null +++ b/pilotage/app/views/layouts/igo_liste_valeur.phtml @@ -0,0 +1,3 @@ +
        + getContent(); ?> +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_organisme_responsable.phtml b/pilotage/app/views/layouts/igo_organisme_responsable.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_organisme_responsable.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_permission.phtml b/pilotage/app/views/layouts/igo_permission.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_permission.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_profil.phtml b/pilotage/app/views/layouts/igo_profil.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_profil.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_service.phtml b/pilotage/app/views/layouts/igo_service.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_service.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_service_profil.phtml b/pilotage/app/views/layouts/igo_service_profil.phtml new file mode 100644 index 00000000..74e7c85c --- /dev/null +++ b/pilotage/app/views/layouts/igo_service_profil.phtml @@ -0,0 +1,3 @@ +
        + getContent(); ?> +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_source_entite.phtml b/pilotage/app/views/layouts/igo_source_entite.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_source_entite.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_utilisateur.phtml b/pilotage/app/views/layouts/igo_utilisateur.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_utilisateur.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_utilisateur_profil.phtml b/pilotage/app/views/layouts/igo_utilisateur_profil.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/igo_utilisateur_profil.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/layouts/igo_valeur.phtml b/pilotage/app/views/layouts/igo_valeur.phtml new file mode 100644 index 00000000..c5f10691 --- /dev/null +++ b/pilotage/app/views/layouts/igo_valeur.phtml @@ -0,0 +1 @@ +getContent(); ?> diff --git a/pilotage/app/views/layouts/liste_valeur.phtml b/pilotage/app/views/layouts/liste_valeur.phtml new file mode 100644 index 00000000..74e7c85c --- /dev/null +++ b/pilotage/app/views/layouts/liste_valeur.phtml @@ -0,0 +1,3 @@ +
        + getContent(); ?> +
        \ No newline at end of file diff --git a/pilotage/app/views/layouts/organisme_responsable.phtml b/pilotage/app/views/layouts/organisme_responsable.phtml new file mode 100644 index 00000000..af3ecbe8 --- /dev/null +++ b/pilotage/app/views/layouts/organisme_responsable.phtml @@ -0,0 +1 @@ +getContent(); ?> \ No newline at end of file diff --git a/pilotage/app/views/mapfile/cree.phtml b/pilotage/app/views/mapfile/cree.phtml new file mode 100644 index 00000000..0a906a81 --- /dev/null +++ b/pilotage/app/views/mapfile/cree.phtml @@ -0,0 +1,33 @@ +getContent(); ?> + +tag->form("mapfile/genere") ?> + +partial("commun/titre", array("titre" =>"Générer un mapfile")) ?> + +
        +
        + +
        +
        + tag->select(array( + "contexte_id", + IgoContexte::find(array("order" => "nom")), + "using" => array("id", "nom"), + "emptyText" => "Choisir...", + "useEmpty" => true, + "class" => "form-control" + )); + ?> +
        +
        + +
        + +
        + tag->submitButton(array("Générer", "class"=>'btn btn-primary')) ?> +
        +
        + +tag->hiddenField("id") ?> + + diff --git a/pilotage/app/views/mapfile/display.volt b/pilotage/app/views/mapfile/display.volt new file mode 100644 index 00000000..7f6eb5bb --- /dev/null +++ b/pilotage/app/views/mapfile/display.volt @@ -0,0 +1,117 @@ +
        +
        +
        + Précédent + +
        + + {% if nLayers == 1 %} +

        {{nLayers}} nouvelle couche a été trouvée.

        + {% else %} +

        {{nLayers}} couches ont été trouvées.

        + {% endif %} + +

        {{nNotDistinctLayers}} couches sont en double.

        + +
        + + + + + + + + + + {% for layer in layers %} + {% if !layer['distinct'] %} + + {% else %} + + {% endif %} + + + + + + + + {% endfor %} + + +
        Nom + Exclure +
        + {{layer['name']}} + + +
        +

        + : {{layer['name']}} +

        + +

        + : {{layer['group']}} +

        + +

        + : {{layer['minscaledenom']}} +

        + +

        + : {{layer['maxscaledenom']}} +

        + +

        + : {{layer['labelminscaledenom']}} +

        + +

        + : {{layer['labelmaxscaledenom']}} +

        + +

        + : {{layer['type']}} +

        + +

        + : {{layer['projection']}} +

        + +

        + : {{layer['connection']}} +

        + +

        + : {{layer['connectiontype']}} +

        + +

        + : {{layer['data']}} +

        + +

        + : {{layer['filter']}} +

        + +

        + +

        {{layer['layer_def']}}
        +

        + +

        + +

        {{layer['meta_def']}}
        +

        + +

        + + {% for class in layer['classes'] %} +

        {{class}}
        + {% endfor %} +

        +
        + +
    + +{{ javascript_include("js/mapfileRetro.js") }} \ No newline at end of file diff --git a/pilotage/app/views/mapfile/load.volt b/pilotage/app/views/mapfile/load.volt new file mode 100644 index 00000000..606765a9 --- /dev/null +++ b/pilotage/app/views/mapfile/load.volt @@ -0,0 +1,119 @@ +partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 2 de 4")) ?> + +
    +
    +
    + Précédent + +
    + + {% if nLayers == 1 %} +

    {{nLayers}} nouvelle couche a été trouvée.

    + {% else %} +

    {{nLayers}} couches ont été trouvées.

    + {% endif %} + +

    {{nNotDistinctLayers}} couches sont en double.

    + + + + + + + + + + + + {% for layer in layers %} + {% if !layer['distinct'] %} + + {% else %} + + {% endif %} + + + + + + + + {% endfor %} + + +
    Nom + Exclure +
    + {{layer['name']}} + + +
    +

    + : {{layer['name']}} +

    + +

    + : {{layer['group']}} +

    + +

    + : {{layer['minscaledenom']}} +

    + +

    + : {{layer['maxscaledenom']}} +

    + +

    + : {{layer['labelminscaledenom']}} +

    + +

    + : {{layer['labelmaxscaledenom']}} +

    + +

    + : {{layer['type']}} +

    + +

    + : {{layer['projection']}} +

    + +

    + : {{layer['connection']}} +

    + +

    + : {{layer['connectiontype']}} +

    + +

    + : {{layer['data']}} +

    + +

    + : {{layer['filter']}} +

    + +

    + +

    {{layer['layer_def']}}
    +

    + +

    + +

    {{layer['meta_def']}}
    +

    + +

    + + {% for class in layer['classes'] %} +

    {{class}}
    + {% endfor %} +

    +
    +
    +
    + +{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/process.volt b/pilotage/app/views/mapfile/process.volt new file mode 100644 index 00000000..8fdf4b62 --- /dev/null +++ b/pilotage/app/views/mapfile/process.volt @@ -0,0 +1,62 @@ +partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 4 de 4")) ?> + +
    +
    +
    + Précédent + +
    + +

    Contexte

    + +
    + +
    + + +
    +
    + + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + + +{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/retro.volt b/pilotage/app/views/mapfile/retro.volt new file mode 100644 index 00000000..2b715842 --- /dev/null +++ b/pilotage/app/views/mapfile/retro.volt @@ -0,0 +1,17 @@ +partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 1 de 4")) ?> + +
    +
    +
    + Précédent + +
    + +
    + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/pilotage/app/views/mapfile/select.volt b/pilotage/app/views/mapfile/select.volt new file mode 100644 index 00000000..ff0fbcdb --- /dev/null +++ b/pilotage/app/views/mapfile/select.volt @@ -0,0 +1,164 @@ +partial("commun/titre", array("titre" =>"Rétroingénierie d'un mapfile - étape 3 de 4")) ?> + +
    +
    +
    + Précédent + +
    + + {% if nNewLayers == 1 %} +

    {{nNewLayers}} nouvelle couche a été trouvée.

    + {% else %} +

    {{nNewLayers}} nouvelles couches ont été trouvées.

    + {% endif %} + + {% if nExistingLayers == 1 %} +

    {{nExistingLayers}} nouvelle couche existe déjà dans la base de données.

    + {% else %} +

    {{nExistingLayers}} couches existent déjà dans la base de données.

    + {% endif %} + + + + + + + + + + + + + + + {% for layer in layers %} + {% if layer['exists'] %} + + {% else %} + + {% endif %} + + + + + + + + + + + {% endfor %} + + +
    NomGroupe + Insérer / Remplacer + + Conserver + + Ignorer +
    + {{layer['name']}} (ouvrir)(fermer) + + + + {% if !layer['exists'] %} + + {% else %} + + {% endif %} + + {% if layer['exists'] %} + + {% else %} + + {% endif %} + + +
    +

    + : {{layer['name']}} +

    + +

    + : {{layer['group']}} +

    + +

    + : {{layer['minscaledenom']}} +

    + +

    + : {{layer['maxscaledenom']}} +

    + +

    + : {{layer['labelminscaledenom']}} +

    + +

    + : {{layer['labelmaxscaledenom']}} +

    + +

    + : {{layer['type']}} +

    + +

    + : {{layer['projection']}} +

    + +

    + : {{layer['connection']}} +

    + +

    + : {{layer['connectiontype']}} +

    + +

    + : {{layer['data']}} +

    + +

    + : {{layer['filter']}} +

    + +

    + +

    {{layer['layer_def']}}
    +

    + +

    + +

    {{layer['meta_def']}}
    +

    + +

    + + {% for class in layer['classes'] %} +

    {{class}}
    + {% endfor %} +

    +
    +
    +
    + +{{ javascript_include("js/mapfileRetro.js") }} diff --git a/pilotage/app/views/mapfile/validate.volt b/pilotage/app/views/mapfile/validate.volt new file mode 100644 index 00000000..98abbc64 --- /dev/null +++ b/pilotage/app/views/mapfile/validate.volt @@ -0,0 +1,135 @@ +
    +
    +
    + Précédent + +
    + + {% if nNewLayers == 1 %} +

    {{nNewLayers}} nouvelle couche a été trouvée.

    + {% else %} +

    {{nNewLayers}} nouvelles couches ont été trouvées.

    + {% endif %} + + {% if nExistingLayers == 1 %} +

    {{nExistingLayers}} nouvelle couche existe déjà.

    + {% else %} +

    {{nExistingLayers}} couches existent déjà.

    + {% endif %} + + + + + + + + + + + + + {% for layer in layers %} + {% if layer['exists'] %} + + {% else %} + + {% endif %} + + + + + + + + + {% endfor %} + + +
    Nom + Insérer / Remplacer + + Ignorer +
    + {{layer['name']}} + + {% if !layer['exists'] %} + + {% else %} + + {% endif %} + + {% if layer['exists'] %} + + {% else %} + + {% endif %} +
    +

    + : {{layer['name']}} +

    + +

    + : {{layer['group']}} +

    + +

    + : {{layer['minscaledenom']}} +

    + +

    + : {{layer['maxscaledenom']}} +

    + +

    + : {{layer['labelminscaledenom']}} +

    + +

    + : {{layer['labelmaxscaledenom']}} +

    + +

    + : {{layer['type']}} +

    + +

    + : {{layer['projection']}} +

    + +

    + : {{layer['connection']}} +

    + +

    + : {{layer['connectiontype']}} +

    + +

    + : {{layer['data']}} +

    + +

    + : {{layer['filter']}} +

    + +

    + +

    {{layer['layer_def']}}
    +

    + +

    + +

    {{layer['meta_def']}}
    +

    + +

    + + {% for class in layer['classes'] %} +

    {{class}}
    + {% endfor %} +

    +
    +
    +
    + +{{ javascript_include("js/mapfileRetro.js") }} \ No newline at end of file diff --git a/pilotage/app/views/menu/info.volt b/pilotage/app/views/menu/info.volt new file mode 100644 index 00000000..d3b25309 --- /dev/null +++ b/pilotage/app/views/menu/info.volt @@ -0,0 +1,33 @@ + +(.*).*$%ms','$1',$pinfo); +echo '
    ' . $pinfo . '
    ' ; + + +?> \ No newline at end of file diff --git a/pilotage/app/views/menu/menu.volt b/pilotage/app/views/menu/menu.volt new file mode 100644 index 00000000..b5cfa19c --- /dev/null +++ b/pilotage/app/views/menu/menu.volt @@ -0,0 +1,76 @@ + + diff --git a/pilotage/app/views/profil_et_permission/do.phtml b/pilotage/app/views/profil_et_permission/do.phtml new file mode 100644 index 00000000..a053b602 --- /dev/null +++ b/pilotage/app/views/profil_et_permission/do.phtml @@ -0,0 +1,5 @@ +getContent(); ?> + +view->includeCTL("igo_profil","search?id=".$id); ?> + +view->includeFrame($baseUri."/igo_permission","search?profil_id=".$id); ?> diff --git a/pilotage/app/views/profil_et_utilisateur/do.phtml b/pilotage/app/views/profil_et_utilisateur/do.phtml new file mode 100644 index 00000000..8ea07b99 --- /dev/null +++ b/pilotage/app/views/profil_et_utilisateur/do.phtml @@ -0,0 +1,6 @@ + getContent(); ?> + +view->includeCTL("igo_profil","search?id=".$id); ?> +view->includeFrame($baseUri."/igo_utilisateur_profil","search?profil_id=".$id); ?> + + diff --git a/pilotage/app/views/utilisateur_et_profil/do.phtml b/pilotage/app/views/utilisateur_et_profil/do.phtml new file mode 100644 index 00000000..7ac9758e --- /dev/null +++ b/pilotage/app/views/utilisateur_et_profil/do.phtml @@ -0,0 +1,5 @@ + getContent(); ?> + +view->includeCTL("igo_utilisateur","search?id=".$id); ?> + +view->includeCTL("igo_utilisateur_profil","search?utilisateur_id=".$id,$r_controller); ?> \ No newline at end of file diff --git a/pilotage/index.html b/pilotage/index.html new file mode 100644 index 00000000..bc0b4f14 --- /dev/null +++ b/pilotage/index.html @@ -0,0 +1 @@ +

    Mod-Rewrite is not enabled

    Please enable rewrite module on your web server to continue \ No newline at end of file diff --git a/pilotage/public/.htaccess b/pilotage/public/.htaccess new file mode 100644 index 00000000..fcf1d37e --- /dev/null +++ b/pilotage/public/.htaccess @@ -0,0 +1,8 @@ +AddDefaultCharset UTF-8 + + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + \ No newline at end of file diff --git a/pilotage/public/css/ZeroClipboard.css b/pilotage/public/css/ZeroClipboard.css new file mode 100644 index 00000000..cadf5c46 --- /dev/null +++ b/pilotage/public/css/ZeroClipboard.css @@ -0,0 +1,5 @@ +body { font-family:arial,sans-serif; font-size:9pt; } + +.my_clip_button { width:150px; text-align:center; border:1px solid black; background-color:#ccc; margin:10px; padding:10px; cursor:default; font-size:9pt; } +.my_clip_button.hover { background-color:#eee; } +.my_clip_button.active { background-color:#aaa; } \ No newline at end of file diff --git a/pilotage/public/css/arborescence/img/check-complet-gris.png b/pilotage/public/css/arborescence/img/check-complet-gris.png new file mode 100644 index 0000000000000000000000000000000000000000..1e09f1af192e1f75dfa42aae7cfd333fa638e4cd GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)6Oa`0mJkI}Ea{HEjtmSN`?>!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%_IkQFhG+z@ov@p$*+IZneQW%q z`e)8ehsvTj0yhL+h;sSBcv0f0+lG*wVxdcG)ME3t8b3d<;k(KC;?U67yH0JFXiJ>6 z>`399=RYm_d@tYm!gH9xN#Oo>$zAKBr=_YVHV7Oky}K>9d(j4+*K5>0g#?-``hu^Q zPD^#y>{1eFy0I;GTI#H2?wUN#0*CIa=4mh0tNJmw?Acp v#N7XAlmDGT@x->=%O+oI|68=Eay;ZTEA`wsIYFWs=n)1_S3j3^P6!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%4tlychG+z@onXz?93bGTzE!(W zHnK_jBvXu!mbGq+#tn@OU8Nt5KRT0?Z*=AQIn7$`IX!sq%<6=S?^|@dLqlKhI%RI+ zd$~0Bk;S>sHM5p2%Y3Kx*g{CLE-DgKFlv@JCbP0l+XkKk^gaR literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/img/check-disabled.png b/pilotage/public/css/arborescence/img/check-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6c03595361044c22cd19ffd4809671eda7bb3a GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZ7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~uBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpoCP3 zYeY$Kep*R+Vo@qXKw@TIiJqTph(ejMo~fRpq5EeibD*kAo-U3d8o{{}_Hwlt2(%P0 z?SHU(KI2wF>4Rz$ysV>L1Kx;yWEU0Xv(d@l!^&UmH}TDznw)7i-)i6Q;#1!}d0FPJ zb(=To{N7jpKl8TP7XikE$Y}?)vt}Lpyk}ePMfL-iOlo6IeJ4M*m{WXuQvh>9q0IW% zyL7ncezy6&@BbgIE~S!5DwYZ%hYdV5KYB^Dxo{|6XlIZSNK0a7*_JE(aMwGFK5-5; z4yG=}%O0#LT=By}Z;C1rt33 zJ=4@yqg0@p^`0({AsWF`Cv4WzyE9dujDj=RjS^sbDKH30@jAcuzcVCEyU`| z5k6b*PxowD_HJ62J@5H-c>zTZ_t4PKHs!J9_l!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%j(WN{hG+zrUf9dkY#`D4u;iQ9 z9)JBMlV|feiN^4}&{6uqd^PH*Yk}zXeQRBPvd&L=Vk5Bcz0vvN(9qMHIyOtRCC*yb z@z~=0=R%p;%XY4oY-{9FXi|7^sdTQI&S|Fr#+K)mxwpk!3tc!Ssc?!q>{u6ly>wct z^(~f(K|zcyk1bLomu2o+7+cV>sDo?4g2fi@vn(9{MlUVO; z{owKSp0IFhV#V(x-)rAGunN51<#+kY_rIUjZGsr%-bw}>`o`oO3iJ?zr>mdKI;Vst E06$rHh5!Hn literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/img/check-partiel.png b/pilotage/public/css/arborescence/img/check-partiel.png new file mode 100644 index 0000000000000000000000000000000000000000..b7589dce02d7e7be09a4172b0cf22c612628bd3d GIT binary patch literal 322 zcmV-I0lof-P)H;LN@>a0MkiCK~yMH zb&xv>gFqBTC$%ea9a(}KaY?D{v=E|TqoB2j;0K~Hij80^wmH#Y;>6rSoH>X0n0p$> zu_%gZn#55QMNw5%gkhMbY2Wu%Ro(XKx(b%707*qoM6N<$g6Ca+IsgCw literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/img/check.png b/pilotage/public/css/arborescence/img/check.png new file mode 100644 index 0000000000000000000000000000000000000000..da6150c7e971003dbd69e7293aef21297abf4746 GIT binary patch literal 410 zcmV;L0cHM)P)H;LN@>a0V_#FK~yMH zZIHW)gFqOCXKUZYw~!46KEIE)|ZGDflWY&MNA=zkc+p7myNPTSX)WE zXOm*r-JD|h=Re<^`Db3bu1nLj?|br06h+ZAO>F!Fpp*EH>651`d*wcT#xI7S}cayp$* zJcK4J00halZNJ@x{htCBev#a6x9jzapMC!)G+_bw0o)TdGZ-2eap07*qoM6N<$ Eg61Hv1poj5 literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/img/legende-coche.png b/pilotage/public/css/arborescence/img/legende-coche.png new file mode 100644 index 0000000000000000000000000000000000000000..b243267f0e97cf6fb117448457cf12fd9629dc18 GIT binary patch literal 488 zcmVP)H;LN@>a0eMM8K~y+T zwUj%H!ax*-cYm5Fv9+_Xu}LWi`U|uZwDnJ@h2R503r!Ie!FQs>Hx{C)EsuLH?7|Y+ zS=VgfkYVP`$GLZsc?a<3>qDTQ@)ai4`kC$_@Or(X*XyC#Z2l;ET-W_zd~ca2A&ukl z7^l<8qvP?2)oLa4^w6sWHX02a4hLK=7mp0XKq{5OU@*XbzX!caV6|GsdcF3f8xDtv z$KwcvLWsp;FijKmDuI2?(^xK-;-U9fz<$4vWHKp`NF;)AI4omb*TK>^o6U2;(P$*8 zn1~=M8jYgU=?Ls;Aj@GNGnouDO_PMBQb~IHXCOE7FmkyZ^7;H1=xJcRUPrgv#e6=O zKJhfC)2WO<#Wi~9RUQhVXMyWMa;pXE>3?RF2vHG1e(0$;s- e{{Q-VHQ^nqs*qSo9@G#30000H;LN@>a0Rc%wK~y+T z-IP0ug)kU}XV&Ht+=vTsF;;e32tKe;&{{-L1m9vK*jt{Ve6duQcEXxo@(aVq_`?DaaLV{IQVcRzJeUGl|q^#>I7_v%X z7>3}4X_{b~CJe)nLKzvdN}=a@7={6LT|?J(XqqM^&vU_$RSI3#MccM0%krr(O;f>; zRSF%)LDMuSisGp-NfN=3{YOIXk!{z+qI+72Ye)Js||9nFBfbVP9h37J+c3yq;#!u_c zHeSz33LH(RCn)~Dbzz}%lWSl?q}Z0+?q!*LGoMEqq)c_X|NWqNTcX4L@5>*ypU`UU zd%WPa)s)mujjko0mqS1bZf^^`Zu-flJ#*HjBZWE=o4gjLMy^=J6*-M_W}<}uL*p{P zwl~L}BB#f5pa1tT{LpIIw6~8{vxSScS!|GzE>q;rPPsSBnJ-78tspl1$Y-0EwvwAp z#oqfa`+8T>EVZ7;8ob#lKzsMkv-@wqukP&!MkD7r*UC5~xPc+S;OXk;vd$@?2>_(_ BlaK%a literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/img/uncheck.png b/pilotage/public/css/arborescence/img/uncheck.png new file mode 100644 index 0000000000000000000000000000000000000000..751e143d93aef78189bb2315295062c66b1a3833 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)6Oa`0mJkI}Ea{HEjtmSN`?>!lvI6;1C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiDhKBB+oy>u%dOcknLo|ZVPT0uDq$t38eU|;h z`wJBWg}i<+aanK$C~j1^6u0i{(N9zEtxQOFGK+aO=k~U@zy0uSuO8Wq1WK# zaBRlC-`R{JOhH~(qr&wa6%{m7&;8uTz{SX^8058`HGt!v(WNNs=Se*`KC-k0aIBb; xw03XZfxjgUhr%xw$|Uz(yY-lxXQ99zMhDHpV4ePpi-8Vf@O1TaS?83{1OQD$Sl$2t literal 0 HcmV?d00001 diff --git a/pilotage/public/css/arborescence/tree.css b/pilotage/public/css/arborescence/tree.css new file mode 100644 index 00000000..de326e7f --- /dev/null +++ b/pilotage/public/css/arborescence/tree.css @@ -0,0 +1,255 @@ +/* +Inspiré de https://github.com/grokys/css-treeview +Couleurs des .wrap-* provenant de http://colorbrewer2.org/?type=qualitative&scheme=Paired&n=12 +*/ +/* + Created on : 2014-03-10 14:00:00 + Author : Nicolas Brisebois-Tétreault +*/ + +body.wait *, body.wait{ + cursor: wait !important; +} + +/* Don't display bullets. */ +.css-treeview { + list-style: none; + line-height: 2em; +} +/* Align the label and provide a pointer cursor. */ +.css-treeview label { + display: inline; + vertical-align: middle; + font-weight:normal; +} +/* Highlight selected nodes. +.css-treeview label.selected { + background-color: #08C; + color: white; + padding: 2px; +}*/ +/* Hide child nodes of an unchecked expander. */ +.css-treeview input.expander ~ ul { + display: none; +} +/* Show child nodes of a checked expander. */ +.css-treeview input.expander:checked ~ ul { + display: block; +} +/* Hide the expander checkbox. */ +.css-treeview input.expander { + position: absolute; + opacity: 0; +} +/* Don't change the cursor for disabled expanders. */ +.css-treeview input.expander:disabled { + cursor: default +} +/* Remove the margin from actual checkboxes. */ +.css-treeview input.check { + margin: 0; +} + +/* Before a disabled node's expander span, add a blank 20px padding */ +.css-treeview input.expander:disabled + span.expander::before { + content: ''; + padding-right: 20px; +} +/* Before an unexpanded node's expander span, display the '>' expand icon */ +.css-treeview input.expander:enabled + span.expander::before { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAHtJREFUSEvtlEsKwCAMRHP/S6fYUhDsfETSQnEhrvIcM5NEZsbKWSpuD9cB4mTr70EFDeBAJEBBLACD2AAEeQ+AHLEUMDslQGWBAlRxbZSd17eCa9TrFso3LtxbSN29uqEHM8WwiQjy1Bc5jWq5UhtV8R9z4KaP5mAWcgD5xILE2Y3q1wAAAABJRU5ErkJggg=='); + background-position: 0 0; + content: ''; + padding-right: 20px; +} +/* Before an expanded node's expander span, display the 'V' expanded icon */ +.css-treeview input.expander:checked:enabled + span.expander::before { + background-position: 1px 16px; +} +.wrap { + padding: 2px; + margin: 0; + width: 20px; + height: 20px; +} +.css-treeview .wrap input { + margin: 3px 3px 3px 4px; +} + +.legende{ + width:20px; + height:20px; + background-repeat:no-repeat; + background-position: 5px 3px; +} + +.legende li{ + background-color:#eee; +} + +.wrap-visible, +.legende-visible{ + background-color: #a6cee3; +} +.wrap-active, +.legende-active { + background-color: #b2df8a; +} +.wrap-lecture, +.legende-lecture{ + background-color: #1f78b4; +} +.wrap-analyse, +.legende-analyse { + background-color: #b15928; +} + +.wrap-ecriture, +.legende-ecriture{ + background-color: #4daf4a; +} +.wrap-export, +.legende-export{ + background-color: #984ea3; +} +.wrap-association, +.legende-association{ + background-color: #fb9a99; +} +.legende-coche{ + background-image: url('img/check.png'); +} + +.legende-partiel{ + background-image: url('img/check-partiel.png'); +} +.legende-partiel-gris{ + background-image: url('img/check-partiel-gris.png'); +} +.legende-complet{ + background-image: url('img/check-complet.png'); +} +.legende-complet-gris{ + background-image: url('img/check-complet-gris.png'); +} +.legende-exclu{ + background-image: url('img/check-exclu.png'); +} + +input.exclu{ + margin-right:10px; +} +.lien-couche, +.lien-groupe{ + margin-left:10px; +} + +.conteneur-legende{ + text-align: left; + padding-bottom:2em; + background-color:#eee; +} +.conteneur-legende ul{ + list-style-type: none; + padding:0; + margin:0; +} +.conteneur-legende li{ + padding:5px 0; + +} +.conteneur-legende span.legende{ + margin-right:5px; + padding: 2px 10px; +} +.conteneur-legende span.glyphicon{ + cursor:help; +} + +/* + Cache les cases à cocher et les remplaces par des images + :not(#foo) > La personalisation ne fonctionne pas sur les vieux navigateurs +*/ +:not(#foo) > input.check { + opacity: 0;/* Cacher la cch, qui demeure clicable */ + display:none; + width: 18px; +} + +:not(#foo) > input.check + label { + margin: 0; + clear: none; + margin:0 0 0 5px; + padding: 5px 0 4px 16px;/* Laisser de l'espace pour l'image*/ + cursor: pointer; + background: url('img/uncheck.png') left center no-repeat; +} + +:not(#foo) > input.check:checked + label { + background-image: url('img/check.png'); +} + +:not(#foo) > input.check:checked:disabled + label { + background-image: url('img/check-disabled.png'); + cursor:no-drop; +} + +:not(#foo) > input.check-complet + label{ + + background-image: url('img/check-complet.png'); +} + +:not(#foo) > input.check-complet-gris + label{ + + background-image: url('img/check-complet-gris.png'); +} + +:not(#foo) > input.check-partiel + label{ + background-image: url('img/check-partiel.png'); +} + +:not(#foo) > input.check-partiel-gris + label{ + background-image: url('img/check-partiel-gris.png'); +} + + +:not(#foo) > input.check-exclu + label{ + background-image: url('img/check-exclu.png'); +} + +.css-treeview .action{ + cursor:pointer; + margin:0 5px; + padding:0 5px; +} + +.css-treeview .action-deplacer{ + font-weight:bold; + font-size:16px; +} + +.afficher{ + display:visible; +} + +.masquer{ + display:none; +} + + .ui-state-highlight { + height: 1.5em; + line-height: 1.2em; + display: visible; + border-style: dotted; + border-color:grey; + width:200px; + } + + .exclu .libelle{ + text-decoration:line-through; + } + + :not(#foo) > .exclu .check.visible + label { + background-image: url('img/check-exclu.png'); + } + \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-listTree.css b/pilotage/public/css/bootstrap-listTree.css new file mode 100644 index 00000000..1cc367ce --- /dev/null +++ b/pilotage/public/css/bootstrap-listTree.css @@ -0,0 +1,75 @@ +/* + * Copyright 2012 Clay Walker + * Licensed under GPLv2 ONLY + */ +.listTree { + margin-bottom: 18px; +} + +.listTree i { + float: right; + margin-right: 15px; +} + +.listTree ul { + margin: 0; +} + +.listTree li { + list-style-type: none; + cursor: pointer; +} + +.listTree > ul > li { + background-color: #eee; + border-width: 1px 1px 0 1px; + border-style: solid; + border-color: #ddd; +} + +.listTree > ul > li:first-child { + border-width: 1px 1px 0 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.listTree > ul > li:last-child { + border-width: 1px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.listTree > ul > li:last-child > ul > li:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.listTree span { + display: inline-block; + width: 100%; + padding: 5px; +} + +.listTree > ul > li > span { + font-weight: bold; +} + +.listTree > ul > li > ul > li { + background-color: #fff; + border-width: 1px 0 0 0; + border-style: solid; + border-color: #ddd; + padding-left: 10px; +} + +.listTree > ul > li > ul > li:first-child { + border-width: 1px 0 0 0; +} + +.listTree > ul > li > ul > li:last-child { + border-width: 1px 0 0 0; +} + +.listTree input[type="checkbox"] { + margin-top: 0; +} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-theme.css b/pilotage/public/css/bootstrap-theme.css new file mode 100644 index 00000000..df2d3d96 --- /dev/null +++ b/pilotage/public/css/bootstrap-theme.css @@ -0,0 +1,397 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn:active, +.btn.active { + background-image: none; +} + +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} + +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} + +.btn-primary { + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); + background-repeat: repeat-x; + border-color: #2b669a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus { + background-color: #2d6ca2; + background-position: 0 -15px; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #2d6ca2; + border-color: #2b669a; +} + +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + background-repeat: repeat-x; + border-color: #3e8f3e; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} + +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} + +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + background-repeat: repeat-x; + border-color: #e38d13; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} + +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + background-repeat: repeat-x; + border-color: #b92c28; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} + +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + background-repeat: repeat-x; + border-color: #28a4c9; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} + +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} + +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #357ebd; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); +} + +.navbar-default { + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + background-repeat: repeat-x; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} + +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} + +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} + +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); + background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} + +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + background-repeat: repeat-x; + border-color: #b2dba1; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); +} + +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + background-repeat: repeat-x; + border-color: #9acfea; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); +} + +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + background-repeat: repeat-x; + border-color: #f5e79e; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); +} + +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + background-repeat: repeat-x; + border-color: #dca7a7; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); +} + +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); +} + +.progress-bar { + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); +} + +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); +} + +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); +} + +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); +} + +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); +} + +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #3071a9; + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + background-repeat: repeat-x; + border-color: #3278b3; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); +} + +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} + +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); +} + +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); +} + +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); +} + +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); +} + +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); +} + +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + background-repeat: repeat-x; + border-color: #dcdcdc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap-theme.min.css b/pilotage/public/css/bootstrap-theme.min.css new file mode 100644 index 00000000..c7b6d39b --- /dev/null +++ b/pilotage/public/css/bootstrap-theme.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.css b/pilotage/public/css/bootstrap.css new file mode 100644 index 00000000..377dff30 --- /dev/null +++ b/pilotage/public/css/bootstrap.css @@ -0,0 +1,7118 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a { + background: transparent; +} + +a:focus { + outline: thin dotted; +} + +a:active, +a:hover { + outline: 0; +} + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +mark { + color: #000; + background: #ff0; +} + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +pre { + white-space: pre-wrap; +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +legend { + padding: 0; + border: 0; +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100%; +} + +button, +input { + line-height: normal; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + box-sizing: border-box; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #428bca; + text-decoration: none; +} + +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} + +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + height: auto; + max-width: 100%; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} + +h1 small, +h2 small, +h3 small, +h1 .small, +h2 .small, +h3 .small { + font-size: 65%; +} + +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} + +h4 small, +h5 small, +h6 small, +h4 .small, +h5 .small, +h6 .small { + font-size: 75%; +} + +h1, +.h1 { + font-size: 36px; +} + +h2, +.h2 { + font-size: 30px; +} + +h3, +.h3 { + font-size: 24px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 14px; +} + +h6, +.h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 200; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +cite { + font-style: normal; +} + +.text-muted { + color: #999999; +} + +.text-primary { + color: #428bca; +} + +.text-primary:hover { + color: #3071a9; +} + +.text-warning { + color: #8a6d3b; +} + +.text-warning:hover { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +.text-danger:hover { + color: #843534; +} + +.text-success { + color: #3c763d; +} + +.text-success:hover { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +.text-info:hover { + color: #245269; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +.list-inline > li:first-child { + padding-left: 0; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.428571429; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote p:last-child { + margin-bottom: 0; +} + +blockquote small, +blockquote .small { + display: block; + line-height: 1.428571429; + color: #999999; +} + +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small, +blockquote.pull-right .small { + text-align: right; +} + +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} + +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +blockquote:before, +blockquote:after { + content: ""; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.row { + margin-right: -15px; + margin-left: -15px; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-11 { + width: 91.66666666666666%; +} + +.col-xs-10 { + width: 83.33333333333334%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-8 { + width: 66.66666666666666%; +} + +.col-xs-7 { + width: 58.333333333333336%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-5 { + width: 41.66666666666667%; +} + +.col-xs-4 { + width: 33.33333333333333%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-2 { + width: 16.666666666666664%; +} + +.col-xs-1 { + width: 8.333333333333332%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-pull-11 { + right: 91.66666666666666%; +} + +.col-xs-pull-10 { + right: 83.33333333333334%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-8 { + right: 66.66666666666666%; +} + +.col-xs-pull-7 { + right: 58.333333333333336%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-5 { + right: 41.66666666666667%; +} + +.col-xs-pull-4 { + right: 33.33333333333333%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-2 { + right: 16.666666666666664%; +} + +.col-xs-pull-1 { + right: 8.333333333333332%; +} + +.col-xs-pull-0 { + right: 0; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-push-11 { + left: 91.66666666666666%; +} + +.col-xs-push-10 { + left: 83.33333333333334%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-8 { + left: 66.66666666666666%; +} + +.col-xs-push-7 { + left: 58.333333333333336%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-5 { + left: 41.66666666666667%; +} + +.col-xs-push-4 { + left: 33.33333333333333%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-2 { + left: 16.666666666666664%; +} + +.col-xs-push-1 { + left: 8.333333333333332%; +} + +.col-xs-push-0 { + left: 0; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +.col-xs-offset-11 { + margin-left: 91.66666666666666%; +} + +.col-xs-offset-10 { + margin-left: 83.33333333333334%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-8 { + margin-left: 66.66666666666666%; +} + +.col-xs-offset-7 { + margin-left: 58.333333333333336%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-5 { + margin-left: 41.66666666666667%; +} + +.col-xs-offset-4 { + margin-left: 33.33333333333333%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-2 { + margin-left: 16.666666666666664%; +} + +.col-xs-offset-1 { + margin-left: 8.333333333333332%; +} + +.col-xs-offset-0 { + margin-left: 0; +} + +@media (min-width: 768px) { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-0 { + right: 0; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-0 { + left: 0; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 992px) { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-0 { + right: 0; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-0 { + left: 0; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-0 { + right: 0; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-0 { + left: 0; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} + +table { + max-width: 100%; + background-color: transparent; +} + +th { + text-align: left; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} + +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} + +table td[class*="col-"], +table th[class*="col-"] { + display: table-cell; + float: none; +} + +.table > thead > tr > .active, +.table > tbody > tr > .active, +.table > tfoot > tr > .active, +.table > thead > .active > td, +.table > tbody > .active > td, +.table > tfoot > .active > td, +.table > thead > .active > th, +.table > tbody > .active > th, +.table > tfoot > .active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > .active:hover, +.table-hover > tbody > .active:hover > td, +.table-hover > tbody > .active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > .success, +.table > tbody > tr > .success, +.table > tfoot > tr > .success, +.table > thead > .success > td, +.table > tbody > .success > td, +.table > tfoot > .success > td, +.table > thead > .success > th, +.table > tbody > .success > th, +.table > tfoot > .success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > .success:hover, +.table-hover > tbody > .success:hover > td, +.table-hover > tbody > .success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > .danger, +.table > tbody > tr > .danger, +.table > tfoot > tr > .danger, +.table > thead > .danger > td, +.table > tbody > .danger > td, +.table > tfoot > .danger > td, +.table > thead > .danger > th, +.table > tbody > .danger > th, +.table > tfoot > .danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > .danger:hover, +.table-hover > tbody > .danger:hover > td, +.table-hover > tbody > .danger:hover > th { + background-color: #ebcccc; +} + +.table > thead > tr > .warning, +.table > tbody > tr > .warning, +.table > tfoot > tr > .warning, +.table > thead > .warning > td, +.table > tbody > .warning > td, +.table > tfoot > .warning > td, +.table > thead > .warning > th, +.table > tbody > .warning > th, +.table > tfoot > .warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > .warning:hover, +.table-hover > tbody > .warning:hover > td, +.table-hover > tbody > .warning:hover > th { + background-color: #faf2cc; +} + +@media (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #dddddd; + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} + +input[type="file"] { + display: block; +} + +select[multiple], +select[size] { + height: auto; +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-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-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.form-control:-moz-placeholder { + color: #999999; +} + +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #999999; +} + +.form-control::-webkit-input-placeholder { + color: #999999; +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle; +} + +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm { + height: 30px; + line-height: 30px; +} + +textarea.input-sm { + height: auto; +} + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-lg { + height: 46px; + line-height: 46px; +} + +textarea.input-lg { + height: auto; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} + +.form-control-static { + margin-bottom: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline select.form-control { + width: auto; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-control-static { + padding-top: 7px; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} + +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default .badge { + color: #ffffff; + background-color: #fff; +} + +.btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} + +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary .badge { + color: #428bca; + background-color: #fff; +} + +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} + +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} + +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} + +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} + +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} + +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} + +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #39b3d7; + border-color: #269abc; +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} + +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-link { + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} + +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} + +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} + +.collapse.in { + display: block; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon:empty { + width: 1em; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #428bca; + outline: 0; +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar .btn-group { + float: left; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group > .btn { + float: none; +} + +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed; +} + +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} + +.btn-group-justified > .btn-group .btn { + width: 100%; +} + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} + +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + white-space: nowrap; +} + +.input-group-btn:first-child > .btn { + margin-right: -1px; +} + +.input-group-btn:last-child > .btn { + margin-left: -1px; +} + +.input-group-btn > .btn { + position: relative; +} + +.input-group-btn > .btn + .btn { + margin-left: -4px; +} + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav > li { + position: relative; + display: block; +} + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li.disabled > a { + color: #999999; +} + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #428bca; +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} + +.nav-tabs.nav-justified > li { + float: none; +} + +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + +.nav-pills > li > a { + border-radius: 4px; +} + +.nav-pills > li + li { + margin-left: 2px; +} + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #428bca; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified { + width: 100%; +} + +.nav-justified > li { + float: none; +} + +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified { + border-bottom: 0; +} + +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse.in { + overflow-y: auto; +} + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} + +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} + +@media (min-width: 768px) { + .navbar > .container .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} + +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -15px; +} + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} + +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form select.form-control { + width: auto; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} + +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -15px; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} + +.navbar-default .navbar-brand { + color: #777777; +} + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} + +.navbar-default .navbar-text { + color: #777777; +} + +.navbar-default .navbar-nav > li > a { + color: #777777; +} + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} + +.navbar-default .navbar-toggle { + border-color: #dddddd; +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #777777; +} + +.navbar-default .navbar-link:hover { + color: #333333; +} + +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} + +.navbar-inverse .navbar-brand { + color: #999999; +} + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} + +.navbar-inverse .navbar-toggle { + border-color: #333333; +} + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #ffffff; + background-color: #080808; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; +} + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #cccccc; + content: "/\00a0"; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} + +.pagination > li { + display: inline; +} + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #eeeeee; +} + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + cursor: default; + background-color: #428bca; + border-color: #428bca; +} + +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; + border-color: #dddddd; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} + +.label-primary { + background-color: #428bca; +} + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #3071a9; +} + +.label-success { + background-color: #5cb85c; +} + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; + border-radius: 10px; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #428bca; + background-color: #ffffff; +} + +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eeeeee; +} + +.jumbotron h1, +.jumbotron .h1 { + line-height: 1; + color: inherit; +} + +.jumbotron p { + line-height: 1.4; +} + +.container .jumbotron { + border-radius: 6px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.thumbnail > img, +.thumbnail a > img { + display: block; + height: auto; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #428bca; +} + +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} + +.alert h4 { + margin-top: 0; + color: inherit; +} + +.alert .alert-link { + font-weight: bold; +} + +.alert > p, +.alert > ul { + margin-bottom: 0; +} + +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable { + padding-right: 35px; +} + +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success hr { + border-top-color: #c9e2b3; +} + +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info hr { + border-top-color: #a6e1ec; +} + +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.alert-warning hr { + border-top-color: #f7e1b5; +} + +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.alert-danger hr { + border-top-color: #e4b9c0; +} + +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #428bca; + -webkit-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-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar { + 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: 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-size: 40px 40px; +} + +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} + +.progress-striped .progress-bar-success { + 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: 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); +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-striped .progress-bar-info { + 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: 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); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-striped .progress-bar-warning { + 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: 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); +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.progress-striped .progress-bar-danger { + 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: 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); +} + +.media, +.media-body { + overflow: hidden; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + padding-left: 0; + margin-bottom: 20px; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.list-group-item > .badge { + float: right; +} + +.list-group-item > .badge + .badge { + margin-right: 5px; +} + +a.list-group-item { + color: #555555; +} + +a.list-group-item .list-group-item-heading { + color: #333333; +} + +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +a.list-group-item.active .list-group-item-heading, +a.list-group-item.active:hover .list-group-item-heading, +a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} + +a.list-group-item.active .list-group-item-text, +a.list-group-item.active:hover .list-group-item-text, +a.list-group-item.active:focus .list-group-item-text { + color: #e1edf7; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel > .list-group { + margin-bottom: 0; +} + +.panel > .list-group .list-group-item { + border-width: 1px 0; +} + +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table { + margin-bottom: 0; +} + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid #dddddd; +} + +.panel > .table > tbody:first-child th, +.panel > .table > tbody:first-child td { + border-top: 0; +} + +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} + +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} + +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} + +.panel > .table-bordered > thead > tr:last-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-bordered > thead > tr:last-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; +} + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} + +.panel-title > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 4px; +} + +.panel-group .panel + .panel { + margin-top: 5px; +} + +.panel-group .panel-heading { + border-bottom: 0; +} + +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} + +.panel-group .panel-footer { + border-top: 0; +} + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} + +.panel-default { + border-color: #dddddd; +} + +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} + +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} + +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} + +.panel-primary { + border-color: #428bca; +} + +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #428bca; +} + +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #428bca; +} + +.panel-success { + border-color: #d6e9c6; +} + +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} + +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-warning { + border-color: #faebcc; +} + +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #faebcc; +} + +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} + +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #ebccd1; +} + +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #ebccd1; +} + +.panel-info { + border-color: #bce8f1; +} + +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} + +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-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); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll; +} + +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-dialog { + position: relative; + z-index: 1050; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} + +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.428571429; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +@media screen and (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; + content: " "; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; + content: " "; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; + content: " "; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; + content: " "; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + height: auto; + max-width: 100%; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + outline: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} + +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; +} + +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; +} + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} + +.carousel-control .icon-prev:before { + content: '\2039'; +} + +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #ffffff; + border-radius: 10px; +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #ffffff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} + +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicons-chevron-left, + .carousel-control .glyphicons-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} + +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} + +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; + visibility: hidden !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} + +.visible-xs, +tr.visible-xs, +th.visible-xs, +td.visible-xs { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + table.visible-xs.visible-sm { + display: table; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + table.visible-xs.visible-md { + display: table; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + table.visible-xs.visible-lg { + display: table; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} + +.visible-sm, +tr.visible-sm, +th.visible-sm, +td.visible-sm { + display: none !important; +} + +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + table.visible-sm.visible-xs { + display: table; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + table.visible-sm.visible-md { + display: table; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + table.visible-sm.visible-lg { + display: table; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} + +.visible-md, +tr.visible-md, +th.visible-md, +td.visible-md { + display: none !important; +} + +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + table.visible-md.visible-xs { + display: table; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + table.visible-md.visible-sm { + display: table; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + table.visible-md.visible-lg { + display: table; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} + +.visible-lg, +tr.visible-lg, +th.visible-lg, +td.visible-lg { + display: none !important; +} + +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + table.visible-lg.visible-xs { + display: table; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + table.visible-lg.visible-sm { + display: table; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + table.visible-lg.visible-md { + display: table; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} + +.hidden-xs { + display: block !important; +} + +table.hidden-xs { + display: table; +} + +tr.hidden-xs { + display: table-row !important; +} + +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-xs, + tr.hidden-xs, + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm, + tr.hidden-xs.hidden-sm, + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md, + tr.hidden-xs.hidden-md, + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-xs.hidden-lg, + tr.hidden-xs.hidden-lg, + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} + +.hidden-sm { + display: block !important; +} + +table.hidden-sm { + display: table; +} + +tr.hidden-sm { + display: table-row !important; +} + +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-sm.hidden-xs, + tr.hidden-sm.hidden-xs, + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm, + tr.hidden-sm, + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md, + tr.hidden-sm.hidden-md, + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-sm.hidden-lg, + tr.hidden-sm.hidden-lg, + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} + +.hidden-md { + display: block !important; +} + +table.hidden-md { + display: table; +} + +tr.hidden-md { + display: table-row !important; +} + +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-md.hidden-xs, + tr.hidden-md.hidden-xs, + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm, + tr.hidden-md.hidden-sm, + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md, + tr.hidden-md, + th.hidden-md, + td.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-md.hidden-lg, + tr.hidden-md.hidden-lg, + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} + +.hidden-lg { + display: block !important; +} + +table.hidden-lg { + display: table; +} + +tr.hidden-lg { + display: table-row !important; +} + +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-lg.hidden-xs, + tr.hidden-lg.hidden-xs, + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm, + tr.hidden-lg.hidden-sm, + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md, + tr.hidden-lg.hidden-md, + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-lg, + tr.hidden-lg, + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} + +.visible-print, +tr.visible-print, +th.visible-print, +td.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print, + tr.hidden-print, + th.hidden-print, + td.hidden-print { + display: none !important; + } +} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.min.css b/pilotage/public/css/bootstrap.min.css new file mode 100644 index 00000000..c547283b --- /dev/null +++ b/pilotage/public/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-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-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-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-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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: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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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: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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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: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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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: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)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-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)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/pilotage/public/css/bootstrap.override.css b/pilotage/public/css/bootstrap.override.css new file mode 100644 index 00000000..e06fc9b7 --- /dev/null +++ b/pilotage/public/css/bootstrap.override.css @@ -0,0 +1,184 @@ +body{ + background-color:#eee; + +} +.container{ + background-color:white; + min-width:1170px; +} + + +table td.overflow-visible { + overflow:visible; /* Permet aux .dropdown de s'afficher correctement*/ +} + +.table{ + background-color:white; +} + +.table-striped > tbody > tr > .danger, +.table-striped > tbody > .danger > td, +.table-striped > tbody > .danger > th { + background-color: #f2dede !important; +} + +.table-striped > tbody > tr > .warning, +.table-striped > tbody > .warning > td, +.table-striped > tbody > .warning > th { + background-color: #fcf8e3 !important; +} + +.table-bordered > thead > tr:last-child > th { + border-bottom-width: 0px !important; +} + +.form-horizontal .form-group { + margin-left: 0px; + margin-right: 0px; +} + +.glyphicon span { + padding-left:0.5em; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Formulaires */ +.oblig{ + color:red; + +} +.gestion_couche .tooltip-inner { + white-space:pre; + max-width:none; + text-align:left; +} + +.tooltip-inner .tab{ + padding-left:1em; + +} + +.tooltip-inner .actif{ + color:#41ab5d; +} + +form .row{ + margin-bottom:0.5em; +} + +@media screen and (max-width: 768px){ + + h3, + .text-right{ + text-align:left; + } +} +/*Fin Formulaires*/ + + +select { + height:26px; +} + + + .table-search{ + table-layout:fixed; + width:1155px; +} + +.table-search td{ + overflow:hidden; + text-overflow:ellipsis; +} +.table-search td.overflow-visible{ + overflow:visible; +} + +.table-search pre{ + max-height:200px; + overflow: hidden; + background-color:transparent; + border:none; +} + +.table-search .id{ + width:44px; + +} + +.table-search .est_visible{ + width:70px; +} + +.table-search .est_active{ + width:70px; +} + + +.table-search .est_lecture{ + width:60px; +} + +.table-search .est_analyse{ + width:60px; +} + +.table-search .est_ecriture{ + width:60px; +} + +.table-search .est_exportation{ + width:85px; +} + +.table-search .date_modif, +.table-search .date_chargement{ + width:180px; +} + +.table-search .connexion{ + width:600px; +} + +.table-search .voir{ + width:50px; +} + +.table-search .actions{ + width:100px; +} + +.table-search .description{ + width:115px; +} + +.table-search .proprietaire{ + width:85px; +} + +.table-search .ordre{ + width:70px; +} + +.table-search.table-search-igo_classe_entite .geometries{ + width:90px; +} + +.table-search.table-search-igo_classe_entite .catalogue-csw{ + max-width:100px; +} +.glyphicon-retour{ + //Inverser le sens de la flêche + -ms-transform: scale(-1,1); /* IE 9 */ + -webkit-transform: scale(-1,1); /* Chrome, Safari, Opera */ + transform: scale(-1,1); + margin-right:0.5em; +} + +.color-green{ + color:green; +} + +.color-red{ + color:red; +} diff --git a/pilotage/public/css/datepicker.css b/pilotage/public/css/datepicker.css new file mode 100644 index 00000000..05c1d8c9 --- /dev/null +++ b/pilotage/public/css/datepicker.css @@ -0,0 +1,204 @@ +/*! + * Datetimepicker for Bootstrap v3 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */ +.bootstrap-datetimepicker-widget { + top: 0; + left: 0; + width: 250px; + padding: 4px; + margin-top: 1px; + z-index: 99999 !important; + border-radius: 4px; +} +.bootstrap-datetimepicker-widget.timepicker-sbs { + width: 600px; +} +.bootstrap-datetimepicker-widget.bottom: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: 7px; +} +.bootstrap-datetimepicker-widget.bottom:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + top: -6px; + left: 8px; +} +.bootstrap-datetimepicker-widget.top:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: -7px; + left: 6px; +} +.bootstrap-datetimepicker-widget.top:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid white; + position: absolute; + bottom: -6px; + left: 7px; +} +.bootstrap-datetimepicker-widget .dow { + width: 14.2857%; +} +.bootstrap-datetimepicker-widget.pull-right:before { + left: auto; + right: 6px; +} +.bootstrap-datetimepicker-widget.pull-right:after { + left: auto; + right: 7px; +} +.bootstrap-datetimepicker-widget > ul { + list-style-type: none; + margin: 0; +} +.bootstrap-datetimepicker-widget .timepicker-hour, +.bootstrap-datetimepicker-widget .timepicker-minute, +.bootstrap-datetimepicker-widget .timepicker-second { + width: 100%; + font-weight: bold; + font-size: 1.2em; +} +.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator { + width: 4px; + padding: 0; + margin: 0; +} +.bootstrap-datetimepicker-widget .datepicker > div { + display: none; +} +.bootstrap-datetimepicker-widget .picker-switch { + text-align: center; +} +.bootstrap-datetimepicker-widget table { + width: 100%; + margin: 0; +} +.bootstrap-datetimepicker-widget td, +.bootstrap-datetimepicker-widget th { + text-align: center; + width: 20px; + height: 20px; + border-radius: 4px; +} +.bootstrap-datetimepicker-widget td.day:hover, +.bootstrap-datetimepicker-widget td.hour:hover, +.bootstrap-datetimepicker-widget td.minute:hover, +.bootstrap-datetimepicker-widget td.second:hover { + background: #eeeeee; + cursor: pointer; +} +.bootstrap-datetimepicker-widget td.old, +.bootstrap-datetimepicker-widget td.new { + color: #999999; +} +.bootstrap-datetimepicker-widget td.today { + position: relative; +} +.bootstrap-datetimepicker-widget td.today:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-bottom: 7px solid #428bca; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: 4px; + right: 4px; +} +.bootstrap-datetimepicker-widget td.active, +.bootstrap-datetimepicker-widget td.active:hover { + background-color: #428bca; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget td.active.today:before { + border-bottom-color: #fff; +} +.bootstrap-datetimepicker-widget td.disabled, +.bootstrap-datetimepicker-widget td.disabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget td span { + display: block; + width: 47px; + height: 54px; + line-height: 54px; + float: left; + margin: 2px; + cursor: pointer; + border-radius: 4px; +} +.bootstrap-datetimepicker-widget td span:hover { + background: #eeeeee; +} +.bootstrap-datetimepicker-widget td span.active { + background-color: #428bca; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget td span.old { + color: #999999; +} +.bootstrap-datetimepicker-widget td span.disabled, +.bootstrap-datetimepicker-widget td span.disabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget th.switch { + width: 145px; +} +.bootstrap-datetimepicker-widget th.next, +.bootstrap-datetimepicker-widget th.prev { + font-size: 21px; +} +.bootstrap-datetimepicker-widget th.disabled, +.bootstrap-datetimepicker-widget th.disabled:hover { + background: none; + color: #999999; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget thead tr:first-child th { + cursor: pointer; +} +.bootstrap-datetimepicker-widget thead tr:first-child th:hover { + background: #eeeeee; +} +.input-group.date .input-group-addon span { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} +.bootstrap-datetimepicker-widget.left-oriented:before { + left: auto; + right: 6px; +} +.bootstrap-datetimepicker-widget.left-oriented:after { + left: auto; + right: 7px; +} +.bootstrap-datetimepicker-widget ul.list-unstyled li div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td { + padding: 0px !important; +} \ No newline at end of file diff --git a/pilotage/public/css/main.css b/pilotage/public/css/main.css new file mode 100644 index 00000000..f0afc966 --- /dev/null +++ b/pilotage/public/css/main.css @@ -0,0 +1,41 @@ +.container h4{ + border-bottom: orange 1px solid; +} + +.oblig{ + font-size:0.6em; + vertical-align:top; + color:red; +} + + +.action-index .oblig, +.action-index .creer, +.action-index .editer{ + display:none; +} + + +/* igo_couche */ +body.igo_couche label.pas-important{ + font-weight:normal; +} +body.igo_couche hr{ + height:2px; + background-color:grey; +} + + +.controller-mapfile-action-select [data-etat="ferme"] .etq-fermer, +.controller-mapfile-action-select [data-etat="ouvert"] .etq-ouvrir{ + display:none; +} + +.controller-mapfile-action-select [data-etat="ferme"] .etq-ouvrir, +.controller-mapfile-action-select [data-etat="ouvert"] .etq-fermer{ + display:visible; +} + +.controller-mapfile-action-select [data-utilite="detail"]{ + display:none; +} \ No newline at end of file diff --git a/pilotage/public/css/mapfile.css b/pilotage/public/css/mapfile.css new file mode 100644 index 00000000..509f43f2 --- /dev/null +++ b/pilotage/public/css/mapfile.css @@ -0,0 +1,82 @@ +.retro-wizard h1, +.retro-wizard h3 { + text-align: center; +} + +.retro-wizard .wizard-nav{ + margin: 10px; + height: 30px; +} + +.retro-wizard .wizard-nav a, +.retro-wizard .wizard-nav button { + width: 100px; +} + +.retro-wizard .wizard-nav a { + float: left; +} + +.retro-wizard .wizard-nav button { + float: right; +} + +.critical td{ + background-color: #FFCC99 !important; +} + +table#layers td { + vertical-align: middle; +} + +table#layers th { + text-align: center; +} + +table#layers th.action , +table#layers td.action { + width: 180px; +} + +table#layers td.action input[type="checkbox"], +table#layers td.action input[type="radio"] { + margin-left: 73px; +} + +table#layers th.action input[type="checkbox"], +table#layers th.action input[type="radio"] { + margin-left: 10px; +} + +.radio input[type="radio"] { + margin-top: 0px; + margin-left: 0px; +} + +.radio span { + margin-top: 0px; + margin-right: 5px; + float: left; +} + +#progress .wrap-active { + background-color: white !important; +} + +table#layers select { + width: 100%; +} + +table#layers select.danger { + border-color: #A94442; + color: #A94442; + border-radius: 4px 4px 4px 4px; +} + +table#layers option { + color: #555555; +} + +table#layers option.danger { + color: #A94442; +} diff --git a/pilotage/public/csw/acrigeo.JPG b/pilotage/public/csw/acrigeo.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ba481afb7215951fd945967518c4d64e62abf986 GIT binary patch literal 14065 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 literal 0 HcmV?d00001 diff --git a/pilotage/public/csw/codelists.xml b/pilotage/public/csw/codelists.xml new file mode 100644 index 00000000..98f3fde0 --- /dev/null +++ b/pilotage/public/csw/codelists.xml @@ -0,0 +1,2148 @@ + + + + + + creation + + Date à laquelle la ressource est créée + + + + publication + + Date à laquelle la ressource est publiée + + + + revision + + Date à laquelle la ressource est révisée + + + + + notAvailable + + Date qui désigne le moment à partir duquel il n'est plus possible d'obtenir la ressource. + + + + inForce + + Date qui désigne le moment où la ressource est devenue en application. + + + + adopted + + Date qui désigne le moment où la ressource a été approuvée. + + + + deprecated + + Date qui désigne le moment où la ressource a été désapprouvée. + + + + superseded + + Date qui désigne le moment où la ressource a été substituée par une autre ressource. + + + + + + + download + + Téléchargement de la ressource + + + + information + + Online information about the resource + + + + offlineAccess + + Instruction pour une commande auprès du distributeur + + + + order + + Commande en ligne pour obtenir la ressource + + + + search + + Interface de recherche pour trouver la ressource + + + + + + + documentDigital + + Document numérique contenant du texte et pouvant contenir des illustrations + + + + imageDigital + + Aspects à travers la télédétection, stocké sous format numérique + + + + documentHardcopy + + Document papier contenant du texte et pouvant contenir des illustrations + + + + imageHardcopy + + Aspects à travers la télédétection, reproduit sur un support utilisable par l’homme + + + + mapDigital + + Carte numérique au format raster ou vecteur + + + + mapHardcopy + + Carte imprimée sur papier ou autre support utilisable par l’homme + + + + modelDigital + + Modèle numérique 3D sous forme digitale + + + + modelHardcopy + + Modèle numérique 3D physique + + + + profileDigital + + Profil vertical sous forme numérique + + + + profileHardcopy + + Profil vertical sous forme papier + + + + tableDigital + + Représentation numérique d’informations sous forme de colonnes + + + + tableHardcopy + + Représentation d’informations sous forme de colonnes sur papier ou autre support utilisable par l’homme + + + + videoDigital + + Vidéo numérique + + + + videoHardcopy + + Vidéo enregistré sur bande + + + + + audioDigital + + Enregistrement audio numérique. + + + + audioHarcopy + + Enregistrement audio livré sur support analogique tel un ruban magnétique. + + + + multimediaDigital + + Représentation d'information qui utilise simultanément plus d'un mode numérique pour le texte, le son, et les images. + + + + multimediaHardcopy + + Représentation d'information qui utilise simultanément plus d'un mode anlogique pour le texte, le son, et les images. + + + + diagramDigital + + Information representée graphiquement par des diagrammes tels les camemberts, les diagrammes à barres et tout autre type de diagramme et enregistrée en format numérique. + + + + diagramHardcopy + + Information representée graphiquement par des diagrammes tels les camemberts, les diagrammes à barres et tout autre type de diagramme, et imprimée sur papier, support photographique ou autre média. + + + + + + resourceProvider + + Organisme qui fournit la ressource. Acteur qui délivre physiquement la ressource, soit de manière directe au destinataire, soit par l’intermédiaire d’un diffuseur + + + + custodian + + Acteur responsable de la gestion et de la mise à jour de la ressource + + + + owner + + Organisme qui est propriétaire de la ressource / Acteur qui détient les droits patrimoniaux de la ressource + + + + user + + Organisme qui utilise ou a utilisé la ressource + + + + distributor + + Organisme qui distribue la ressource. Diffuseur de second niveau de la ressource + + + + originator + + Organisme qui a commandé la ressource. Acteur qui a été habilité à créer la ressource et qui a mis en place les moyens pour la constituer + + + + pointOfContact + + Organisme que l’on peut contacter pour avoir des renseignements détaillés sur la ressource. Acteur à contacter en premier lieu pour obtenir des informations relatives à la ressource + + + + principalInvestigator + + Personne clé pour obtenir des informations sur la ressource et les recherches conduites autour de la ressource +Acteur qui a assuré la réalisation de la ressource,éventuellement en faisant appel à des co-traitants ou des sous traitants + + + + processor + + Organisme qui a réalisé des traitements sur la ressource. Acteur qui est intervenu lors de la réalisation de la ressource + + + + publisher + + Organisme qui assure la publication de la ressource. + + + + author + + Organisme ou personne qui est auteur. Acteur qui dispose des droits moraux relatifs à la ressource. + + + + + collaborator + + Personne ou groupe qui a contribué à la ressource autre que le chercheur principal. + + + + editor + + Personne ou groupe qui corrige ou modifie la ressource pour en améliorer le contenu. + + + + mediator + + Une classe d'entités qui négocie l'accès à la ressource et à qui la ressource est destiné ou utile. + + + + rightsHolder + + Personne ou organisation qui possède ou gère les droits sur la ressource. + + + + + + + directInternal + + Méthode d’évaluation de la qualité d’un jeu de données basée sur l’analyse des données du jeu où toutes les données requises sont internes au jeu de données + + + + directExternal + + Méthode d’évaluation de la qualité d’un jeu de données basée sur l’analyse des données du jeu où les références vers des données externes sont requises. + + + + indirect + + Méthode d’évaluation de la qualité basée sur une connaissance externe. + + + + + + + crossReference + + Référence d’un jeu de données à un autre + + + + largerWorkCitation + + Référence à un jeu de données maître + + + + partOfSeamlessDatabase + + Référence à un jeu de données stocké dans une même base de données + + + + source + + Références vers la source des données qui a permis de produire les cartes,… + + + + stereoMate + + Partie d’un ensemble d’images qui, utilisé ensemble, fournit une vision 3D de l’image. + + + + + + + campaign + + Séries d’actions planifiées + + + + collection + + Accumulation de données dans un but précis + + + + exercise + + Action spécifique répondant à une ou des fonctions + + + + experiment + + Recherche pour vérifier si une hypothèse est valide + + + + investigation + + Recherche systématique + + + + mission + + Spécifique opération d’une collecte de données + + + + sensor + + Part d’un équipement qui détecte une information + + + + operation + + Action qui est une partie d’une série d’action + + + + platform + + Véhicule ou autre support supportant un capteur + + + + process + + Méthode pour faire quelque chose + + + + program + + Action spécifiquement planifiée + + + + project + + Recherche ou développement organisé + + + + study + + Investigation + + + + task + + Partie d'un travail + + + + trial + + Processus visant à tester ou démontrer quelque chose + + + + + + + point + + Chaque cellule représente un point + + + + area + + Chaque cellule représente une surface + + + + + voxel + + Chaque cellule représente un volume. + + + + + + + ucs2 + + 16-bit fixed size Universal Character Set, based on ISO 10646 + + + + ucs4 + + 32-bit fixed size Universal Character Set, based on ISO/IEC + 10646 + + + + utf7 + + 7-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + + + + utf8 + + 8-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + + + + utf16 + + 16-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + + + + 8859part1 + + ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic + character sets - Part 1 : Latin alphabet No.1 + + + + 8859part2 + + ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic + character sets - Part 2 : Latin alphabet No.2 + + + + 8859part3 + + ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic + character sets - Part 3 : Latin alphabet No.3 + + + + 8859part4 + + ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic + character sets - Part 4 : Latin alphabet No.4 + + + + 8859part5 + + ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic + character sets - Part 5 : Latin/Cyrillic alphabet + + + + 8859part6 + + ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic + character sets - Part 6 : Latin/Arabic alphabet + + + + 8859part7 + + ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic + character sets - Part 7 : Latin/Greek alphabet + + + + 8859part8 + + ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic + character sets - Part 8 : Latin/Hebrew alphabet + + + + 8859part9 + + ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic + character sets - Part 9 : Latin alphabet No.5 + + + + 8859part10 + + ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic + character sets - Part 10 : Latin alphabet No.6 + + + + 8859part11 + + ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic + character sets - Part 11 : Latin/Thai alphabet + + + + 8859part13 + + ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic + character sets - Part 13 : Latin alphabet No.7 + + + + 8859part14 + + ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic + character sets - Part 14 : Latin alphabet No.8 (Celtic) + + + + 8859part15 + + ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic + character sets - Part 15 : Latin alphabet No.9 + + + + 8859part16 + + ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic + character sets - Part 16 : Latin alphabet No.10 + + + + jis + + Japanese code set used for electronic transmission + + + + shiftJIS + + Japanese code set used on MS-DOS machines + + + + eucJP + + Japanese code set used on UNIX based machines + + + + usAscii + + United States ASCII code set (ISO 646 US) + + + + ebcdic + + IBM mainframe code set + + + + eucKR + + Korean code set + + + + big5 + + Traditional Chinese code set used in Taiwan, Hong Kong of China and other + areas + + + + GB2312 + + Simplified Chinese code set + + + + + + + unclassified + + La ressource ne revêt pas un caractère sensible + + + + restricted + + Le caractère sensible de la ressource restreint son utilisation ou sa diffusion + + + + confidential + + La ressource présente un caractère confidentiel. + + + + secret + + La confidentialité de la ressource implique des mesures de protection particulière + + + + topSecret + + La confidentialité de la ressource implique des mesures de protection extrêmes + + + + + + + image + + Représentation numérique d’un paramètre physique + + + + thematicClassification + + Codification selon une classification + + + + physicalMeasurement + + Valeur physique mesurée + + + + + + + class + + Description d’un ensemble d’objet qui ont les mêmes attributs, méthodes … + + + + codelist + + Enumération modifiable, utilisée pour exprimée une liste de valeurs extensible + + + + enumeration + + Enumération, utilisée pour exprimée une liste de valeurs non extensible + + + + codelistElement + + Valeur possible pour une liste de codes + + + + abstractClass + + Classe qui ne peut être directement instancée + + + + aggregateClass + + Classe qui est composé d’un ensemble de classes connecté par une relation de type Agrégation. + + + + specifiedClass + + Classe qui peut être substituée à une classe de niveau supérieur + + + + datatypeClass + + Classe avec peu ou aucune opération dont le rôle est de gérer l’état d’une autre classe pour les informations relevant de la transmission, le stockage, l’encodage ou la persistance. + + + + interfaceClass + + Noms des opérations qui caractérisent le comportement d’une ressource + + + + unionClass + + Classe décrivant une sélection d’un type spécifique + + + + metaClass + + Classe dont les instances sont des classes + + + + typeClass + + Classe utilisée pour spécifier un domaine d’instance (objet) en relation avec les opérations applicables à ces objets. Un type peut avoir des attributs et des associations + + + + characterString + + Texte libre + + + + integer + + Champ numérique + + + + association + + Relation entre deux classes + + + + + + + row + + Axe des ordonnées (axe - Y) + + + + column + + Axe des abscisses (axe X) + + + + vertical + + Axe vertical (axe Z) + + + + track + + Dans la direction de la ... + + + + crossTrack + + Perpendiculaire ... + + + + line + + Ligne de scannage d'un capteur + + + + sample + + Elément le long d'une ligne de scannage + + + + time + + Durée + + + + + + + complex + + Ensemble de primitives géométriques représentées comme l'union d'autres primitives + + + + composite + + Ensemble de lignes connectées entre elles + + + + curve + + Primitive géométrique à une dimension représentant une image continue d'une ligne + + + + point + + Primitive géométrique à zéro dimension représentant une position sans étendue + + + + solid + + Primitive géométrique à trois dimensions représentant un volume (définition à revoir) + + + + surface + + Primitive géométrique à deux dimensions représentant une surface + + + + + + + blurredImage + + Portion de l’image floue + + + + cloud + + Portion de l’image partiellement occultée par des nuages + + + + degradingObliquity + + Due à l’angle entre le plan de l’écliptique et le plan équatorial + + + + fog + + Portion de l’image partiellement occultée par du brouillard + + + + heavySmokeOrDust + + Portion de l’image partiellement occultée des fumées ou des poussières + + + + night + + Image prise la nuit + + + + rain + + Image prise durant la pluie + + + + semiDarkness + + Image prise pendant une semi obscurité + + + + shadow + + Image obscurcie par une ombre + + + + snow + + Image obscurcie par la neige + + + + terrainMasking + + Absence de données en raison des caractéristiques topographiques qui masquent les informations recherchées + + + + + + + discipline + + Mot-clé en relation avec une branche de la connaissance + + + + place + + Mot-clé identifiant un lieu + + + + stratum + + Couche géologique + + + + temporal + + Mot clef identifiant une période de temps + + + + theme + + Mot-clé identifiant un sujet particulier + + + + + product + + Mot-clé identifiant un type de produit. + + + + subTopicCAtegory + + Spécialisation d'une catégorie sujet pour fin de classification des données géographiques. + + + + + + + continual + + Mise à jour continue + + + + daily + + Mise à jour quotidienne + + + + weekly + + Mise à jour hebdomadaire + + + + fortnightly + + Mise à jour 2 fois par mois + + + + monthly + + Mise à jour mensuelle + + + + quarterly + + Mise à jour trimestrielle + + + + biannually + + Mise à jour bi-annuelle + + + + annually + + Mise à jour annuelle + + + + asNeeded + + Mise à jour lorsque cela est jugé nécessaire + + + + irregular + + Mise à jour irrégulière + + + + notPlanned + + Mise à jour non planifiée + + + + unknown + + Mise à jour inconnue + + + + + semimonthly + + Les données sont mises à jour deux fois par mois. + + + + + + + cpio + + Copie en entrée /sortie (commande et fichier au format UNIX) + + + + tar + + Format d’archivage sur bande + + + + highSierra + + Système de fichiers High Sierra + + + + iso9660 + + Système de fichier CD – ROM + + + + iso9660RockRidge + + Protocole d’échange Rock Ridge (UNIX) + + + + iso9660AppleHFS + + Système hiérarchique de fichiers (Macintosh) + + + + + + + cdRom + + Disque optique en lecture seule + + + + dvd + + Disque numérique universel + + + + dvdRom + + Disque numérique universel en lecture seule + + + + 3halfInchFloppy + + Disquette magnétique de 3.5 pouces + + + + 5quarterInchFloppy + + Disquette magnétique de 5.25 pouces + + + + 7trackTape + + Bande magnétique + + + + 9trackTape + + Bande magnétique + + + + 3480Cartridge + + Cartouche à bande magnétique 3480 + + + + 3490Cartridge + + Cartouche à bande magnétique 3490 + + + + 3580Cartridge + + Cartouche à bande magnétique 3580 + + + + 4mmCartridgeTape + + Bande magnétique 4 mm + + + + 8mmCartridgeTape + + Bande magnétique 8 mm + + + + 1quarterInchCartridgeTape + + Bande magnétique 0.25 pouces + + + + digitalLinearTape + + Bande magnétique 0.5 pouces + + + + onLine + + En ligne + + + + satellite + + Communication par satellite + + + + telephoneLink + + Liens via un réseau téléphonique + + + + hardcopy + + Document papier + + + + + + + mandatory + + Obligatoire + + + + optional + + Optionnel + + + + conditional + + Conditionnel + + + + + + + center + + Centre + + + + lowerLeft + + Bas gauche + + + + lowerRight + + Bas droit + + + + upperRight + + Haut droit + + + + upperLeft + + Haut gauche + + + + + + + completed + + La production du jeu de données est terminée + + + + historicalArchive + + Jeu de données historique + + + + obsolete + + Jeu de données obsolète + + + + onGoing + + Jeu de données ayant des mises à jour continues + + + + planned + + Jeu de données planifié + + + + required + + Jeu de données devant être produit + + + + underDevelopment + + Jeu de données en cours d’élaboration + + + + + proposed + + Données pour lesquelles des intéressés se sont manifestés mais dont le financement pour la production est incomplet et des partenaires sont recherchés. + + + + + + + copyright + + Restriction lié à l’exercice du droit moral + + + + patent + + Restriction induite par l’existence d’un brevet + + + + patentPending + + Restriction induite par le dépôt d’un brevet en cours + + + + trademark + + Restriction lié à l’existence d’un dépôt de marque + + + + license + + Restriction induite par l’existence d’une licence + + + + intellectualPropertyRights + + Restriction lié à l’exercice du droit patrimonial + + + + restricted + + Cette valeur n’a pas d’application identifiée en France + + + + otherRestrictions + + Restrictions non prévues + + + + + licenseUnrestricted + + Autorisation formelle non limité d'utiliser la ressource. + + + + licenseEndUser + + Autorisation formelle à une personne ou une entité d'utiliser la ressource et qui peut être différente de la personne qui la commande ou qui l'achète. + + + + licenseDistributor + + Autorisation formelle à une personne ou une entité de commercialiser ou de distribuer la ressource. + + + + privacy + + Ensemble des phénomèmes qui sont personnels, tant sur le plan physique que mental. + + + + statutory + + Prévu par la loi. + + + + confidential + + Secret et réservés à un nombre limité de personnes déterminées qui ne doivent pas en faire connaître le contenu. + + + + sensitivity + + Donnée dont la divulgation, l'altération, la perte ou la destruction risquent de paralyser ou de mettre en péril soit un service, soit l'organisation elle-même, et qui, de ce fait, devient particulièrement vulnérable. + + + + + + + attribute + + Informations appliquées aux caractéristiques de l’attribut + + + + attributeType + + Informations appliquées aux caractéristiques de l’entité + + + + collectionHardware + + Informations appliquées aux caractéristiques d’une collection matérielle + + + + collectionSession + + Informations appliquées aux caractéristiques d’une collection de session + + + + dataset + + Informations appliquées aux caractéristiques de jeu de données + + + + series + + Informations appliquées aux caractéristiques de la collection de données + + + + nonGeographicDataset + + Informations appliquées aux caractéristiques de jeux de données non géographiques + + + + dimensionGroup + + Informations appliquées à un groupe + + + + feature + + Informations appliquées à une entité + + + + featureType + + Informations appliquées à un type d’entité + + + + propertyType + + Informations appliquées à un type de propriété + + + + fieldSession + + Informations appliquées aux caractéristiques d’un champ de session + + + + software + + Informations appliquées à programme ou à une routine + + + + service + + Informations appliquées à un service Internet + + + + model + + Informations appliquées à modèle décrivant les objets ou un ensemble d'objets + + + + tile + + Tuile + + + + + + + vector + + Donnée vecteur (point, ligne, polygone) + + + + grid + + Donnée raster + + + + textTable + + Texte ou donnée tabulaire + + + + tin + + Réseau de triangle irrégulier (Triangulated Irregular Network) + + + + stereoModel + + Vue en 3 dimensions + + + + video + + Enregistrement vidéo + + + + + + + farming + + Elevage et/ou cultures. Exemples : agriculture, irrigation, aquaculture, plantations + + + + biota + + Flore et faune dans un écosystème naturel. Exemples : habitat, écologie, faune sauvage, faune aquatique, sciences biologiques, zones humides, végétation, biodiversité + + + + boundaries + + Exemples : limites de pays, de provinces, de départements, de communes + + + + climatologyMeteorologyAtmosphere + + Processus et phénomènes atmosphériques. Exemples : climat, météorologie, conditions atmosphériques, changements climatiques, couverture nuageuse + + + + economy + + Activités économiques. Exemples : production, travail, revenu, commerce, industrie, tourisme et éco-tourisme, foresterie, pêche, chasse, exploration et exploitation des ressources minières, pétrole, gaz naturel + + + + elevation + + Hauteurs au dessous et dessus du niveau de la mer. Exemples : altitude, bathymétrie, MNT, pentes et calculs dérivés de l’altitude + + + + environment + + Ressources naturelles, protection, conservation des ressources naturelles. Exemples : pollution, traitement et stockage des déchets, suivi de l’environnement, gestion du risque, réserves naturelles, paysage + + + + geoscientificInformation + + Informations relatives aux sciences de la terre. Exemples : composants et processus géophysiques, géologie, minéralogie, tectonique, risque sismique + + + + health + + Santé, services de santé, épidémiologie. Exemples : maladies et épidémie, facteurs affectant la santé, santé mentale et physique, services de santé + + + + imageryBaseMapsEarthCover + + Carte de référence. Exemples : occupation des terres, imagerie aérienne et satellitale, carte thématiques, carte topographiques + + + + intelligenceMilitary + + Bases militaires et infrastructures + + + + inlandWaters + + Exemples : fleuves, rivières, glaciers, lacs salés, systèmes hydrographiques, barrages, débits, qualité de l’eau + + + + location + + Exemples : zones postales, adresses, points de contrôle, réseau géodésique + + + + oceans + + Composants et caractéristiques du milieu maritime. Exemples : littoral, récifs, marée, etc. + + + + planningCadastre + + Exemples : carte d’utilisation des terres, plan d’occupation des sols, planification pour la prévention des risques + + + + society + + Caractéristiques des sociétés et des cultures. Exemples :lois, anthropologie, éducation, données démographiques, archéologique, suivi des systèmes sociaux, croyances, us et coutumes, crimes et justices + + + + structure + + Aménagements urbains. Exemples : musée, église, usines, maisons, monuments, boutiques, immeubles + + + + transportation + + Moyens de transports des personnes et des biens. Exemples : routes, aéroports, tunnels, viaducs, ponts, chemin de fer + + + + utilitiesCommunication + + Systèmes de distribution de gestion ou de stockage de l’énergie, de l’eau, des déchets. Infrastructures et services de communication. Exemples : source d’énergie solaire, hydroélectrique, nucléaire, épuration et distribution des eaux, réseau de distribution électrique, de gaz, réseau de télécommunication, radio. + + + + + + + geometryOnly + + Objets vecteurs sans aucune structure qui décrit la topologie + + + + topology1D + + Réseau sans surface (communément dénommée topologie réseau) + + + + planarGraph + + Topologie 1D planaire + + + + fullPlanarGraph + + Topologie 2D planaire + + + + surfaceGraph + + Topologie 1D avec surfaces + + + + fullSurfaceGraph + + Topologie 2D avec surfaces + + + + topology3D + + Topologie 3D + + + + fullTopology3D + + Couverture complète d’un espace Euclidien 3D + + + + abstract + + Objets géométriques sans description de la topologie + + + + + + + attribute + + Informations appliquées aux caractéristiques de l’attribut + + + + attributeType + + Informations appliquées aux caractéristiques de l’entité + + + + collectionHardware + + Informations appliquées aux caractéristiques d’une collection matérielle + + + + collectionSession + + Informations appliquées aux caractéristiques d’une collection de session + + + + dataset + + Informations appliquées aux caractéristiques de jeu de données + + + + series + + Informations appliquées aux caractéristiques de la collection de données + + + + nonGeographicDataset + + Informations appliquées aux caractéristiques de jeux de données non géographiques + + + + dimensionGroup + + Informations appliquées à un groupe + + + + feature + + Informations appliquées à une entité + + + + featureType + + Informations appliquées à un type d’entité + + + + propertyType + + Informations appliquées à un type de propriété + + + + fieldSession + + Informations appliquées aux caractéristiques d’un champ de session + + + + software + + Informations appliquées à programme ou à une routine + + + + service + + Informations appliquées à un service Internet + + + + model + + Informations appliquées à modèle décrivant les objets ou un ensemble d'objets + + + + tile + + Tile + + attribute + + Informations appliquées aux caractéristiques de l’attribut + + + + attributeType + + Informations appliquées aux caractéristiques de l’entité + + + + collectionHardware + + Informations appliquées aux caractéristiques d’une collection matérielle + + + + collectionSession + + Informations appliquées aux caractéristiques d’une collection de session + + + + dataset + + Informations appliquées aux caractéristiques de jeu de données + + + + series + + Informations appliquées aux caractéristiques de la collection de données + + + + nonGeographicDataset + + Informations appliquées aux caractéristiques de jeux de données non géographiques + + + + dimensionGroup + + Informations appliquées à un groupe + + + + feature + + Informations appliquées à une entité + + + + featureType + + Informations appliquées à un type d’entité + + + + propertyType + + Informations appliquées à un type de propriété + + + + fieldSession + + Informations appliquées aux caractéristiques d’un champ de session + + + + software + + Informations appliquées à programme ou à une routine + + + + service + + Informations appliquées à un service Internet + + + + model + + Informations appliquées à modèle décrivant les objets ou un ensemble d'objets + + + + tile + + Tile + + + + initiative + + The referencing entity applies to a transfer aggregate which was originally + identified as an initiative (DS_Initiative) + + + + stereomate + + The referencing entity applies to a transfer aggregate which was originally + identified as a stereo mate (DS_StereoMate) + + + + sensor + + The referencing entity applies to a transfer aggregate which was originally + identified as a sensor (DS_Sensor) + + + + platformSeries + + The referencing entity applies to a transfer aggregate which was originally + identified as a platform series (DS_PlatformSeries) + + + + sensorSeries + + The referencing entity applies to a transfer aggregate which was originally + identified as a sensor series (DS_SensorSeries) + + + + productionSeries + + The referencing entity applies to a transfer aggregate which was originally + identified as a production series (DS_ProductionSeries) + + + + transferAggregate + + The referencing entity applies to a transfer aggregate which has no existence + outside of the transfer context + + + + otherAggregate + + The referencing entity applies to a transfer aggregate which has an existence + outside of the transfer context, but which does not pertains to a specific aggregate + type. + + + + + + + DCP is XML + XML + + + + DCP is CORBA + CORBA + + + + DCP is JAVA + JAVA + + + + DCP is COM + COM + + + + DCP is SQL + SQL + + + + DCP is WebServices + WebServices + + + + + + + Présence d'une donnée associée + tight + + + + Présence de plusieurs données associées + mixed + + + + Absence de donnée associée + loose + + + + + + + in + + + + out + + + + in/out + + + + + \ No newline at end of file diff --git a/pilotage/public/csw/download.png b/pilotage/public/csw/download.png new file mode 100644 index 0000000000000000000000000000000000000000..4c7bb5866384bd4e7d53b0bb45bc570f29449be9 GIT binary patch literal 1074 zcmaJ=Pe>F|93GHFHZ_mc#c2%k;Lgn3e>#JsxihOSv?A+@3k5aKJay8UH_klURXUV( zvCJ-I5J9<=coMxO8AS$KP;{t^P(%@Q5X3HpCGGl%Fu=`F5$PUpx!1O2v)B00BHiwgw!Ry^9wbj2gNG-kd#Xdjwg0@VEdiShB7Xw4j$cWWXQZ(mGoaPi6S534&rx|>Tq%_|#`;QN!g z%B!2X*T3J?-D_{VoLg6Kg}xSbRE*ZgA5&q#%P97W5z9JRwJd0G?z1sF>|IfhjCk>DT`^N z;w5S-<*97h3K?Ctlr~ClTiQ~*A}We>L%HmGv}xZz-rnEyob$UppU>xe`F;NQWd`&8 z%uQ`gNhFeafInA2%nrl{m>3iP+*08VVzR+~!tfAOife=zLSjo$5ds7#gpr5<5lRv^ z*CU=J(qvG!Dhv;PH|sfIQy+hbk0b&}v+O z{GIRr6jrZFP$7^2QKPY#n7BBp{dg!9lY=2b9K}|lXv{4t7YR8Wh zU2QKY8a4^MHfLYZqS_#MciJqA?~ag<^p3vSa*K6#!-_y^&ShB&Vh^n0M~ zavIgvh@`z?z9I{?#tPJ=-p=ZRPNd&hf_a?6R{WIxL|vlYJF;F+#?6#Dz*`%5bqSOzp}n=AL@m5K-2kd~j{ zOVT>uIi_5QP4;aB7tYF5ZH#upZZ5PrITmLkPiL91Qmi91yllH=E zXZr`aP>PM`wR^K!TCB=uYgy0lDP5s&3}!o3f%Hv_uN6OUgfh8@D%P4ySKqhhH^J%8 z%6DlmdN9TTl?WMc#(GuZkN^+vqW6&dXK=7^y4xMajWc)qnZB9{fvE+Pb zLSu9Roz2ltn^9WoH{OF~ z*P}CwyKTBV`VK?O8K5W^$PYANC<%(m?%=K|SfqQs+v4Mi z+wWU{Y=3k^c-}voVQ*qvd|+o$&Cq#icNEfDkZ6WPlg??ln@3`-UrTgBQ)ci0uWz3` zzW?#&=#*BuL!SPT?KUv<_bsK>32V7f^l)$I(sGB?e-@Q2O=RiJe6 zU!FVv;x{S>k$Z8H!PBv^@3(Yc;em?M;GtvM6k zbx&RgU}J5=!^6-v?}JcxTybyylsnp=X>IJEuF@kHpyA=+%~!8#p}ZBLw=Zo>*N;6r z7@2jZ?N7T5mXx_K4lASV**iyD%5Cg>AvhMY2t1mV8QOQ4?%A;}{P2%8*_&1`pDVpL u*QL7K_PSN&%UaRS+MxT@eew~9OQaA>zx|;n=G+~BO$7MxxhK6hrT+&eg|goO literal 0 HcmV?d00001 diff --git a/pilotage/public/csw/icon_populaire.png b/pilotage/public/csw/icon_populaire.png new file mode 100644 index 0000000000000000000000000000000000000000..54f0684e4af2929aa018952f2ef09b6b0623a078 GIT binary patch literal 2994 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 literal 0 HcmV?d00001 diff --git a/pilotage/public/csw/icon_populaire_mini.png b/pilotage/public/csw/icon_populaire_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1e2353cf254671ee8b0f713cd790cd0c10fb7b GIT binary patch literal 1735 zcmaJ?X;2eq7|v8$zzYK?SA`{jRZETy1lT};oCHh)1X^J%Bb#J_NU|G}1;V8jC<2NC zMU-larKzJRf>y;rEqGKAv9+~D@jy^J(1HhE%z(DtP{95u-I?9*nCE%k=Y7BTn=Olx zMJ$@{I-f)$Es7Kii9^STAZs#;&Ns2%G`7%q@sj{0wG2=A)rNY7%*xzsDW+dP^NU*#N4t?rvOtB zJe@=N$5ete2H<0Q1Ypq^R3#$-1OohNpg#lhhkOAh17y%aCY=#T1sQBsAe#XK(+`D+ zrdOq~q~W-ZO{ZsPXVbF%XqY~g4nhz_XE5nZCY3-?4LK+d8>y(lYeqqU z7?gUo4p(C+U{Qn>SSHS)5KjL|L93gUMGezsA__(~!a6!gV^~s}0ZOI+57laC(FR)Fz@ZQdG__jAhPd1y$R7;i1%d()6oNc|P{0oo1@MJJCM5Fb z&2R;nGEz8okw#?9?y0E6O>#An%h-a%BD%vsG+m ztHUzbZB*eY$o<%n73V;6wjHth`XndNBg<_7`njTjWjrqt=ELk@C4hu`S4z0>wSm*2D{yZWp$;PJe>x}Sa-xu12~y7+vEQ}yMSVwVk@ zN{$^XB?ULHL?4!zhQ3s+at+@dlhiAAdfZbjiH^SK?BQ{vN1DeuVBV~9Veo2AQ9*t9 zqk3E4tRp*$t5hiZII*Chz-}EWG(yfS?;lFC>3nC2+E2FpyYfry=w45g%$mAv&A}sA zj*Ysxxs9l`+T{RCRN3;%V{GzGfyQTIa&kOcBH63PuzS+ncQ=!V91iF6yRtTXXy1Gz zZ`ZaB3m4;gE#EdNl%kg5^h-mlc1E2z*f;VjP(yazdJHK9Mt`)E~c`gd;dAo z$)t&rI-JS-L1dNj;82IJe6-xT3tqa;X0qiCIhkbFQmL1dg~66zOQcXHIKoRV{2T58 BnM42p literal 0 HcmV?d00001 diff --git a/pilotage/public/csw/labels.xml b/pilotage/public/csw/labels.xml new file mode 100644 index 00000000..7f313e8b --- /dev/null +++ b/pilotage/public/csw/labels.xml @@ -0,0 +1,3436 @@ + + + + + + + + + + + + + + Valeur alphanumérique pour l'identification d'une occurrence dans le domaine de valeurs + Code alphanumérique de l'identifiant. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. + + + + + + Code. Par exemple, le code epsg. + + + + + + + Nom ou identification de la personne ou de l'organisation responsable pour le domaine de valeurs + Informations sur la personne ou l'organisation en charge de l'espace nominal ou de l'identifiant. + + + + + + Date de l'édition + Date de la version / de l'édition (jj.mm.aaaa). + + + + + + Type de données pour des dates de références et des événements avec lesquels la date est en relation + Type de données intégrant la date de référence et le type de référence de la source citée. + + + + + + Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressource + Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressources. + + + + + + Date et heure à laquelle les donnée seront à disposition + Date et heure à laquelle les données seront disponibles. + + + + + + + Nom des tests qui ont été appliqués aux données + Nom du test appliqué aux données. + + + + + + Unité de l'indication de l'étendue verticale. Exemple : mètre, pied, millimètre, hectopascal + Unité altimétrique. Exemples : mètre, pied, millimètre, hectopascal + + + + + + Type de données pour la localisation de l'organisation ou la personne individuelle responsable + Type de données avec indication d'adresse. + + + + + + Type de données pour la description standardisée des informations de références de la ressource + Type de données destiné à une description unifiée des sources (renvoi standardisé aux sources). Ce type de données permet une indication standardisée des sources (CI_Citation). Il contient également des types de données pour la description des services en charge de données et de métadonnées (CI_ResponsibleParty). La description du service compétent peut intégrer le nom de l'organisation comme celui de la personne responsable au sein de cette organisation. Il est également impératif de décrire sa fonction (son rôle). CI_Contact recèle des informations sur le mode de communication avec le service compétent. CI_Citation contient les principaux attributs permettant l'identification d'un jeu de données ou d'une source. Parmi ceux-ci on peut citer le titre, sa forme abrégée, l'édition ou la date. Le type de données CI_Citation est alors appelé lorsque l'identification complète d'une information supplémentaire d'une source de données est à fournir. Des renvois sont effectués à partir de ce type de données vers chacun des autres types de données du groupe ?Citation?. CI_Citation est un regroupement de classes pouvant être appelées par plusieurs attributs de la norme. + + + + + + Type de données avec l'information utilisée pour permettre le contact avec la personne et/ou l'organisation responsable + Type de données intégrant des informations telles qu''un numéro de téléphone, de télécopie, des heures d'ouverture ou d'autres indications, toujours en rapport avec la personne ou le service désigné dans CI_ResponsibleParty. + + + + + + Type de données pour des dates de références et des événements avec lesquels la date est en relation + Type de données intégrant la date de référence et le type de référence de la source citée. + + + + + + Type de données pour l'information sur les sources en ligne, grâce auxquelles les éléments de métadonnées étendus sur le jeu de données, la spécification ou le profil peuvent être obtenus + Type de données contenant des informations relatives à la possibilité et dans l'affirmative, à la manière d'accéder en ligne au jeu de données. + + + + + + Type de données pour l'identification des personnes et organisations, ainsi que pour la description des modes de communication avec, associées avec le jeu de données + Type de données destiné à l'identification de personnes et/ou d'organisations en relation avec le jeu de données (en tant que responsable, en charge du traitement, propriétaire, etc.), intégrant par ailleurs d'autres informations telles que le numéro de téléphone, l'adresse (postale, messagerie électronique) permettant d'entrer en contact avec ces personnes et/ou organisations. Les trois premiers attributs (individualName, organisationName, positionName) de ce type de données permettent de savoir s'il s'agit de la description d'une personne, d'un service ou de la domiciliation d'une personne précédemment définie. Une indication au moins est obligatoire. La liste de sélection CI_RoleCode spécifie alors la nature de la responsabilité endossée par le service désigné. Cf. CI_Citation pour d'autres informations. + + + + + + Type de données pour l'information sur les séries ou le jeu de données global, à qui appartient le jeu de données + Type de données réservé aux informations relatives à la série ou au jeu de données composé dont le jeu de données fait partie. Il s'agit d'informations concernant le nom, l'édition et (en cas de disponibilité) le numéro de la page sur laquelle cette série du jeu de données peut être trouvée. l'ensemble des feuilles de la carte au 1:25''000 de swisstopo constitue par exemple une série. + + + + + + Type de données pour le numéro de téléphone de la personne ou du service responsable + Type de données pour les numéros de téléphone. + + + + + + Classe pour la description de la concordance des coordonnées mesurées avec les valeurs vraies ou acceptées comme telles + Classe destinée à décrire la précision des coordonnées effectives par rapport aux coordonnées théoriques. + Exemple : Des points GPS sont à plus de 10 m de leur localisation acceptée comme + vraie, Lampadaires issus de la restitution : 40 cm et Lampadaires issus des levers : + 5 cm. + + + + + + Classe pour la description de la justesse de la référence temporelle d'un élément (rapport d'erreur d'une mesure de temps) + Exemple : La date renseignée pour une procédure administrative est imprécise. + + + + + + Classe pour la description des données excédentaires présentes dans le jeu de donnée définit par le domaine d'applicabilité + Classe destinée à la description des données surabondantes présentes dans le jeu de données, conformément au champ d'application défini. + Exemple : Un bâtiment a été reporté deux fois, Un cours d’eau a été représenté alors qu’il n’aurait pas dû être pris en compte. + + + + + + Classe pour la description des données manquantes du jeu de donnée définit par le domaine d'applicabilité + Classe destinée à la description des données manquantes dans le jeu de données, conformément au champ d'application défini. + Exemple : il manque un bâtiment. + + + + + + Classe pour l'adhésion aux règles du schéma conceptuel + Classe permettant la description du respect des règles du schéma conceptuel. + Exemple : Une parcelle n’a pas de propriétaire. + + + + + + Classe qui contient l'information sur les résultats des évaluations des valeurs (ou jeu de valeurs) obtenues en comparaison avec une valeur de qualité spécifique + Classe contenant des informations relatives aux résultats d'exploitation se déduisant de la comparaison des valeurs obtenues avec un indicateur de qualité spécifié. + + + + + + Classe avec l'information sur la qualité pour les données spécifiées par un domaine de qualité des données + Classe comportant des informations relatives à la qualité du jeu de données. La qualité des données est exprimée par les éléments de métadonnées des classes DQ_DataQuality, LI_Lineage et DQ_Legislation. l'étendue des indications de qualité est définie et décrite dans la classe du champ d'application (DQ_Scope). La filiation ou la provenance des données est décrite dans la classe LI_Lineage qui est une agrégation des deux classes LI_Source (indications concernant les données source) et LI_ProcessStep (informations relatives aux étapes de traitement). Les différentes étapes de traitement peuvent à leur tour présenter une relation avec les données source. "+lineage" est obligatoire si "scope.DQ_Scope.level" = "Jeu de données". + Les prescriptions de qualité applicables au jeu de données à décrire figurent dans la classe DQ_Legislation. + + + La totalité des caractéristiques d’un produit qui lui confèrent l’aptitude à satisfaire des besoins exprimés ou + implicites, conformément à la norme EN ISO 19101. + + + + + + + Classe pour l'adhésion des valeurs aux domaines de valeurs + Classe permettant la description du respect des valeurs des domaines de valeurs. + Exemple : Un attribut a une valeur non renseignée dans la nomenclature, La charte graphique n’est pas respectée. + + + + + + Degré de conformité de l’échange de données avec le format spécifié. + Classe permettant la description du niveau d'accord auquel le jeu de données décrit dans le domaine de qualité des données est mémorisé en regard de la structure de données physique. + Exemple : France / Le lot EDIGEO n’est pas conforme au standard PCI, Les couleurs Autocad sont renseignées sur l’entité et non sur le layer, Un objet bâtiments est stocké dans la couche parcelle. + + + + + + Classe pour la description de la concordance des valeurs de position dans la grille avec les valeurs vraies ou acceptées comme telles + Classe permettant la description de la précision en position dans le réseau, en comparaison des valeurs théoriques. + + + + + + Classe pour la description de la précision des attributs non-quantitatifs + Classe destinée à la description de la précision d'attributs non quantitatifs. + Exemple : La commune du client est fausse. + + + + + + Classe pour la description de la précision des attributs quantitatifs + Classe destinée à la description de la précision d'attributs quantitatifs. + Exemple : La surface renseignée de la parcelle est inférieure de 20% à la réalité. + + + + + + Classe contenant l'information des valeurs (ou jeu de valeurs) obtenu en appliquant sur les données une mesure de qualité + Informations relatives aux résultats des tests livrés par l'application d'une mesure de qualité. + + + + + + Classe pour la description de la concordance des positions relatives des objets du domaine d'applicabilité avec les positions relatives respectives vraies ou admises comme telles + Classe destinée à la description de la précision de position relative par rapport à une position relative acceptée ou à une position théorique. + Exemple : Le bâtiment est de l’autre côté de la route. + + + + + + Description de l'étendue des charactéristiques des données pour lesquelles des informations de qualité sont rapportées + Description du domaine du jeu de données pour lequel des informations de qualité ont été saisies. d'autres indications peuvent être trouvées sous DQ_Dataquality. + Obligatoire + + + + + Classe pour la description de la justesse d'événements, ou séquences, ordonnés, dans le cas ou ils sont donnés + Exemple : La date renseignée d’approbation d’une procédure est antérieure à celle de la demande. + + + + + + Classe pour la description de la validité des données du domaine d'applicabilité, en regard de l'aspect temporel + Classe destinée à la description de la validité des données définies dans le domaine de qualité associé. + + + + + + Classe pour la description de la comparaison de classes ou leurs attributs assignés aux objets avec un discours universel + Classe permettant la description de la comparaison de classes ou d'attributs assignés aux objets avec un large éventail de possibilités. + Exemple : Un poteau a été affecté à la classe « poteau téléphone ». + + + + + + Classe pour la description de la justesse des caractéristiques topologiques définies explicitement du jeu de donnée définit par le domaine + Classe permettant de décrire l'exactitude des caractéristiques topologiques définies explicitement, conformément au champ d'application défini pour le jeu de données. + Exemple : La zone de plan d'occupation du sol (POS) ne passe pas sur tous les sommets des parcelles. + + + + + + Type de données pour la description d'une surface fermée, exprimée par un ensemble de paires de coordonnées (x, y), qui englobe le jeu de données. Le premier et le dernier points sont identiques + Type de données destiné à la description d'une surface fermée (polygone) définie par un ensemble de paires de coordonnées (x, y) et englobant le jeu de données. Le premier et le dernier point sont identiques. Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. + + + + + + Type de données pour l'information sur l'étendue horizontale, verticale et temporelle du jeu de données + Type de données contenant des informations relatives à l'extension horizontale, verticale et temporelle du jeu de données. Les types de données de cette classe contiennent des éléments de métadonnées décrivant l'extension spatiale et temporelle des données. EX_Extent est une agrégation des classes EX_GeographicExtent (description de l'extension géographique), EX_TemporalExtent (extension temporelle des données) et EX_VerticalExtent (extension verticale des données). l'extension géographique est spécifiée plus avant par une délimitation au moyen d'un polygone (EX_BoundingPolygon) comme par un rectangle de délimitation géographique (EX_GeographicBoundingBox) et une description textuelle (EX_GeographicDescription). Pour EX_Extent comme pour CI_Citation, il s'agit d'un regroupement de classes pouvant être appelées par plusieurs attributs de la norme. + + + + + + Type de données pour la description de la position géographique du jeu de données. Il s'agit ici d'une référence approximative de telle sorte qu''il n''est pas nécessaire de spécifier le système de coordonnées + Type de données destiné à la description de la position géographique du jeu de données. Il s'agit ici de la définition d'une enveloppe sommaire (délimitation en latitude et en longitude). Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. + Obligatoire + + + + + Type de données pour la description de la surface géographique en utilisant des identifiants + Type de données destiné à la description de l'extension géographique au moyen d'identifiants, par exemple une commune issue d'une liste. Des informations supplémentaires peuvent être trouvées sous EX_Extent et EX_GeographicExtent. + + + + + + Type de données pour la description de l'étendue en respectant les limites date/heure et spatiales + Type de données destiné à la description de l'extension dans le respect des limites spatiales et temporelles. Cette classe est une représentation de la classe EX_TemporalExtent. l'extension géographique est saisie en plus de l'indication de la validité temporelle. + + + + + + Type de données pour la description de la période de temps couverte par le contenu du jeu de donnée + La validité temporelle du jeu de données est définie dans cette classe. Cette classe connaît la représentation EX_SpatialTemporalExtent. Des informations supplémentaires peuvent être trouvées sous EX_Extent. + + + + + + Type de données pour la description de l'étendue verticale du jeu de données + Type de données permettant la description de la troisième dimension (axe Z) avec ses altitudes minimale et maximale ainsi que l'unité de mesure utilisée. Vous trouverez des informations supplémentaires sous EX_Extent. + + + + + + Numéro international normalisé d'un livre (ISBN) + + + + + + + Numéro international normalisé d'une publication en série (ISSN) + Numéro international normalisé d'une série de publications (ISSN) + + + + + + Classe contenant l'information sur les événements ou les données sources utilisées pour la construction des données + Classe contenant des informations relatives à la provenance et au processus de génération du jeu de données. + Ces indications font partie intégrante des informations sur la qualité. + Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. + + + L’historique d’une série de données et son cycle de vie, depuis sa collecte et son acquisition jusqu’à sa + forme actuelle, en passant par sa compilation et sa dérivation, conformément à la norme EN ISO 19101. + + + Example : X% lampadaires issus de restitution photogrammétrique, X% lampadaires issus levers + + + + + + Information sur un événement du processus de création ou de transformation, y inclus le processus de la maintenance des données + Informations relatives à une étape du processus de création ou de transformation des données incluant leur processus d'actualisation. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici. Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies via un texte, une date, une source et l'identification de la personne ayant réalisé le traitement. Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. + + + + + + Classe contenant l'information sur les données sources utilisées pour créer les données spécifiées par l'attribut scope (79) du domaine d'applicabilité + Classe contenant des informations relatives aux données source dont le domaine de données est issu et auxquelles il est renvoyé dans la classe DQ_DataQuality (attribut concernant l'étendue des indications de qualité). Des informations complémentaires peuvent être trouvées sous DQ_Dataquality. + + + + + + Informations du jeu de données rassemblé + Informations relatives aux jeux de données de rang inférieur telles que le nom, l'identification, le genre de relation, le motif de la saisie. Exemple : lorsqu''un lot de la MO est décrit, il est renvoyé ici aux couches existantes de la MO pour ce lot (biens-fonds, couverture du sol, etc.). Ces indications décrivent la hiérarchie de rang inférieur, au contraire de l'attribut MD_Metadata.parentIdentifier décrivant lui le jeu de données de rang supérieur. + + + + + + Classe avec l'information sur le schéma d'application utilisé pour construire le jeu de donnée + Dans MD_ApplicationSchemaInformation, il est possible d'indiquer les conditions marginales sous lesquelles les données peuvent être utilisées pour une application spécifique. Exemple : supposons qu''un jeu de données relatif à des clairières ait été créé par des forestiers ; la description comprise dans MD_ApplicationSchemaInformation contiendrait alors des informations sur la manière dont les clairières sont à représenter en sylviculture comme sur les aspects sous lesquels leurs limites sont à définir et à interpréter. Si le même jeu de données avait été généré par des botanistes, les clairières auraient été considérées sous des aspects bien différents. d'autres signes conventionnels auraient par ailleurs été utilisés. De telles informations peuvent exercer une forte influence sur l'utilisation ultérieure comme sur le champ d'application. Les indications entrées sous MD_ApplicationSchemaInformation ne sont associées à aucune restriction d'utilisation puisque c''est déjà le cas sous MD_Constraints. Les conditions marginales sous lesquelles le jeu de données a été saisi puis est à traiter dans l'application correspondante sont entrées ici. Il peut même s'agir de plusieurs options différentes. La description d'un schéma d'application doit au moins comprendre le nom, le langage de modélisation et la langue utilisée. Le fait de savoir si le schéma de données est transmis sous forme d'un graphique, d'un fichier ASCII ou d'un fichier spécifique à un environnement logiciel donné est quant à lui facultatif. Si les noms des objets spatiaux définis par l'intermédiaire du schéma d'application sont à indiquer, alors la classe MD_SpatialAttributeSupplement renvoyant à la classe MD_FeatureTypeList peut servir à cela. + + + + + + Classe pour l'étendue des longueurs d'ondes utilisées dans le spectre électromagnétique + Classe précisant le domaine des longueurs d'onde utilisées dans le spectre électromagnétique. + + + + + + Classe pour la description d'un graphique qui contient une illustration du jeu de données + Classe destinée à la description d'un graphique contenant une représentation du jeu de données (une légende du graphique devrait être incluse). Il s'agit généralement d'un jeu de données d'exemple, valant pour des jeux de données de même nature (des cartes nationales par exemple). + + + + + + Classe pour les restrictions sur l'accès et l'utilisation d'une ressource ou de métadonnées + Classe recelant des informations relatives aux restrictions d'accès et d'utilisation de la ressource ou du jeu de métadonnées. Le paquet contenant la description des restrictions d'accès et d'utilisation intègre la classe MD_Constraints avec un attribut fournissant une description générale des restrictions et les deux sous-classes MD_LegalConstraints (informations sur les restrictions d'accès et d'utilisation dues au respect de droits d'auteurs) et MD_SecurityConstraints (informations sur les restrictions liées à des questions de sécurité de portée nationale ou assimilée telles que la confidentialité ou le secret). La classification des restrictions et des niveaux de sécurité s'effectue via des listes de sélection (MD_RestrictionCode et MD_ClassificationCode). + + + + + + CLasse pour l'information sur le contenu de la cellule de données raster + Des contenus physiques et thématiques d'une trame peuvent être décrits dans la classe MD_CoverageDescription. Si l'on se limite au contenu, les informations générales relatives aux attributs obligatoires attributeDescription et contentType peuvent convenir, la description de l'attribut dans attributeDescription devant toutefois s'effectuer via la valeur mesurée. Cf. MD_ContentInformation pour plus d'informations. + + + + + + Classe avec l'information utile pour identifier un jeu de données + Classe contenant des informations de base utilisées pour l'identification sans équivoque du ou des jeux de données. Il s'agit de la description du jeu de données concret. La classe MD_DataIdentification est la représentation de MD_Identification pour les données. Elle intègre des informations relatives à la caractérisation spatiale et temporelle des données, au jeu de caractères et à la langue utilisés, de même que d'autres informations descriptives. Une extension spatiale minimale des données est à indiquer par l'intermédiaire de l'option "geographicBox" (rectangle de délimitation géographique), de l'option "geographicDescription" (description textuelle de l'extension) ou des deux simultanément. Il est en outre possible de restreindre l'extension par le biais de l'attribut "extent", aussi bien au niveau spatial (via un polygone) que temporel. La norme prévoit une liste internationale de 19 thèmes (MD_TopicCategoryCode) pour la classification thématique des données, gérée par l'intermédiaire de l'attribut "topicCategory". Une recherche standardisée par thèmes est de la sorte possible au plan international. + + + + + + Classe avec les possibilités techniques et les médias avec lesquels une ressource peut être obtenue par un distributeur + Classe contenant les possibilités techniques et les supports envisageables pour l'obtention d'une ressource auprès d'un distributeur. Cf. MD_Distribution pour des informations complémentaires. + + + + + + Classe contenant les propriétés des axes + Cette classe contient les propriétés des axes requises pour la définition de données tramées. Ces informations sont utilisées dans la classe MD_GridSpatialRepresentation. d'autres informations peuvent y être trouvées. + + + + + + Classe avec l'information sur le distributeur de données et sur les possibilités d'obtenir les ressources + Classe contenant des informations relatives au distributeur des données de même qu''aux possibilités d'obtention du jeu de données. Cette classe recèle des indications sur le lieu de délivrance des données ainsi que sur la forme de leur obtention. MD_Distribution est une agrégation des informations concernant le transfert de données numériques (MD_DigitalTransferOptions) et des informations relatives au format des données (MD_Format). + + + + + + Classe avec l'information sur le distributeur + Classe contenant les informations relatives au distributeur des données (nom, rôle, adresse, etc.). d'autres informations peuvent être trouvées sous MD_Distribution. + + + + + + Classe pour des éléments de métadonnées nouveaux, qu''on ne trouve pas dans ISO 19115, utilisés pour décrire des données géographiques + Classe réservée à de nouveaux éléments de métadonnées requis pour la description des données géographiques mais absents de la norme ISO19115. + + + + + + Classe pour l'information qui définit le catalogue d'objets ou le modèle de donnée + Classe destinée aux informations identifiant le catalogue d'objets ou le modèle de données utilisé. Dans cette classe, le catalogue d'objets mis en application est spécifié sans entrer dans les détails de son contenu. Le catalogue d'objets auquel il est renvoyé par l'intermédiaire de l'attribut featureCatalogueCitation contient la description des propriétés des objets figurant dans le jeu de données. Dans la plupart des cas, le catalogue d'objets consiste en une liste exhaustive enregistrée qui n''est pas définie en fonction du jeu de données spécifique auquel le jeu de métadonnées se rapporte. La norme ne prévoit pas non plus que les objets définis dans le catalogue soient listés. Il est uniquement indiqué si le jeu de données contient effectivement des objets dont les propriétés coïncident avec celles des objets du catalogue. Vous trouverez d'autres informations sous MD_ContentInformation. + + + + + + Classe avec la description du format informatique avec lequel la représentation du jeu de donnée peut être enregistrée et transférée, sous la forme d'un enregistrement de données, d'un fichier, d'un message, d'un support de stockage ou d'un canal de transmission + Classe contenant la description du format de fichier dans lequel le jeu de données peut être stocké et transféré sur un support de données, dans un fichier, via un courrier électronique, un périphérique de stockage ou un canal de transmission. + + + + + + Classe pour le nombre d'objets utilisés par le jeu de données. Ils sont listés en fonction du type d'objet géométrique + Classe destinée au type et au nombre d'objets utilisés dans le jeu de données. Les objets sont ordonnés selon leur type géométrique. Cette information définit l'objet géométrique décrit dans la classe MD_VectorSpatialRepresentation. + + + + + + Classe pour la description du raster qui est aligné sur un système de coordonnées géographiques défini par un système à référence spatial, de telle sorte que chaque cellule puisse être localisée géographiquement avec les coordonnées raster ou l'origine du raster + Classe réservée à des trames dont les cellules sont disposées de façon régulière dans un système de coordonnées en projection ou dans un système de coordonnées géographiques défini dans le système de référence spatial, de telle sorte que chacune des cellules puisse être localisée par les coordonnées, l'origine, l'extension et l'orientation de la trame. La classe MD_Georectified permet la description de la rectification géographique de la trame. Le lien de la trame redressée avec le système de coordonnées spatial ne peut toutefois être défini que par l'intermédiaire des quatre coins de la trame. La description de l'extension spatiale de la trame de même que l'indication de points de contrôle pour la vérification de la précision du géoréférencement sont optionnels. + + + + + + Classe pour un raster, dont les cellules sont disposées irrégulièrement en fonction de différents systèmes de projections, de telle manière qu''ils ne sont pas localisables avec les propriétés du raster mais avec les informations de localisation disponible + Classe réservée à une trame dont les cellules sont disposées de façon irrégulière dans un système de coordonnées quelconque (en projection / géographique), de sorte qu''elles ne peuvent être localisées qu''à l'aide d'informations de localisation fournies et non au moyen des propriétés de la trame. La classe MD_Georeferenceable contient la description des informations concernant le géoréférencement. Il est établi une distinction dans ce cadre entre un géoréférencement par des points d'appui et par des paramètres de transformation. l'attribut "parameterCitation" permet, via le type de données CI_Citation, de fournir d'autres informations encore concernant la provenance et le service compétent ayant transmis les informations de géoréférencement. + + + + + + Classe contenant l'information sur les objets spatiaux de type raster du jeu de données + Cette classe contient des informations relatives à l'extension spatiale dans le cas d'un jeu de données tramées. Les valeurs entrées concernent les axes, les cellules, etc. Cette classe est une représentation de MD_SpatialRepresentation. Vous trouverez d'autres informations sous MD_SpatialRepresentation. + + + + + + Classe contenant une valeur codée unique à l'intérieur d'un domaine de valeurs + Cette classe contient un identifiant unique au sein d'un espace nominal. Il peut s'agir d'une description géographique (exemple : une liste de communes) ou une indication de sources (exemple : désignation d'un thésaurus). Dans la représentation RS_Identifier, l'identifiant est spécifiquement utilisé pour des systèmes de référence. MD_Identifier avec la représentation RS_Identifier peut être appelé par plusieurs attributs de la norme. + + + + + + Classe avec l'information sur l'utilisation d'une image + Classe contenant les informations relatives aux possibilités d'utilisation d'une image. + + + + + + Classe pour les mots clés, leur type et leur source de référence + Classe réservée aux mots clés, à leurs types (c.-à-d. la catégorie dont ils sont issus), de même qu''à leur référence ou à leur provenance. Les mots clés sont utilisés comme arguments de recherche. + + + + + + Classe pour les restrictions et conditions préalables légales pour accéder et utiliser les ressources où de métadonnées + Classe contenant des informations relatives aux restrictions juridiques s'appliquant à la ressource, au jeu de métadonnées ou à leur utilisation. Cette classe est une représentation de la classe MD_Constraints. Cf. MD_Constraints pour de plus amples informations. + + + + + + Classe sur la raison, l'étendue et la fréquence des mises à jour. + Les informations concernant l'étendue, la fréquence et la date de mise à jour des données sont contenues dans la classe MD_MaintenanceInformation. Cette classe recèle des attributs renseignant sur la fréquence et l'étendue de la mise à jour et de la réactualisation des données du jeu. Seule l'indication de la fréquence est impérative et doit être sélectionnée dans la liste MD_MaintenanceFrequencyCode. l'étendue de la mise à jour, les attributs qu''elle concerne et les descriptions associées sont des informations qu''il est possible d'indiquer via les attributs "updateScope" et "updateScopeDescription". Il n''est pas prévu d'indiquer l'extension spatiale de la mise à jour. Si seules des parties d'un jeu de données sont mises à jour ou si toutes ses parties ne sont pas mises à jour simultanément, alors les parties concernées par la description de la mise à jour peuvent être précisées via "+updateScopeDescription" dans la classe MD_ScopeDescription. + + + + + + Classe avec l'information sur les médias sur lesquels les données pouvent être distribuée + Classe contenant des informations relatives au support sur lequel les données peuvent être obtenues. Il s'agit d'un support hors ligne. d'autres informations peuvent être trouvées sous MD_Distribution. + + + + + + Classe qui définit les métadonnées concernant des ressources + Classe définissant les métadonnées d'une ou de plusieurs ressources. Les métadonnées peuvent se rapporter à des jeux de données entiers mais également à des objets géométriques, des attributs, des types d'objets géométriques et d'attributs ou à des agrégations de données, de séries de données ou de niveaux hiérarchiques ("hierarchyLevel"). Les relations de dépendance hiérarchique entre jeux de métadonnées peuvent être indiquées par la filiation ("parentIdentifier"). La norme ISO prévoit une relation monovalente entre jeux de métadonnées dans ce cadre, une seule filiation pouvant être indiquée et non plusieurs. La classe MD_Metadata présente également un attribut de contact avec le service compétent pour d'autres informations relatives aux métadonnées. + + + + + + Classe pour les informations décrivant les extensions du modèle de métadonnées + Classe contenant des informations décrivant les extensions des métadonnées. + + + + + + Classe avec l'information pour l'identification du catalogue de présentation utilisé + La classe MD_PortrayalCatalogueReference comprend uniquement l'attribut portrayalCatalogueCitation. Le catalogue utilisé pour la description de la représentation des objets peut être identifié ici via le type de données CI_Citation. La classe MD_PortrayalCatalogueReference permet uniquement la description des conditions marginales de la représentation "cartographique" sans tenir compte de leur mise en oeuvre. + + + + + + Classe pour l'information sur la dimension de la valeur mesurée dans chaque cellule + Classe destinée aux informations relatives aux domaines de valeurs de chacune des dimensions des valeurs mesurées dans les cellules. + + + + + + Classe pour l'information sur le système de référence + La classe MD_ReferenceSystem décrit le système de référence spatial et temporel utilisé pour le jeu de données. Dans cette classe, le lien avec le système géodésique de référence est établi à l'aide de l'attribut "referenceSystemIdentifier". Seuls le nom du système de référence et l'organisation associée sont saisis, aucun paramètre concret n''est entré. + + + + + + Classe : dérivé de ISO 19103 l'échelle, ou MD_RepresentativeFraction.denominator = 1 / Scale.measure et Scale.targetUnits = Scale.sourceUnits + Classe comportant des informations relatives à l'échelle. Seul le dénominateur de l'échelle est saisi dans cette classe. l'échelle est déduite de la norme ISO 19103. Les informations contenues dans cette classe sont requises pour la description de la résolution géométrique du jeu de données dans la classe MD_Resolution, pour l'attribut d'équivalence d'échelle ("equivalentScale"). Cf. également sous MD_Resolution. + + + + + + Classe avec le degré de détail exprimé avec un facteur d'échelle ou une distance au sol + Dans la classe MD_Resolution, le degré de spécification est indiqué en référence à l'objet. Cela signifie que la résolution d'un objet est à indiquer ici dans le cas d'une trame (exemple : la résolution spatiale d'une orthophoto de 50cm). Outre la distance au sol (distance), il est également possible de saisir une échelle pour indiquer le degré de spécification, éventualité à envisager dans le cas de données vectorielles ou tramées. l'échelle est précisée en recourant à la classe MD_RepresentativeFraction. + + + + + + Description de la classe d'information concernée par les informations + Description du domaine auquel se rapporte une information. Ces indications sont utilisées pour les informations de qualité (DQ_Quality) et les informations de mise à jour (MD_Maintenance) lorsque les caractéristiques ne sont pas homogènes sur l'ensemble du jeu de données décrit. l'un au moins de ces attributs doit être saisi. Exemple de la MO, jeu de données décrit : "Lot". La couche des biens-fonds est mise à jour en permanence, la couche de la nomenclature n''est quant à elle actualisée qu''au besoin. Si la mise à jour de la couche des biens-fonds est décrite, l'option "Biens-fonds" est entrée pour les propriétés. Les informations de qualité sont gérées sur le même modèle. Vous trouverez d'autres informations sous MD_MaintenanceInformation et DQ_DataQuality. + Il faut saisir un des attributs suivants: Attributs, Objets Géométriques, Occurences d'objets, Occurences d'attributs, Jeu de données, Autre. + + + + + Classe avec les restrictions de manipulation imposées sur les ressources où de métadonnées pour la sécurité nationale ou des situations de sécurité similaires + Classe contenant des informations relatives aux restrictions de sécurité liées à des questions de sécurité de portée nationale ou assimilée (exemple : secret, confidentialité, etc.). Cette classe est une représentation de la classe MD_Constraints. Cf. MD_Constraints pour d'autres informations. + + + + + + Classe pour l'identification des prestations, disponibles auprès un fournisseur de services, via un ensemble d'interfaces définissant un comportement (cf. ISO 19119 pour obtenir plus d'information). + Classe destinée à l'identification des services qu''un prestataire propose à l'utilisateur et dont le contenu et l'étendue sont définis par un ensemble d'informations. Dans cette classe, les domaines dans lesquels le prestataire met ses services à la disposition de l'utilisateur peuvent être saisis. l'attribut de type de service (serviceType) définit le nom du service géomatique proposé et l'attribut des propriétés du type de service (ServiceTypProperty) permet la description des caractéristiques qui lui sont associées. Ces deux attributs font appel à l'un des types de données définis dans la norme 19118. On suppose que les services géomatiques concernés sont standardisés et répertoriés au sein d'une liste. + + + + + + Classe pour la description des instructions et des modes usuels d'obtention de la ressource, comprenant également les informations sur les coûts + Classe contenant des informations relatives aux émoluments et à la commande. d'autres informations peuvent être trouvées sous MD_Distribution. + + + + + + Classe pour une brève description de la manière dont les ressources sont actuellement utilisées ou ont été utilisées + Brève description de la manière dont les ressources sont actuellement utilisées ou l'ont été, avant tout lorsqu''il s'agit d'applications spéciales poursuivant un objectif particulier. Exemple : un forestier saisit une clairière avec une précision, des signes conventionnels et des attributs bien différents de ceux qu''emploierait un biologiste. + + + + + + Classe qui contient l'information sur les objets géographiques de type vecteur du jeu de données + Cette classe contient des informations concernant l'extension spatiale lorsqu''un jeu de données vectorielles est concerné. Les valeurs entrées sont des informations relatives à la topologie et aux objets géométriques. Cette classe est une représentation de MD_SpatialRepresentation. Vous trouverez d'autres informations sous MD_SpatialRepresentation. + + + + + + Classe pour la description d'un texte libre multilingue sur des éléments de métadonnées + Classe réservée à la description d'un élément textuel de métadonnées, libre et multilingue. Le type de données PT_FreeText permet la gestion d'informations textuelles dans différentes langues. Le multilinguisme est accepté en cinq endroits différents du modèle CH-Profil : la description du contenu des données (résumé dans la classe MD_Identification), le titre d'indications de sources (titre dans CI_Citation), le nom et l'abréviation de services compétents (organisationName et organisationAcronym dans CI_ResponsibleParty), le code d'identifiants (code dans MD_Identifier) et les mots clés (keyword dans MD_Keyword). + + + + + + Classe pour l'identifiant utilisé pour les systèmes de référence + Classe réservée aux identifiants de systèmes de référence. Cette classe est une représentation de MD_Identifier pour l'identification d'un système de référence par des attributs supplémentaires. Cf. également sous MD_Identifier. + + + + + + Classe destinée à la description d'un élément de métadonnées URL libre multilingue + Classe destinée à la description d'un élément de métadonnées URL libre multilingue. Le type de données PT_FreeText permet de gérer des informations textuelles en plusieurs langues. + + + + + Court résumé explicatif du contenu des ressources + Court résumé descriptif du contenu du jeu de données. Cet attribut est du type PT_FreeText et est géré dans la classe du même nom. + Obligatoire + + + + + Contraintes d'accès appliquées pour assurer la protection de la propriété privée et intellectuelle, et autres restrictions spéciales ou limitations pour obtenir la ressource où de métadonnées + Restrictions d'accès relatives à la garantie de la propriété privée ou intellectuelle et restrictions de toutes natures visant à la conservation de la ressource ou des métadonnées. Elles peuvent être sélectionnées parmi les éléments suivants : droit d'auteur, brevet, brevet en voie de délivrance, marque, licence, propriété intellectuelle, diffusion limitée, autres restrictions. + + + + + + + Adresse physique et électronique à laquelle la personne ou l'organisation responsable peut être contactée + Adresse postale ou électronique d'un premier niveau de contact (par exemple un secrétariat). Ces informations sont du type CI_Address et sont gérées dans la classe du même nom. + + + + + + Canton ou département de l'emplacement + Canton + + + + + + Informations d'identification sur le jeu de données rassemblé + Informations d'identification des jeux de données de rang inférieur. Identification sans équivoque d'un objet au sein d'un espace nominal et indication du service responsable de ce nom et de son actualisation. Ces informations sont du type MD_Identifier et sont gérées dans la classe du même nom. + Condition + + + + Informations de référence sur le jeu de données rassemblé + Nom et autres indications de sources des jeux de données de rang inférieur. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. + Condition + + + + Met à dispositionles les informations sur le jeu de données rassemblé + Informations concernant le jeu de données de rang supérieur et les relations qu''il entretient avec le jeu de données décrit. Ces informations sont du type MD_AggregateInformation et sont gérées dans la classe du même nom. + + + + + + Nom raccourci ou autre façon d'écrire le nom, sous lequel l'information des informations de références est connue. Exemple : DCW pour "Digital Chart of the World" + Nom abrégé ou orthographe du titre/nom différente de celle sous laquelle l'information correspondante est connue. Exemple : DCW pour "Digital Chart of the World" + + + + + + Numéro d'amélioration du format + Numéro de la modification apportée au format. + + + + + + Nom d'un profil d'application qui peut être utilisé avec les ressources en ligne + Nom d'un profil d'application pouvant être utilisé pour la source en ligne. + + + + + + Informations sur le schéma conceptuel du jeu de données + Informations relatives au schéma conceptuel du jeu de données + + + + + + Type d'association sur le jeu de données rassemblé + Type de relation entre jeux de données de rang inférieur, autrement dit, nature du lien unissant les deux jeux de données. La sélection s'opère dans la liste suivante : transfert à titre de comparaison, comparaison avec le jeu de données de rang supérieur, partie d'une structure de données identique, renvoi à une source, couple stéréoscopique. + + + + + + Description de l'attribut décrit par la valeur mesurée + Description de l'attribut décrit par la valeur mesurée. + Obligatoire + + + + + Occurrences d'attributs sur lesquels l'information s'applique + Occurrences d'attributs auxquelles les informations se rapportent. + + + + + Attributs sur lesquels l'information s'applique + Attributs auxquels les informations se rapportent. + + + + + Personne ou service responsable pour la maintenance du domaine de valeurs + Personne ou organisation responsable de cet espace nominal, par exemple un service. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. + + + + + + Information sur les propriétés des axes spatio-temporels + Informations relatives aux propriétés des axes spatio-temporels telles que le nom, la dimension et la résolution. Ces informations sont du type MD_Dimension et sont gérées dans la classe du même nom. + + + + + + Nombre maximum de bits significatifs dans la représentation non-comprimée de la valeur dans chaque bande de chaque pixel + Nombre maximal de bits significatifs dans la représentation non comprimée de la valeur dans chaque gamme et dans chaque pixel. + + + + + + Indication si oui ou non les constantes pour les corrections de la calibration de la caméra sont à disposition + Indication de la présence éventuelle de constantes pouvant être utilisées pour les corrections d'étalonnage de chambre. + + + + + + Identification du type de raster (point ou cellule) + Définition du type de trame (point ou cellule). + Obligatoire + + + + + Relation du système de coordonnées raster au système de référence spatiale définie par la cellule du centre du raster et par les coordonnées correspondantes du système de référence spatiale + Lien du système de coordonnées de la trame avec le système terrestre défini par la cellule centrale de la trame et les coordonnées correspondantes dans le système de référence spatial. + + + + + + Nom complet du standard de code de caractères utilisé pour le jeu de métadonnées + Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. + Par défaut UTF-8 + + + + Nom entier du standard de code de caractères utilisé pour le jeu de données + Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. + Par défaut UTF-8 + + + + Nom complet du standard de code de caractères utilisé pour le jeu de métadonnées + Nom complet du code de caractères normalisé utilisé pour le fichier de métadonnées. Le paramètre par défaut est "utf8". Les fichiers de texte contiennent normalement des valeurs d'octets représentant un sous-ensemble de valeurs de caractères via un codage (8859_1, ISO Latin-1), un format de transfert (Unicode-Transfer-Format UTF8) ou tout autre moyen. + Par défaut UTF-8 + + + + Indication si oui ou non des points de contrôle sont disponibles pour tester la précision des données raster géoréférencées + Indication de l'existence ou de l'absence de points de contrôle pour tester la précision du géoréférencement de la trame. + Obligatoire + + + + + Description des points de contrôle utilisés pour tester la précision des données raster géoréférencées + Description des points de contrôle utilisés pour tester la précision du géoréférencement de la trame. + Condition + + + + Informations de référence sur les ressources + Indication des sources du jeu de données décrit. Le nom ou le titre du fichier du jeu de données de même qu''une date du type adéquat (création, publication, traitement) sont gérés ici. Cet attribut est du type CI_Citation et est géré dans la classe du même nom. + + + + + + + Information sur le nom et la position d'une personne individuelle ou d'une organisation responsable pour la ressource + Informations concernant le nom et la domiciliation de la personne ou de l'organisation responsable de la source citée. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. + + + + + + Ville de l'emplacement + Ville, localité + + + + + + Noms des restrictions de manipulation sur les ressources où de métadonnées + Type de restriction. Sélection dans la liste suivante : non classé, diffusion restreinte, confidentiel, secret, top secret. + Obligatoire + + + + + Nom du système de classification + Le nom du système de classification peut être indiqué ici, s'il en existe un. + + + + + + Surface du jeu de données recouverte par les nuages, exprimée en pourcentage de la couverture spatiale + Surface du jeu de données images assombrie par des nuages (en pourcentage de la surface totale). + + + + + + Valeur alphanumérique pour l'identification d'une occurrence dans le domaine de valeurs + Code alphanumérique de l'identifiant. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. + Obligatoire + + + + + + Nom ou identification de la personne ou de l'organisation responsable pour la domaine de valeurs + Informations sur la personne ou l'organisation en charge de l'espace nominal ou de l'identifiant. + + + + + + Titre commun avec indication d'une appartenance. Note : le titre identifie des éléments d'une série collective, combiné avec l'information sur quels volumes sont à disposition à la source citée + Cet élement est utilisé en Suisse pour designer le nom d'une géodonnées de base qui correspond à l'entrée du catalogue Annexe I de la OGéo, car il est possible que plusieurs jeux de données "physiques" soient attribuée à une entrée "juridique". Ex.: L'entrée no. 47 "Cartes géophysiques" consiste de 3 jeux de données "Cartes géophysiques 1:500000", "Cartes géophysisques spéciales" et "Atlas gravimétrique 1:100000" + + + + + + Indication de la conformité du catalogue d'objets avec l'ISO 19110 + Indication de la conformité du catalogue d'objets mentionné avec la norme ISO 19110 + + + + + + Nombre de cycles de compressions (avec pertes) appliqués à l'image + Nombre de cycles de compression (avec pertes) appliqués à l'image + + + + + + Condition sous laquelle l'élément étendu est obligatoire + Condition sous laquelle l'élément est obligatoire. + + Condition + + + + Langage formelle utilisée dans le schéma d'application + Langage formel utilisé pour le schéma d'application. + Obligatoire + + + + + Organisme responsable pour les informations que contiennent les métadonnées. + Rôle (propriétaire, prestataire, gestionnaire, etc.) de la personne ou du service compétent pouvant être sélectionné dans la liste présentée ici. Cet attribut renvoie à la classe CI_ResponsibleParty dans laquelle les informations relatives au service ou à la personne concernée sont gérées. Cet attribut est du type CI_ResponsibleParty et est géré dans la classe du même nom. + Obligatoire + + + + + Indications concernant la personne ou l'organisation qui est responsable de la mis à jour des métadonnées + Informations concernant la personne ou l'organisation responsable de la mise à jour des données. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. + + + + + + Organisme responsable pour les informations que contiennent les métadonnées. + Rôle (propriétaire, prestataire, gestionnaire, etc.) de la personne ou du service compétent pouvant être sélectionné dans la liste présentée ici. Cet attribut renvoie à la classe CI_ResponsibleParty dans laquelle les informations relatives au service ou à la personne concernée sont gérées. Cet attribut est du type CI_ResponsibleParty et est géré dans la classe du même nom. + Obligatoire + + + + + Heures de service du service responsable + Adresse du service responsable. Ces informations sont du type CI_Contact et sont gérées dans la classe du même nom. + + + + + + Instructions supplémentaires sur quand et comment contacter la personne ou l'organisation responsable + Informations supplémentaires pour la prise de contact. + + + + + + Informations sur le catalogue d'objet et sur les descriptions de la couverture et des charactéristiques raster + Description du contenu du jeu de données. Renvoi au catalogue d'objets, au modèle de données ou à la description des données. Le contenu de ces catalogues et de ces descriptions ne fait toutefois pas partie des métadonnées. Ces informations sont gérées dans la classe MD_ContentInformation. + + + + + + Type d'information représenté par la valeur de la cellule + Type d'information représenté par la valeur de la cellule. La cellule est une image, une classification thématique ou une mesure physique. + Obligatoire + + + + + Indication si oui ou non des points de contrôle existent + Indication de l'existence ou de l'absence de points d'appui pour le géoréférencement. + Obligatoire + + + + + Relation du système de coordonnées raster au système terrestre définie par les cellules des quatre coins du raster et par les coordonnées correspondantes du système de référence spatial + Lien du système de coordonnées de la trame avec le système terrestre défini par les cellules des quatre coins de la trame et les coordonnées correspondantes dans le système de référence spatial. + Obligatoire + + + + + Pays dans la langue duquel l'URL libre est écrit + Pays dans la langue duquel l'URL libre est écrit, la sélection s'opère dans la liste des pays ISO. + + + + + Pays d'où provient la loi + Pays dans lequel la loi a été promulguée, sélection dans la liste ISO des pays. + + + + + + Pays de la langue dans le lequel le texte libre est écrit + Pays dans la langue duquel le texte libre est rédigé. Sélection dans la liste ISO des pays. + + + + + + Reconnaissance de ceux qui ont contribués à ces ressources + Reconnaissance ou confirmation des intervenants ayant apporté leur contribution à cette ressource. + + + + + + Estimation de la qualité des ressources + Estimation de la qualité du jeu de données. Ces informations sont gérées dans la classe DQ_DataQuality. + + + + + + Uniformed Resource Identifier (URI) du jeu de données, que les métadonnées décrivent + Identifiant URI (Uniformed Resource Identifier) du jeu de données auquel les métadonnées renvoient. Une adresse URL est indiquée ici, par exemple www.cosig.ch. + + + + + + Code qui identifie le genre de valeur fourni dans l'élément étendu + Code définissant le type de données de l'élément étendu. + Obligatoire + + + + + Jeu de données sur lequel l'information s'applique + Jeu de données auquel les informations se rapportent. + + + + + + Date de la prochaine mise à jour de la ressource + Date de la prochaine mise à jour (jj.mm.aaaa). + + + + + + Date de référence pour la ressource en question + Date de référence indiquée sous forme de date (jj.mm.aaaa) et de type de date (création, publication, traitement). Ces informations sont du type CI_Date et sont gérées dans la classe du même nom. + + + + + + Date de référence pour la ressource en question + Date de référence (jj.mm.aaaa) + + + + + + Date de la prochaine mise à jour de la ressource + Date de la prochaine mise à jour (jj.mm.aaaa). + + + + + + Date de création des métadonnées + Date de création des métadonnées. Elle est automatiquement attribuée par l'application. + Obligatoire + + + + + + Date et heure, ou période, à laquelle l'étape de processus s'est réalisée + Date à laquelle ou période au sein de laquelle le processus de traitement a été effectué. Indication en format horaire jj.mm.aaaa/ hh.mm.ss + + + + + + Date ou période pendant laquelle une mesure de qualité des données a été appliquée + Date à laquelle ou période durant laquelle la qualité des données a été déterminée. + + + + + + Evénements en relations avec la date + Evénement auquel la date se rapporte (création, publication, traitement), respectant le type de la date. + Obligatoire + + + + + Définition de l'élément étendu + + Obligatoire + + + + + Adresse de l'emplacement (comme décrit dans ISO 11180, Annexe A) + Nom de la rue + + + + + + Le dénominateur de l'échelle (le chiffre en dessous de la barre de fraction) + La valeur se trouvant sous la barre de fraction. Il s'agit ici de l'échelle : dans le cas d'une carte à l'échelle du 1:25000, seul le terme "25000" est entré. Cette valeur peut également représenter une indication de précision dans le cas d'un jeu de données vectorielles. Exemple : des limites saisies à une échelle de 1:25'000 et présentant ce niveau de précision. + Il faut saisir ou une échelle ou une distance + + + + + + + + + + + + + + + + + + Densité d'écriture sur le medium + Densité d'écriture sur le support concerné. + + + + + + Unité de mesure pour la densité d'enregistrement + Unité de mesure de la densité d'écriture. + + Condition + + + + Description de l'événement, incluant les paramètres ou tolérances y relatifs + Description du processus (étape de traitement) pouvant inclure la description de paramètres ou de tolérances. + Obligatoire + + + + + Description détaillée de l'état des données sources + Description des données source. + + + + Etendue spatiale et temporelle pour l'objet en question + Description sous forme textuelle de l'extension spatiale et temporelle de l'objet considéré. + + + + + Texte descriptif détaillé sur ce que la ressource en ligne est/fait + Description détaillée de ce que propose la source en ligne. + + + + + + Catégorie, type et source de référence des mots clés + + En Europe, si la ressource est une série de données géographiques ou un ensemble de séries de données géographiques, il + convient de fournir au moins un mot clé du thésaurus multilingue de l’environnement (GEMET, General Environ­mental Multi-lingual Thesaurus) + décrivant le thème dont relèvent les données géographiques, conformément aux + définitions des annexes I, II ou III de la directive 2007/2/CE. + + + Catégorie du mot clé, décrivant si ce dernier concerne la discipline, le lieu, la couche, l'intervalle de temps, ou le thème. Ces informations sont gérées dans la classe MD_Keywords. + + + + + + Description de l'étendue de la valeur mesurée sur une cellule + Description du domaine de valeurs mesurées dans une cellule. + + + + + + Informations sur les dimensions des cellules + Informations concernant les dimensions des valeurs mesurées dans les cellules. + + + + + + Nom de l'axe + + Obligatoire + + + + + Nombre d'éléments le long de cet axe + Nombre de cellules le long de cet axe + Obligatoire + + + + + Distance de référence, mesurée au sol + Résolution au sol + Saisir une distance si pas d'échelle + + + + + + + + + + + + + Description du format de distribution + Description du format de distribution. Ces informations sont gérées dans la classe MD_Format. + + + + + + Informations sur le distributeur et sur la façon d'acquérir les ressources + Informations relatives au distributeur et au mode d'acquisition de la ou des ressources. Indications concernant le lieu et la forme d'obtention des données. Ces informations sont gérées dans la classe MD_Distribution. + + + + + + Informations sur comment les données peuvent êtres commandées, ainsi que sur leur coûts et sur les formatlités de commandes + Informations relatives au mode de commande des données, à leur coût ainsi qu''à d'autres instructions de commande. Ces informations sont gérées dans la classe MD_StandardOrderProcess. + + + + + + Informations sur le distributeur et sur la façon d'acquérir les ressources + Informations relatives au distributeur. + + + + + + Services depuis lesquels la ressource peut être obtenue. Cette liste n''a pas besoin d'être exhaustive + Personne ou organisation compétente auprès de laquelle le jeu de données peut être obtenu. Une seule information est permise. La référence est du type de données CI_ResponsibleParty et est gérée dans la classe du même nom. + Obligatoire + + + + + Informations sur le format utilisé par le distributeur + Informations relatives au format utilisé par le distributeur (nom et version du format, par exemple TIFF, version 6.0). Ces informations sont gérées dans la classe MD_Format. + Condition + + + + + Informations concernant la technique et le média utilisés par le distributeur + Informations concernant le mode et le support de diffusion utilisés par le distributeur, par exemple la taille du fichier, la manière de l'obtenir, etc. Ces informations sont gérées dans la classe MD_DigitalTransferOptions. + + + + + + Trois codes digitaux attribués à l'élément étendu + Code à trois chiffres affecté à l'élément étendu. + + Condition + + + + Domaine de validité pour le système de référence + Domaine de validité du système de référence géographique. + + + + + + Valeurs valides qui peuvent être assignées à l'élément étendu + Valeurs licites pouvant être affectées à l'élément étendu. + + Condition + + + + Coordonnée la plus à l'est de la limite de l'étendue du jeu de données, exprimée en longitude avec des degrés décimaux (EST positif) + Limite est de l'extension du jeu de données, exprimée en longitude géographique (degrés décimaux) comptée positivement vers l'est. + Obligatoire + + + + + Version de la ressource en question + Version/édition de la source mentionnée + + + + + + Date de l'édition + Date de la version / de l'édition (jj.mm.aaaa). + + + + + + Adresse du courrier électronique de l'organisation ou de la personne individuelle responsable + Adresse de courrier électronique de l'organisation ou de la personne responsable + + + + + + Description de l'environnement de travail dans lequel le jeu de données a été créé, incluant des choses telles que logiciel, système d'exploitation, nom de fichier et taille du jeu de données + Description de l'environnement de travail dans lequel le jeu de données est créé, incluant des éléments tels que le logiciel utilisé, le système d'exploitation, le nom et la taille du fichier. + + + + + + Degré de détail exprimé avec l'échelle d'un graphique ou carte papier comparable + Degré de spécification exprimé au moyen de l'échelle d'une carte ou d'un graphique analogique comparable. + Cette échelle peut également indiquer la précision de la saisie dans le cas d'un jeu de données vectorielles. + Cette information est du type MD_RepresentativeFraction et est gérée dans la classe du même nom où de plus amples renseignements peuvent être obtenus. + + + Condition + + + + Méthode statistique utilisée pour déterminer la valeur + Méthode statistique utilisée pour la détermination de la valeur. + + + + + + Description des méthodes d'évaluation + Description de la méthode d'appréciation. + + + + + + Type de méthodes utilisées pour évaluer la qualité du jeu de donnée + Méthode utilisée pour apprécier la qualité du jeu de données. + + + + + + Référence à l'information sur la procédure + Renvoi à la description de la procédure. + + + + + + Explication de la signification de conformance pour ces résultats + Explication de la signification de la concordance pour ce résultat. + Obligatoire + + + + + Informations relatives à un nouvel élément de métadonnées requis pour la description des données géographiques, mais absent de la norme ISO19115. + + + + + + + Information sur les sources en ligne décrivant le profil d'un domaine d'application spécifique ainsi que les extensions du modèle. Information sur tous les nouveaux éléments de métadonnées. + Informations relatives à des sources en ligne contenant le profil de la communauté d'utilisateurs de même que des éléments de métadonnées étendus. Informations concernant tous les nouveaux éléments de métadonnées. + + + + + Information complémentaire sur les étendues spatiales et temporelles du jeu de données, incluant le polygone de délimitation et les dimensions verticales et temporelles + Informations supplémentaires concernant l'extension spatiale et temporelle des données, incluant le polygone de délimitation, les altitudes et la durée de validité. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. + Condition + + + + Information sur les domaines horizontaux, verticaux et temporels des données spécifiées par l'attribut scope (79) du domaine d'applicabilité + Informations relatives à l'extension horizontale, verticale et temporelle des données conformément au domaine de validité défini. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. + Condition + + + + + Date et temps pour le contenu du jeu de donnée + Date et heure du domaine de validité du jeu de données (texte). + Condition + + + + + Indication si le polygone de délimitation recouvre une surface recouverte par des données ou une surface ne comportant pas de données + Indication du fait de savoir si le polygone de délimitation définit une zone recouverte ou exempte de données du jeu de données. + + + + + + Numéro de fax de la personne ou organisation responsable + Numéro de télécopieur. + + + + + + Référence bibliographique complète à un ou plusieurs catalogues d'objets externes + Référence bibliographique complète vers un ou plusieurs catalogues d'objets externes. La référence est du type de données CI_Citation et est gérée dans la classe du même nom. + Obligatoire + + + + + Occurrences d'objets sur lesquels l'information s'applique + Occurrences de propriétés auxquelles les informations se rapportent. + + + + + Sous-ensemble de types d'objets, tirés du catalogue d'objets cité, intervenant dans le jeu de données + Sous-ensemble des types d'objets du catalogue cité, présents dans le jeu de données. + + + + + + Objets sur lesquels l'information s'applique + Propriétés auxquelles les informations se rapportent. + + + + + Taxes et conditions pour accéder à la ressource. Les unités monétaires sont incluses (comme spécifié dans ISO 4217) + Emoluments relatifs à l'obtention ou à l'utilisation des données. Indications fournies dans les unités monétaires définies dans la norme ISO 4217. + + + + + + Recommandations sur les algorithmes et les processus qui peuvent être appliqués pour lire ou ouvrir une ressource, à laquelle des techniques de compressions ont été appliquées. + Remarques relatives aux algorithmes ou aux processus à mettre en ?uvre pour la lecture ou l'extension de la ressource en cas de compression de cette dernière. + + + + + + Description textuelle de l'illustration du jeu de données + Description de la représentation figurative du jeu de données. Elle indique ce qui est présenté, le degré d'adaptation avec le jeu de données sélectionné, etc. + + + + + + Identifiant unique pour ce fichier de métadonnées + Identifiant unique pour ce fichier de métadonnées. Il correspond à un et un seul nom de fichier. + + + + + + Nom du fichier qui contient le graphique contenant une illustration du jeu de données + Nom du fichier contenant une représentation figurative du jeu de données. + + + + + + Format dans lequel l'illustration est enregistrée. Exemple : CGM, EPS, GIF, JPEG, PBM, PS, TIFF, XWD + Format dans lequel la représentation est enregistrée, ex : CGM, EPS, GIF, JPEG, PBM, PS, TIFF, XWD + + + + + + Indication si oui ou non le protocole de calibration est à disposition + Indication de la présence éventuelle de valeurs d'étalonnage d'un réseau. + + + + + + Informations sur le format de distribution + Informations relatives au distributeur, aux coûts et aux modalités de commande. Elles sont gérées dans la classe MD_Distributor. + + + + + + Code pour une fonction accomplie par la ressource on-line + Rôle de la source en ligne, sélection dans la liste suivante : téléchargement, information, accès hors ligne, commande ou recherche. + + + + + + Informations sur l'etendue géographique + Informations concernant l'extension géographique. Ces informations sont gérées dans la classe EX_GeographicExtent. + Condition + + + + Identifiant utilisé pour représenter une surface géographique + Identifiant servant à la définition sans équivoque d'une zone géographique. Le code d'identification (MD_Identifier.code) correspond par exemple au numéro communal à 4 chiffres de l'OFS s'il s'agit du territoire d'une commune. Ces informations sont du type MD_Identifier et sont gérées dans la classe du même nom. + Obligatoire + + + + + Nombre total d'objets de type point ou vecteur intervenant dans le jeu de données + Nombre de points ou d'objets vectoriels présents dans le fichier. + + + + + + Nom des objets spatiaux point et vecteur utilisés pour localiser les positions à zéro, une, deux et trois dimensions dans le jeu de données + Nom du type d'objet géométrique. Sélection dans la liste suivante : complexe, combinaison, ligne ouverte, point, primitive en 3D, ligne fermée. + + + + + + Information sur les objets géométriques utilisés dans le jeu de données + Informations concernant les objets géométriques utilisés dans le jeu de données. Ces informations sont du type MD_GeometricObjects et sont gérées dans la classe du même nom. + + + + + + Indication sur les données de géoréférencement du raster + Valeurs numériques contenant les données de géoréférencement de la trame. + + + + + + Vue générale graphique illustrant les ressources (y inclus une légende) + Vue d'ensemble graphique de la ressource (légende incluse). Ces informations sont gérées dans la classe MD_BrowseGraphic. + + + + + + Schéma d'application entièrement donné dans un graphique + Représentation graphique du schéma d'application complet. + + + + + + Information complémentaire sur les restrictions au sujet de la manipulation des ressources où de métadonnées + Description de la manière dont la restriction est à appliquer, des cas dans lesquels elle doit l'être et des exceptions recensées. + + + + + + Domaine auquel les métadonnées s'appliquent (voir l'annexe C pour plus d'information au sujet des niveaux de hiérarchie des métadonnées) + Domaine auquel les métadonnées se rapportent. La catégorie d'informations à laquelle l'entité se réfère peut être indiquée dans la liste des codes (exemple : attributs, objets géométriques, jeu de données, etc.). "Jeu de données" est le paramètre par défaut. + Par défaut: "jeu de données" + + + + Nom du niveau de hiérarchie pour lequel les métadonnées sont produites + Nom du niveau hiérarchique auquel les métadonnées se rapportent. Il peut par exemple s'agir du nom d'une série. + Condition + + + + Période de temps (incluant aussi le fuseau horaire) pendant laquelle la personne ou l'organisation responsable peut être contactée + Heures d'ouverture, indications fournies sous forme de texte libre, par exemple : "08h00 - 11h45h et 13h30 - 17h00" ou "De 08h00 à 11h45 et de 13h30 à 17h00" + + + + + + Informations de base sur les ressources concernées par les métadonnées + Informations de base concernant la ressource (voire les ressources) ou le jeu de données auquel se rapportent les métadonnées. Ces informations sont gérées dans la classe MD_IdentificationInformation. + + + + + + Identificateur de l'indication de provenance + Identificateur de l'indication de provenance. La classe MD_Identifier permet d'affecter une indication de provenance à un registre existant. + Condition + + + + + Angle d'azimut mesuré en degré dans le sens des aiguilles d'une montre entre le nord géographique et la ligne optique au moment de la prise de vue. Pour les images scannées, le pixel central prend le rôle de la ligne optique + Azimut d'éclairage mesuré en degrés sexagésimaux dans le sens horaire à compter du nord géographique au moment de la prise de vues. Pour les images scannées, la référence est le pixel central. + + + + + + Angle d'élévation mesuré en degré dans le sens des aiguilles d'une montre entre a. l'intersection de la ligne optique et le plan cible et b. la surface terrestre. Pour les images scannées, le pixel central prend le rôle de la ligne optique + Angle vertical d'éclairage mesuré en degrés sexagésimaux dans le sens horaire à compter du plan cible à l'intersection de la ligne de visée optique avec la surface terrestre. Pour les images scannées, la référence est le pixel central. + + + + + + Connaissances qui spécifient la qualité de l'image + Identification spécifiant la qualité de l'image + + + + + + Conditions affectant l'image + Contraintes auxquelles l'image est soumise. + + + + + + Indications si oui ou non le catalogue d'objets est inclus dans le jeu de données + Indication de la présence ou de l'absence du catalogue d'objets dans le jeu de données. + + + + + + Nom de la personne responsable. Prénom, nom et titre sont séparés par un signe de délimitation + Nom de la personne responsable. Des séparateurs (virgules) figurent entre le prénom, le nom et le titre. + Condition + + + + Type d'initiative pour laquelle le jeu de données rassemblé a été produit + Type de l'initiative ou du projet ayant motivé la saisie des données de rang inférieur (exemple : campagne, collecte, analyse, mission, étude, etc.) + + + + + + Information identifiant l'édition des séries + Informations concernant l'édition ou le numéro d'édition de la série. + + + + + + Mots, notions ou phrases courants utilisés pour décrire le sujet + Mots clés du jeu de données par l'intermédiaire desquels il peut être caractérisé et défini. Ces termes sont également utilisés en tant qu''arguments de recherche. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. + + + + + + Langue utilisée pour documenter les métadonnées + Langue utilisée pour la documentation des métadonnées. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... + Obligatoire + + + + Langue utilisée pour le jeu de données + Langue utilisée pour la documentation des données. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... + Obligatoire + + + + + Langues utilisées dans le catalogue + Langue utilisée dans le catalogue d'objets. La sélection s'opère dans la liste des langues ISO. Exemple : "fr" pour le français, "de" pour l'allemand, "en" pour l'anglais, "it" pour l'italien, "rm" pour le romanche, ... + + + + + + Indication si oui ou non des informations sur la corrections de fautes dues aux lentilles sont à disposition + Indication de la présence éventuelle de valeurs de correction de la distorsion de l'objectif ayant servi à la prise de vue. + + + + + + Niveau hiérarchique des données spécifiées par l'attribut scope (79) du domaine d'applicabilité + Domaine auquel s'appliquent les informations de qualité. La catégorie à laquelle se rapporte cette information peut être indiquée dans la liste de codes (exemple : attributs, objets géométriques, jeu de données, etc.). + Obligatoire + + + + + Description détaillée sur le niveau des données spécifiées par l'attribut scope (79) du domaine d'applicabilité + Description détaillée du domaine des données. Ces données sont gérées dans la classe MD_ScopeDescription. + Obligatoire si niveau hiérarchique autre que "jeu de données" + + + + Informations de qualité concernant la provenance des données + Informations relatives à la provenance, à la filiation ou au processus de génération. Elles sont gérées dans la classe LI_Lineage. "+lineage" est obligatoire si "scope.DQ_Scope.level" = "Jeu de données". + Condition + + + + URL ou indication semblable d'une adresse Internet pour un accès on-line , par exemple http://www.isotc211.org + Lien Internet, par exemple www.cosig.ch. + + + + + + Fréquence avec laquelle des changements et des ajouts sont fait à la ressource après que la ressource initiale ait été complétée + Fréquence à laquelle des changements et des ajouts sont apportés à la ressource. La valeur concernée est à sélectionner dans la liste suivante : en permanence, quotidienne, hebdomadaire, bimensuelle, mensuelle, trimestrielle, semestrielle, annuelle, au besoin, irrégulière, non prévue, inconnue, définie par l'utilisateur. + Obligatoire + + + + + Informations ou remarques en ce qui concerne les besoins spécifiques concernant la maintenance des ressources + Informations ou remarques concernant la prise en compte de besoins spécifiques lors de la mise à jour des ressources. + + + + + + Longueur d'onde la plus longue que le senseur est capable de collecter à l'intérieur d'une bande donnée + Longueur d'onde la plus élevée à laquelle le capteur est capable d'effectuer une mesure au sein de la gamme mentionnée. + + + + + + Indication de l'altitude du point le plus haut du jeu de données + Altitude du point le plus élevé du jeu de données + Obligatoire + + + + + Description des tests + Description de la mesure (test). + + + + + + Code identifiant une procédure standard enregistrée + Identification d'une procédure normalisée enregistrée + + + + + + Méthode utilisée pour écrire dans le média + Format d'écriture utilisé pour le support considéré. La sélection peut s'effectuer parmi les formats suivants : cpio, tar, highSierra, iso9660, iso9660Rockridge, iso9660AppleHFS. + + + + + + Description d'autres restrictions ou exigences pour l'utilisation du média + Descriptions complémentaires ou informations importantes concernant le support telles que des restrictions, des exigences, etc. + + + + + + Contraintes sur l'accès et l'utilisation des métadonnées + Restrictions d'accès et d'utilisation des métadonnées (exemple : copyright, conditions d'octroi de licence, etc.). Ces informations sont gérées dans la classe MD_Constraints. + + + + + + Contraintes sur l’accès et l’utilisation des métadonnées + + + + + + + Informations décrivant l'extension des métadonnées + Informations décrivant des extensions de métadonnées + + + + + + Informations sur la fréquence de mise à jour des métadonnées, ainsi que de leur étendue + Informations concernant la fréquence, l'étendue, la date et la validité des mises à jour. Ces informations sont gérées dans la classe MD_MaintenanceInformation. + + + + + + Nom du standard (incluant le nom du profil) de métadonnées utilisé + Nom de la norme sur les métadonnées utilisée, profil inclus (exemple : GM03Core, GM03Profil). + + + + + + Version (du profil) du standard de métadonnées utilisé. + Version (du profil) de la norme sur les métadonnées utilisée. + + + + + + Longueur d'onde la plus courte que le senseur est capable de collecter à l'intérieur d'une bande donnée + Longueur d'onde la plus courte à laquelle le capteur est capable d'effectuer une mesure au sein de la gamme mentionnée. + + + + + + Indication de l'altitude du point le plus bas du jeu de données + Altitude du point le plus bas du jeu de données. + + + + + + + Nom du média sur lequel les données pouvent être obtenues + Type de support sur lequel les données peuvent être obtenues, par exemple CD-ROM, DVD, DVD-ROM, disquette, etc. (sélection dans une liste). + Obligatoire + + + + + Nom du système de référence utilisé + Nom du système de référence utilisé. + Obligatoire + + + + + Nom des formats de transfert des données + Nom du format de transfert de données, par exemple TIFF, ZIP, etc. + Obligatoire + + + + + Nom de l'élément de métadonnée étendu + Nom de l'élément de métadonnées étendu. + Obligatoire + + + + + Nom du schéma d'application utilisé + Nom du schéma d'application utilisé. + Obligatoire + + + + + Nom de la ressource en ligne + Nom de la source en ligne. + Obligatoire + + + + + Nom des séries ou du jeu de données global desquels le jeu de donnée est une partie + Nom de la série ou du jeu de données composé dont émane le jeu de données. + Obligatoire + + + + + Name of the series, or aggregate dataset, of which the dataset is a part + + Obligatoire + + + + + Nom des tests qui ont été appliqués aux données + Nom du test appliqué aux données. + + + + + + Coordonnée la plus au nord de la limite de l'étendue du jeu de données, exprimée en latitude avec des degrés décimaux (NORD positif) + Limite nord de l'extension du jeu de données, exprimée en latitude géographique (degrés décimaux) comptée positivement vers le nord. + + + + + + Nombre d'axes spatio-temporels indépendants (nombre de dimensions) + + + + + + + Obligation de l'élément étendu + Niveau d'obligation associé à l'élément étendu (obligatoire, optionnel ou obligatoire sous certaines conditions). + + Condition + + + + Information sur les médias off-line depuis lesquels la ressource peut être obtenue + Informations concernant le support hors ligne sur lequel le jeu de données peut être obtenu. Ces informations sont gérées dans la classe MD_Medium. + + + + + + Valeur physique correspondant à la valeur zéro d'une cellule + Valeur physique correspondant à la valeur zéro d'une cellule. + + + + + + Information sur les sources en ligne depuis lesquelles la ressource peut être obtenue + Informations relatives à la source en ligne via laquelle le jeu de données peut être acquis. Ces informations sont du type CI_OnlineRessource et sont gérées dans la classe du même nom. + + + + + + Information on-line qui peut être utilisée pour contacter la personne ou l'organisation responsable + Information en ligne, par exemple l'adresse Internet de l'organisation. + + + + + + Instructions générales, conditions et services offerts par le distributeur + Instructions générales, délais et services offerts par le distributeur + + + + + + Nom de l'organisation responsable + Nom de l'organisation responsable, s'il s'agit d'une personne isolée ou nom de l'organisation au sein de laquelle cette personne est employée. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. + Condition + + + + Indication si oui ou non des paramètres d'orientation sont disponibles + Indication de l'existence ou de l'absence de paramètres d'orientation pour le géoréférencement. + + + + + + Description des paramètres utilisés pour décrire l'orientation des senseurs + Description des paramètres utilisés pour l'orientation du capteur. + + + + + + Type d'information qui ne se laisse classer dans aucune des autres possibilités de choix + Description des informations ne se laissant classer dans aucune des autres possibilités de choix. + + + + + Autre information utilisée pour compléter les informations de référence qui ne sont pas prévues ailleurs + Autre information requise pour une description complète de la source, non saisie ou impossible à saisir dans un autre attribut. + + + + + + Autres restrictions et prérequis légaux pour accéder et utiliser les ressources où de métadonnées + Autres restrictions et conditions préalables de nature juridique concernant l'accès et l'utilisation de la ressource ou des métadonnées. Ce champ doit être complété dès lors que l'un des deux champs précédents (accessConstraints, useConstraints) porte la mention "Autres restrictions". + Condition + + + + Détails sur quelles pages de la publication l'article a été publié + Indication détaillée des numéros de pages de l'article dans la publication concernée ou du jeu de données dans la série considérée. + + + + + + Référence bibliographique sur les paramètres + Titre et date (citation) avec la description des paramètres + + + + Nom des entités de métadonnées sous lesquelles l'élément étendu de métadonnée pourrait apparaître. Les noms devraient être des éléments de métadonnées standards ou d'autres éléments de métadonnées étendus + Nom de la ou des classes de métadonnées dans lesquelles apparaît cet élément de métadonnées étendu. Le nom peut être celui d'une classe standard ou d'une classe étendue. + Obligatoire + + + + + Identifiant du fichier de métadonnées parent. + Nom unique du fichier de métadonnées parent ou origine. Il peut s'agir d'un modèle prédéfini ou de données de rang supérieur (dans le cas par exemple d'une carte nationale au 1:25''000, le parent peut être la série de toutes les cartes au 1:25''000). + Condition + + + + Indication sur le résultat de conformance où 0 = échoué et 1= réussi + Indication du résultat du test de concordance (0 = échec, 1= succès). + Obligatoire + + + + + Longueur d'onde à laquelle la réponse est la plus haute + Longueur d'onde à laquelle l'intensité de la réponse est la plus forte. + + + + + + Numéro de téléphone avec lequel la personne ou l'organisation responsable peut être contactée + Numéro de téléphone. Ces informations sont du type CI_Telephone et sont gérées dans la classe du même nom. + + + + + + Type de données pour le numéro de téléphone de la personne ou du service responsable + Type de données pour les numéros de téléphone. + + + + + + Date et heure à laquelle les donnée seront à disposition + Date et heure à laquelle les données seront disponibles. + + + + + + Point d'un pixel correspondant à la location terrestre du pixel + Point d'un pixel correspondant à la localisation du pixel dans le système terrestre. + Obligatoire + + + + + Identification, et mode de communication avec, des personnes ou des organisations associées aux ressources + Identification de la personne (voire des personnes) ou de l'organisation (voire des organisations) responsable du jeu de données décrit et mode de communication avec elle. Cette personne ou ce service endosse un rôle (propriétaire, prestataire, gestionnaire, etc.) bien spécifique pouvant être sélectionné dans la liste proposée. Les données correspondantes de la personne ou du service sont gérées dans la classe CI_ResponsibleParty. Ce rôle peut également servir à l'affectation d'un jeu de données à une commune. Exemple : le rôle de "propriétaire" permet ici d'affecter un lot de la MO à la commune correspondante. + + + + + + Liste de points définissant le polygone de délimitation + Série de points définissant le polygone de délimitation. Les positions sont exprimées en latitude et longitude géographique. Il s'agit d'un objet géométrique. + Obligatoire + + + + + Référence bibliographique du catalogue de présentation utilisé + Référence bibliographique au catalogue de représentation cité + Obligatoire + + + + + Informations sur le catalogue de règles concernant la représentation des ressources + Informations concernant le catalogue de règles établi pour la représentation de ressources. + + + + + + Rôle ou position de la personne responsable + Fonction ou position de la personne responsable. + Condition + + + + Code postale ou autre code pour l'emplacement + Code postal + + + + + + Mode dans lequel la ressource est représentée + Forme sous laquelle la source est disponible. Exemple : document numérique ou analogique, image, carte, modèle, etc. (sélection dans une liste). + + + + + + Informations sur des événements dans la vie du jeu de données + Informations concernant les étapes de traitement requises par la génération et l'actualisation d'un jeu de données avec indication des dates correspondantes. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici. Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies dans la classe LI_ProcessStep (texte, date, source et personne en charge du traitement). + Condition + + + + Code du distributeur d'image qui identifie les niveaux de processus radiométrique et géométrique appliqués + Identification du distributeur de l'image indiquant le niveau de traitement radiométrique et géométrique appliqué. + + + + + + Identification des personnes et organisations associées avec l'étape de processus, ainsi que des moyens de communications à utiliser pour entrer en contact avec elles + Identification de la personne (voire des personnes) ou de l'organisation (voire des organisations) en charge du jeu de données décrit et mode de communication avec elle(s). Cette personne ou ce service endosse un rôle bien spécifique (propriétaire, prestataire, gestionnaire, etc.) pouvant être sélectionné dans la liste proposée ici. Ces informations sont du type CI_ResponsibleParty et sont gérées dans la classe du même nom. + + + + + + Protocole de la connexion à utiliser + Protocole de connexion utilisé, par exemple FTP. + + + + + + Résumé des intentions pour lesquelles les ressources ont été développées + Motif(s) de la création de ce jeu de données. + + + + + + Indication si oui ou non l'information sur la calibration radiométrique pour générer le produit standard corrigé radiométriquement est à disposition + Indication de la présence éventuelle d'informations relatives à l'étalonnage radiométrique utilisé pour générer le produit standard corrigé au plan radiométrique. + + + + + + Exigences ou buts pour une étape de processus + Motif de l'étape de traitement ou but poursuivi. + + + + + + Raison de la création de l'élément étendu + Motif de l'extension de la norme par l'élément considéré. + + + + + + Nom du système de référence spatiale, par lequel sont définis la projection, l'ellipsoïde et le datum géodésique utilisés + Nom du système de référence spatial englobant la définition de la projection, de l'ellipsoïde et du datum géodésique utilisés. Ces informations sont du type RS_Identifier et sont gérées dans la classe du même nom. + Condition + + + + + Description des références spatiale et temporelle utilisées dans le jeu de données + Description des systèmes de référence spatiale et temporelle utilisés dans le jeu de données. Ces informations sont gérées dans la classe MD_ReferenceSystem. + + + + + + Information de qualité quantitative pour les données concernée par le domaine + Information de qualité de nature quantitative portant sur les données. + Condition + + + + Degré de détail dans le jeu de données de type raster + Degré de spécification de la trame, c.-à-d. description d'une extension, d'une dimension ou d'un nombre de cellules. + + + + + + Informations sur les contraites concernant les ressources + Informations relatives aux restrictions s'appliquant aux ressources. Ces informations sont gérées dans la classe MD_Constraints. + + + + + + Description du format de la ressource + Description du format de la ressource. Le nom et la version du format sont entrés ici. Ces informations sont gérées dans la classe MD_Format. + + + + + + Informations sur la fréquence de mise à jour des ressources, ainsi que de leur étendue + Informations concernant l'étendue et la date de mise à jour de la ressource. Si la mise à jour ne concerne pas la totalité du jeu de données, les options "updateScope" et "updateScopeDescription" permettent la description de la mise à jour individualisée de chacune des parties du jeu. Exemple : les biens-fonds de la MO sont actualisés annuellement, les nomenclatures ne l'étant qu''au besoin. Ces informations sont gérées dans la classe MD_MaintenanceInformation. + + + + + + Informations sur des applications spécifiques pour lesquelles la ressource est ou sera utilisée + Informations concernant des applications particulières pour lesquelles la ou les ressources sont ou ont été utilisées. Ces informations sont gérées dans la classe MD_Usage. + + + + + + Valeur (ou jeu de valeur) obtenue en appliquant une mesure de qualité de donnée ou par le résultat d'une comparaison des valeurs (ou jeu de valeurs) obtenues avec un niveau de qualité spécifique + Valeur (ou ensemble de valeurs) déduite de la mesure de qualité utilisée ou résultats provenant de la comparaison de ces valeurs avec un indicateur de qualité spécifié. + Obligatoire + + + + + Fonction accomplie par le service responsable + Rôle endossé par le service responsable (prestataire, gestionnaire, propriétaire, utilisateur, distributeur, créateur de données, instance compétente, évaluateur de données, responsable de leur traitement ou de leur publication, auteur, éditeur ou partenaire commercial). + Obligatoire + + + + + Spécifications comment l'élément étendu est en relation avec d'autres éléments et entités existants + Spécification de la manière dont l'élément étendu est en relation avec d'autres classes et éléments existants. + Obligatoire + + + + + Dénominateur de l'échelle de la carte source + Facteur d'échelle (dénominateur) de la carte source. Ces informations sont du type MD_RepresentativeFraction et sont gérées dans la classe du même nom. + + + + + + Facteur d'échelle appliqué à la valeur de la cellule + Facteur d'échelle appliqué à la valeur de la cellule. + + + + + + Schéma d'application entièrement donné dans un fichier ASCII + Schéma d'application dans un fichier ASCII. + + + + + + Identification de la langue de schéma utilisée + Identification de la langue utilisée pour le schéma d'application. + Obligatoire + + + + + Les données spécifiques auxquelles sont appliquées les informations de qualité des données + Indications relatives au domaine (exemple : attribut, jeu de données, série, projet, etc.) auquel se rapportent les informations concernant la qualité des données. Ces informations sont du type DQ_Scope et sont gérées dans la classe du même nom. + + + + + + Nombre qui identifie de façon unique le nombre de bandes de longueurs d'ondes sur lesquelles un senseur travaille + Entier identifiant sans équivoque le nombre de gammes de longueurs d'onde utilisées par un capteur. + + + + + + Information sur la série (ou sur le jeu de données global) de laquelle le jeu de données est une partie + Information relative à la série ou au jeu de données composé dont le jeu de données est issu. + Exemple : la série de toutes les cartes nationales au 1:25'000. + Ces informations sont du type CI_Series et sont gérées dans la classe du même nom. + + + + + + Nom court utilisé lors d'une implémentation telle que par exemple XML, SGML ou autres + Forme abrégée du nom utilisée lors d'une implémentation dans XML ou SGML. Remarque : d'autres méthodes d'implémentation peuvent être employées. + Condition + + + + Schéma d'application entièrement donné dans un fichier de développement software + Schéma d'application complet sous forme de fichier de développement logiciel. + + + + + + Format, dépendant du software, utilisé pour le fichier (dépendant du software) du schéma d'application + Format lié à un logiciel et utilisé pour la description du schéma d'application dans un fichier de développement logiciel. + + + + + + Informations sur la source de la donnée + Informations relatives aux données source. Elles sont gérées dans la classe LI_Source. + Condition + + + + Nom de la personne ou de l'organisation ayant créé les extensions + Nom de la personne ou de l'organisation ayant procédé à l'extension de la norme. + Obligatoire + + + + + Référence recommandée pour les données sources + Indication des sources du jeu de données source décrit. Le nom / titre du fichier de données source de même qu''une date du type correspondant (création, publication, traitement complémentaire) sont gérés ici. Des informations supplémentaires peuvent être indiquées au besoin. Elles sont du type CI_Citation et sont gérées dans la classe du même nom. + + + + + + Information sur les étendues spatiales, verticales et temporelles des données sources + Informations concernant l'extension spatiale, verticale et temporelle des données source. Ces informations sont du type EX_Extent et sont gérées dans la classe du même nom. + Condition + + + + Système de référence spatiale utilisé par les données sources + Indications relatives au système de référence. Elles sont gérées dans la classe MD_ReferenceSystem. + + + + + + Informations sur une étape du processus de création des données + Informations relatives aux étapes de traitement requises par la génération et l'actualisation des données source, avec indication des dates correspondantes. Les différentes étapes conduisant au jeu de données définitif sont mentionnées ici (les données source sont décrites). Exemple : restitution photogrammétrique de clichés aériens, vérification et complètement sur le terrain puis établissement de la carte. Ces étapes peuvent être saisies dans la classe LI_ProcessStep (texte, date, source, personne responsable du traitement). + + + + + + Coordonnée la plus au sud de la limite de l'étendue du jeu de données, exprimée en latitude avec des degrés décimaux (NORD positif) + Limite sud de l'extension du jeu de données, exprimée en latitude géographique (degrés décimaux) comptée positivement vers le nord. + Obligatoire + + + + + Information sur l'étendue spatiale de la composition spatio-temporelle de l'étendue + Informations relatives à l'extension spatiale de la classe composée EX_SpatialTemporalExtent. Ces informations sont gérées dans la classe EX_Extent. + + + + + + Représentation digitale de l'information spatiale dans le jeu de données + Informations sur la manière dont les représentations spatiales sont définies. Une distinction est étable entre les données vectorielles et les données tramées. Dans le cas de données vectorielles, les indications concernent le type géométrique, la topologie, etc., tandis qu''elles se rapportent au nombre de pixels, à l'ordre de succession des axes, aux paramètres de géoréférencement, etc. dans le cas de données tramées. Ces informations sont gérées dans la classe MD_SpatialRepresentation. + + + + + + Méthode utilisée pour représenter spatialement l'information géographique + Méthode utilisée pour la représentation spatiale des informations géographiques par des vecteurs, un quadrillage, des cartes, des tableaux, ou d'autres moyens similaires. + + + + + + Facteur qui donne une indication générale sur la densité de données spatiales dans le jeu de données + Facteur donnant une indication générale de la résolution spatiale du jeu de données. Il est indiqué sous forme d'échelle ou d'élément de comparaison au sol. Ces informations sont gérées dans la classe MD_Resolution. + La résolution spatiale se rapporte au niveau de détail de la série de données. Elle est exprimée comme un ensemble + de valeurs de distance de résolution allant de zéro à plusieurs valeurs (normalement utilisé pour des données + maillées et des produits dérivés d’imagerie) ou exprimée en échelles équivalentes (habituellement utilisées pour les + cartes ou les produits dérivés de cartes). + + + + + + + Brève description de l'utilisation actuelle de la ressource et/ou de la série de ressource + Brève description de l'utilisation de la ressource et/ou de la série de ressources sous forme de texte. + Obligatoire + + + + + Informations de référence des spécifications de produits ou des exigences des utilisateurs avec lesquelles les données sont comparées + Description des spécifications du produit ou des exigences de l'utilisateur avec lesquelles les données ont été comparées. + Obligatoire + + + + + Nom d'une spécification de sous-ensemble, profil ou produit du format + Nom d'une spécification partielle, de profil ou de produit du format. + Obligatoire + + + + + + Explication générale sur les connaissances du producteur de données au sujet de la filiation du jeu de données + Explication générale de la filiation du jeu de données fournie par le créateur des données. Dans le cas de données de la MO, il peut s'agir de l'indication des bases (MO93/MD93). Pour des données tramées, il peut s'agir de l'indication du fait qu''elles dérivent de prises de vues aériennes. + Condition + + + + Etat (de travail) des ressources + Etat de traitement du jeu de données. Sélection de l'une des options suivantes : complet, archive historique, obsolète, en cours, en projet, nécessaire, à l'étude. + + + + + + Toute autre information descriptive sur le jeu de données + Informations descriptives supplémentaires relatives au jeu de données présentant un intérêt général ou plus spécifiquement lié à l'utilisation, au traitement, etc. du jeu de données. + + + + + + Informations sur l'étendue temporelle + + L’étendue temporelle définit la période de temps couverte par le contenu de la ressource. Cette période peut être + exprimée de l’une des manières suivantes : une date déterminée, + un intervalle de dates exprimé par la date de début et la date de fin de l’intervalle, + un mélange de dates et d’intervalles. + + + Informations relatives à l'extension temporelle. Elles sont gérées dans la classe EX_TemporalExtent. + Condition + + + + Informations sur les éléments nécessaire pour utiliser le multilinguisme + Informations relatives à la définition de l'élément de texte en différentes langues (langue, contenu, etc.). Ces informations sont du type PT_Group et sont gérées dans la classe du même nom. + + + + + + Nom du thésaurus formellement enregistré ou d'une source d'autorité reconnue de mots clés + Nom d'un thésaurus enregistré sous forme d'une banque de données ou d'une source de mots clés similaire faisant autorité. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. + + + + + + Nom avec lequel la ressource en question est connue + + + Nom caractéristique et souvent unique sous lequel la ressource est connue. + + Titre/nom. Ces informations sont du type PT_FreeText et sont gérées dans la classe du même nom. + Obligatoire + + + + + + Nombre de valeurs numériques discrètes dans les données raster + Nombre de valeurs numériques discrètes dans les données tramées. + + + + + + Thème(s) principal(aux) du jeu de données + Thème principal (ou thèmes principaux) du jeu de données. + Ce thème ou groupe de thèmes permet de trouver un jeu de données. + Cet attribut se fondant sur une liste de codes de la norme ISO (MD_TopicCategoryCode), une recherche standardisée + par thèmes est possible au plan international. + Les thèmes suivants sont répertoriés : agriculture, biologie, limites, climatologie et météorologie, économie, indications altimétriques, environnement, sciences de la Terre, santé, images et cartes de base, armée et renseignement, cours d'eau intérieurs, indications de lieux, mers et océans, aménagement du territoire et cadastre, société, subdivisions, transport, infrastructures de transport. + + Obligatoire si "jeu de données" + + + + Code de la catégorie du sujet + + + + + + + Code qui identifie le degré de complexité des relations spatiales + Code indiquant les caractéristiques topologiques présentes dans le jeu de données telles que la géométrie sans topologie, les lignes, les lignes planes fermées, les surfaces, les corps, les surfaces tridimensionnelles, etc. + + + + + + Informations sur la façon de se procurer les données chez le distributeur + Informations relatives au mode d'obtention des données auprès du distributeur. Ces informations sont gérées dans la classe MD_DigitalTransferOptions. + + + + + + Taille estimée d'une unité dans le format de transfert spécifié, exprimé en mégabits. La taille de transfert est > 0.0 + Taille approchée d'un fichier (exprimée en mégaoctets) dans le format spécifié. La taille de transfert est > 0.0 + + + + + + Description général de la transformation + Description générale de la transformation. + + + + + + Information sur l'étendue géographique définie par l'étendue du raster + Règle de représentation spatiale de la trame. + + + + + + Indication si oui ou non des paramètres de transformation existent + Indication de l'existence ou de l'absence de paramètres de transformation pour un géoréférencement de la trame. + + + + + + Indication si oui ou non la triangulation a été effectuée sur l'image + Indication de l'éventuelle exécution d'une triangulation sur l'image. + + + + + + Temps d'attente usuel pour la préparation d'une commande + Temps de traitement usuel d'une commande. + + + + + + Thèmes utilisés pour grouper des mots clés similaires + Thème utilisé pour grouper des mots clés similaires. Les thèmes suivants sont disponibles : discipline, lieu, couche, intervalle de temps, thème. + + + + + + + Unité dans laquelle les longueurs d'ondes du senseur sont indiquées + Unité dans laquelle la longueur d'onde du capteur est exprimée. + Condition + + + + Parties, niveaux, surfaces géographiques, etc., dans lesquelles les données sont à disposition + Découpage en carroyages, couches, zones géographiques, etc. permettant l'obtention des données. + + + + + + Domaine d'applicabilité des données sur lequel une mise à jour est appliquée + Domaine des données concerné par la mise à jour. La catégorie à laquelle l'information se rapporte peut être indiquée dans la liste de codes (exemple : attributs, objets géométriques, jeu de données, etc.). + + + + + + Information supplémentaire sur le domaine ou l'étendue de la mise à jour + Informations supplémentaires relatives au domaine ou à l'étendue de la mise à jour. Ces données supplémentaires sont gérées dans la classe MD_ScopeDescription. La couche de la MO concernée par la mise à jour est par exemple précisée ici. + + + + + + Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressource + Date et heure de la première utilisation ou de la période d'utilisation de la ressource et/ou de la série de ressources. + + + + + + Contraintes appliquées pour assurer la protection des sphères privées et intellectuelles, et autres restrictions spéciales ou limitations ou mises en garde pour utiliser les ressources où de métadonnées + Restrictions d'utilisation à fondement juridique destinées à garantir la sphère privée, la propriété intellectuelle ou d'autres domaines similaires tels que les conditions d'octroi de licence. Elles peuvent être sélectionnées parmi les éléments suivants : droit d'auteur, brevet, brevet en voie de délivrance, marque, licence, propriété intellectuelle, diffusion limitée, autres restrictions. + + + + + + Limitation d'utilisation de la ressource où de métadonnées. Exemple: "ne pas utiliser pour la navigation" + Restriction d'utilisation de la ressource ou des métadonnées. Exemple: "ne pas utiliser pour la navigation" + + + + + + Identification des personnes et organisations, et des modes de communication avec celles-ci, utilisant les ressources + Identification de la personne (ou des personnes) et de l'organisation (ou des organisations) utilisant la ou les ressources et mode de communication avec elle(s). Cette personne ou ce service endosse un rôle bien spécifique (propriétaire, prestataire, gestionnaire, etc.) pouvant être sélectionné dans la liste présentée. Ces informations sont du type CI_Citation et sont gérées dans la classe du même nom. + + + + + + Rythmes de mise à jour autres que ceux définis + Rythme de mise à jour défini par l'utilisateur, si l'option "Définie par l'utilisateur" a été sélectionnée dans la liste de la "Fréquence d'entretien et de mise à jour". + + + + + + Applications déterminées par l'utilisateur pour lesquelles les ressources et/ou série de ressource ne sont pas adéquates + Applications indiquées par l'utilisateur pour lesquelles la ressource et/ou la série de ressources est inadéquate. + + + + + + Explications sur l'application des contraintes légales, ou d'autres restrictions et conditions préalables légales, pour obtenir et utiliser les ressources où de métadonnées + Explication plus détaillée de la restriction. + + + + + + Valeurs quantitatives, déterminées par la procédure d'évaluation utilisée. + Valeurs quantitatives définies par le processus d'exploitation. + + + + + + + + + + + + + Valeur quantitative, ou domaine de valeur, pour l'appréciation de qualité + Valeur (ou domaine de valeurs) quantitative pour l'appréciation de la qualité. + + + + + + Unité de valeur pour la documentation des résultats de qualité sur les données + Unité de valeur pour la documentation du résultat de la qualité des données. + + + + + + Identification de la version pour la domaine de valeurs + Numéro de version de l'espace nominal / de l'identifiant (alphanumérique). + + + + + + Version du format (date,nombre,etc) + Version du format de données, par exemple 6.0. + Obligatoire + + + + + Informations sur l'étendue verticale + Informations concernant l'extension verticale. Elles sont gérées dans la classe EX_VerticalExtent. + Condition + + + + Numéro de téléphone de la personne ou organisation responsable + Numéro de téléphone. + + + + + + Nombre de sujets identifiés dans le média + Nombre d'exemplaires de supports. Exemple : s'il s'agit de CD-ROM et si un disque est insuffisant pour le stockage, le nombre total de disques requis pour l'enregistrement du jeu de données complet est à indiquer ici. + + + + + + Coordonnée la plus à l'ouest de la limite de l'étendue du jeu de données, exprimée en longitude avec des degrés décimaux (EST positif) + Limite ouest de l'extension du jeu de données, exprimée en longitude géographique (degrés décimaux) comptée positivement vers l'est. + Obligatoire + + + + + + description + + + + + + + Instant + + + + Date ponctuelle + + + + + Période de temps (début/fin) + + + + + Noeud + + + + + Ecart de temps + + + + + Elément complexe + + + + + Bord précédent + + + + + Bord suivant + + + + + Début + + + + + Fin + + + + + Début + + + + + Durée + + + + + Intervalle de temps + + + + + Extension + + + + + Position + + + + + Date de début de validité (AAAA-MM-JJTHH:mm:ss) + + + + + Date de fin de validité (AAAA-MM-JJTHH:mm:ss) + + + + + Définit la relation entre un temps donné et l’objet + + + + + Coordonnées + + + + + Polygone + + + + + Point + 74. -37. + + + + + Ligne + + + + + Cercle + + + + + Limite extérieure + + + + + Limite intérieure + + + + + + + + + Identification de l'ellipsoïde utilisée + Identification de l'ellipsoïde utilisé. + + + + + + + + + + + + + Identification du service (ISO 19119) + + + + + Classification qui permet de rechercher les services de données géographiques disponibles. Un service donné ne + peut être classé que dans une seule catégorie. + + + + + + + + + + + + + + + + + + + + + + Version du type de service + + + + Information sur la disponibilité du service (prix, instructions de commande...) + + + + Contraintes légales et de sécurité sur l’accès au service et sur la distribution de la donnée via le service + + + + Information sur les opérations + + + + Information sur la ou les données associées au service + + + + Nom de l’opération + + + + Information sur les opérations + + + + Plateforme de communication (DCP) sur laquelle l’opération a été implémentée + + + + + + + Description de l’opération sous forme de texte libre + + + + Nom de l’appel + + + + Paramètres requis par l’interface + + + + + + + Point de connection pour accéder à l’interface + + + + List of operations that must be completed immediately before current operation is invoked, structured as a list for capturing alternate predecessor paths and sets for capturing parallel predecessor paths + + + + Nom du fournisseur du service + + + + Informations permettant contacter le fournisseur du service + + + + Nom utilisé par le service pour le paramètre + + + + Description du rôle du paramètre + + + + Indication sur l’optionalité du paramètre + + + + Indication sur la répétabilité du paramètre + + + + + Si la ressource est un service de données géographiques, cet élément de métadonnées identifie, le cas échéant, la + série ou les séries de données géographiques cibles du service grâce à leurs identificateurs de ressource uniques + (Unique Resource Identifiers, URI). + + + + + Information sur la ressource couplée + + + + Identifiant de la resource sur laquelle l’opération porte + + + + Type de couplage + + + + Extension géographique/temporelle du service + + + + Mots-clés décrivant le service + + + + Utiliser cette section pour définir la liste des langues utilisées dans cette métadonnée. + + + + + + Describes + + + + + + + PropertyType + + + + + + + Langue + + + + + + + PT_LocaleContainer + + + + + + + FeatureType + + + + + + + Provides information about the list of feature types with the same spatial representation + + + + + + + FeatureAttribute + + + + + + + DS_Association + + + + + + + DS_DataSet + + + + + + + DS_Initiative + + + + + + + DS_OtherAggregate + + + + + + + DS_Platform + + + + + + + DS_ProductionSeries + + + + + + + DS_Sensor + + + + + + + DS_Series + + + + + + + DS_StereoMate + + + + + + + LanguageCode + + + + + + + CharacterEncoding + + + + + + + + + + + + + + Unité de mesure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Has + + + + + + + + + + + + + + + + + + + + + Nombre maximum d’occurrences du nouvel élément de métadonnée + + + + + + + + + + + + + + ComposedOf + + + + + + + PartOf + + + + + + + SeriesMetadata + + + + + + + Subset + + + + + + + Superset + + + + + + + + + + + + + + + Le type durée permet de définir un interval de temps. + + Le format est le suivant "PnYnMnDTnHnMnS" : + + * P Période (Obligatoire) + * nY : nombre d'années + * nM : nombre de mois + * nD : nombre de jours + * T début de la section temps (Obligatoire, si définition d'un des éléments suivants) + * nH : nombre d'heures + * nM : nombre de minutes + * nS : nombre de secondes + + + + + + + + + + + + + + + + + Information sur l'origine depuis laquelle les altitudes maximale et minimale ont été mesurées + + + + Nom du fichier et URL. + + + + URL du document. + + \ No newline at end of file diff --git a/pilotage/public/fonts/glyphicons-halflings-regular.eot b/pilotage/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1 GIT binary patch literal 20290 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pilotage/public/fonts/glyphicons-halflings-regular.ttf b/pilotage/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a498ef4e7c8b556fc36f580c5ff524025bb11c84 GIT binary patch literal 41236 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 literal 0 HcmV?d00001 diff --git a/pilotage/public/img/banniere_geo.jpg b/pilotage/public/img/banniere_geo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83323d2a9e29ebe6213fdb92de0cd3be46a8841f GIT binary patch literal 34009 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 + + +} catch (\Exception $e) { + echo $e->getMessage(); +} diff --git a/pilotage/public/js/ZeroClipboard.js b/pilotage/public/js/ZeroClipboard.js new file mode 100644 index 00000000..75278c1b --- /dev/null +++ b/pilotage/public/js/ZeroClipboard.js @@ -0,0 +1,311 @@ +// Simple Set Clipboard System +// Author: Joseph Huckaby + +var ZeroClipboard = { + + version: "1.0.7", + clients: {}, // registered upload clients on page, indexed by id + moviePath: '/pilotage/js/ZeroClipboard.swf', // URL to movie + nextId: 1, // ID of next movie + + $: function(thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function() { this.style.display = 'none'; }; + thingy.show = function() { this.style.display = ''; }; + thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; + thingy.removeClass = function(name) { + var classes = this.className.split(/\s+/); + var idx = -1; + for (var k = 0; k < classes.length; k++) { + if (classes[k] == name) { idx = k; k = classes.length; } + } + if (idx > -1) { + classes.splice( idx, 1 ); + this.className = classes.join(' '); + } + return this; + }; + thingy.hasClass = function(name) { + return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); + }; + } + return thingy; + }, + + setMoviePath: function(path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function(id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function(id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function(obj, stopObj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + while (obj && (obj != stopObj)) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + obj = obj.offsetParent; + } + + return info; + }, + + Client: function(elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard.nextId++; + this.movieId = 'ZeroClipboardMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard.register(this.id, this); + + // create movie + if (elem) this.glue(elem); + } +}; + +ZeroClipboard.Client.prototype = { + + id: 0, // unique ID for us + ready: false, // whether movie is ready to receive events or not + movie: null, // reference to movie object + clipText: '', // text to copy to clipboard + handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor + cssEffects: true, // enable CSS mouse effects on dom container + handlers: null, // user event handlers + + glue: function(elem, appendElem, stylesToAdd) { + // glue to DOM element + // elem can be ID or actual DOM element object + this.domElement = ZeroClipboard.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; + } + + if (typeof(appendElem) == 'string') { + appendElem = ZeroClipboard.$(appendElem); + } + else if (typeof(appendElem) == 'undefined') { + appendElem = document.getElementsByTagName('body')[0]; + } + + // find X/Y position of domElement + var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem); + + // create floating DIV above element + this.div = document.createElement('div'); + var style = this.div.style; + style.position = 'absolute'; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + style.width = '' + box.width + 'px'; + style.height = '' + box.height + 'px'; + style.zIndex = zIndex; + + if (typeof(stylesToAdd) == 'object') { + for (addedStyle in stylesToAdd) { + style[addedStyle] = stylesToAdd[addedStyle]; + } + } + + // style.backgroundColor = '#f00'; // debug + + appendElem.appendChild(this.div); + + this.div.innerHTML = this.getHTML( box.width, box.height ); + }, + + getHTML: function(width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + + '&width=' + width + + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += ''; + } + else { + // all other browsers get an EMBED tag + html += ''; + } + return html; + }, + + hide: function() { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function() { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function() { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { body.removeChild( this.div ); } catch(e) {;} + + this.domElement = null; + this.div = null; + } + }, + + reposition: function(elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard.$(elem); + if (!this.domElement) this.hide(); + } + + if (this.domElement && this.div) { + var box = ZeroClipboard.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + setText: function(newText) { + // set text to be copied to clipboard + this.clipText = newText; + if (this.ready) this.movie.setText(newText); + }, + + addEventListener: function(eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) this.handlers[eventName] = []; + this.handlers[eventName].push(func); + }, + + setHandCursor: function(enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) this.movie.setHandCursor(enabled); + }, + + setCSSEffects: function(enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !!enabled; + }, + + receiveEvent: function(eventName, args) { + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 1 ); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 100 ); + this.ready = true; + return; + } + + this.ready = true; + this.movie.setText( this.clipText ); + this.movie.setHandCursor( this.handCursorEnabled ); + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('hover'); + if (this.recoverActive) this.domElement.addClass('active'); + } + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + this.domElement.removeClass('hover'); + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } + else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][ func[1] ](this, args); + } + else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; \ No newline at end of file diff --git a/pilotage/public/js/ZeroClipboard.swf b/pilotage/public/js/ZeroClipboard.swf new file mode 100644 index 0000000000000000000000000000000000000000..fbd5e9d5c096ebf47ded34d33eace7f8e545feac GIT binary patch literal 2055 zcmV+i2>ACyS5pow3;+Ol+I?0_bKA%fo(2I708tc0Nwh4#=#|&9WJsiBuh*7s*|JDl zvL(^cW92x0a0m`W*dV|FpdLx3;!4#X@&j_p#ku5^TYf-pxuhxu$rbNChg7QaAJ%Dr zGG*B2*^kc|9BL0(*)E@~M22$)lO$hn*z~6w7J6_$KT`QJzdrjN%XHmL4 z)(C>uY(BrcyF0aeZOZkw^V7F(-O3kc@-s7&Xff&UI|199bo|k=xfr0xeZ#X_f#o{6 zNM<#+9o!uoJ3_4+UC>tBvt!7*k>@sVawqWf(^Jz3R5xZ#*K4w1jDqSdb1mfzssT-$l$xVxP#jb zj9*dy!!r^;qrd&@_eHGu-?eAla~Eu@RdbnFCx03Ik4gwG5YuB#K26eOiU@DN|FcX4 za`ZHbydHR#vn^L@uelK<<4R2Nov3`;ire;iDdNQ)*Q(P8u4{AV$gAyUjeET(w(IS9 z)-AtfvweBJul*G)gUy%fS~CJicjJv3vy~n0DIKmIbW}x5 zF^##+7WH`$LGRcU2uW23Z|IT7DfWO4e@ z`m2>nadWx!YHMx&$&*s?lX1#tjujwMCml+Y2du~fHhRTuJ4W39SK_Q-p7h-DF~)Ph z)UM`oJ6P2d+vV=&JpS{xujOY7g&X-=+p+`8p&rLP8(d~~@R;xSbh6(LEZZMEQHj}3B`%#*7CY}w(HC5t zdduP7g_A~0PQX2ehu`5H!!!Q}}RmUTNO**uLZk zI2*#ovczm_+o6uTZZMmxenc^8Tw8WooqJ1;>587~2AbWKwHAxI8YA>mf!Fo}Uaxr8 zw&nP;AD0kx3B$8KwY0yFCQW6X8*R+Teh;&4cem&^@!(Q)E$wTaUX8Zx#g04fF=g9h zt%hazYKP3;c*(p zI4{cIhjNTJX z)c>QF%l_|9&14}fX0>5eBFdK%IR)7(BkIWb$i&Fi5q)GbJD2^5kdi>AilB;GPqH`F z_k@B#AwdO+q8=y(g@Q^GJyc3ksh3JAD)mt*O{IP+WvDbjVUWTQg)Eg$QE8Y;BUCy= zrLz>ipz>u3W9k@Cm{O;Z=G8o$!FPeeG=*yvzM_d66uzc#lfo@^7N~rerteX>Pvvc zIRRBvktCA%YoZV>#_d6xOeTSdy+EWC5V;QsO#@N-fv6cE+5nKAK_E#Y4#@zgAu9_& zPW2~XxL*{Y7bxzRA_-8`3t{2qkbb%`^fIfT)6c)tFT4xQp?7-joqq9MBl|E4OHkDQ zuy9a4t&i%L9tiqqc|=%@LdDQl!$R&`L);{9h3^hB8A9G4m}l5or03Xqq!(E35;3I1 z-xzXwfDpAN*QE34@V+J<)g{inARS}VNX?l^s9b}XyF@0cqvmz| zepR_4qACyU>lZhXsoab#stNN}XeKMOLPxkAn!R1&PH3jO!rjp9>k4zBnMR>{Pag`+ zOyz#W4Tffahs%cM0CJ(ek*f>}SQ3$nT3;>P=|&V>d(+55$y!& z;j;_HM2SFxl!+jbhXngs5(QODhlNmo6(z4c44tUtuD*IgPerWgc%)~?`cSXs;+K&t z4+`IYILwF`^ ul', + items: "> li:has(.afficher)", + cancel:"> li:not(:has(.afficher))", + cursor:"n-resize", + handle:'.action-deplacer', + update:$.proxy(function(event, ui){ + + this.estModifie = true; + this.majOrdre(); + this.trier(); + }, that) + }); + },0,this); + + + } + + function _click(params){ + + var that = this; + Arborescence.debutPatienter(); + //Déclencher le click de l'objet correspondant + setTimeout(function(){ + + params.data.arbo.clickElement(that.id); + Arborescence.finPatienter(); + }, 0); + } + + //Gestion du click sur les attributs et initialisation des tooltips + this.obtenirReference().find('input.check:not(.expander)').on("click", null, {arbo:this}, _click).tooltip(); + + this.obtenirReference().find('.action, .lien-groupe, .lien-couche, label').tooltip(); + + $(window).on("beforeunload", null, {arbo:this}, function(params){ + + if(params.data.arbo.estModifie){ + return 'Des modifications sont non enregistrées. Si vous quittez cette page, ces modifications seront perdues.'; + + } + + }); + + $('#enregistrer').on("click", null, {arbo:this}, function(){ + //Désactiver la vérification "Est-ce qu'on va perdre des données si on quitte la page" + arbo.estModifie = false; + }); + +} + +/** + * Déclenche l'affichage du contenu de l'arborescence + */ +Arborescence.prototype.afficher = function(){ + + //Faire générer le HMTL requis + this.ecrire('

    '); + + //Afficher l'arborescence dans la page + this.obtenirReference().html(this.contenuAAfficher.join('\n')); + this.contenuAAfficher = []; + + this.init(); + +} + +/** + * Le mode édition permet d'activer l'édition du libellé d'un groupe/couche et + * de changer leur ordre dans l'arborescence + * @returns bool + */ +Arborescence.prototype.estEnModeEdition = function(){ + + return this.params.edition; +} + +Arborescence.prototype.getClassName = function(){ + + return 'Arborescence'; +} + +/** + * Met à jour l'ordre des groupes enfants en se basant sur leur ordre dans le DOM + */ +Arborescence.prototype.majOrdre = function(){ + + this.obtenirReference().find(' > ul > li').each($.proxy(Arborescence._majOrdre, this)); + +} + +Arborescence._majOrdre = function(index, valeur){ + if($(valeur).has('.check-coche, .check-complet, .check-partiel')){ + var item = this.obtenirElementAmeliore(valeur.id); + item.definirOrdre(index + 1); + }else{ + item.definirOrdre(0); + }; +} + +Arborescence.prototype.obtenirElements = function() { + return this.enfants; +} + +//TODO Mettre un vrai commentaire pour cette fonction +Arborescence.prototype.clickElement = function(idElement) { + + //On a cliqué une colonne + if(idElement.substring(0,7) == "colonne"){ + var colonne = this.obtenirElementAmeliore(idElement); + + //Permuter l'état de la colonne sur laquelle on a cliqué + colonne.click(); + if(this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true){ + colonne.majEtatColonnesAvecLeMemeId(); + } + return; + } + + this._clickElement(this.enfants, idElement); + +} + +//TODO Mettre un commentaire pour cette fonction +Arborescence.prototype._clickElement = function(elements, idElement) { + var element; + + for (id in elements) { + element = elements[id]; + + //On a trouvé l'élément cherché + if (element.id == idElement) { + element.click(); + return true; + } + + //Chercher dans les enfants si possible + if(element.nbEnfants > 0) { + + //Chercher parmis les enfants + if (this._clickElement(element.enfants, idElement)){ + return true; + } + } + + //Chercher dans les attributs si possible (c'est un groupe ou une couche) + if(element.attributs && element.attributs.nbAttributs > 0) { + + var spl = idElement.split('_'); + var type_attribut; //attribur de couche ou de groupe spl0 + var nomAttribut = spl[spl.length-1]; + var attribut = element.obtenirAttribut(nomAttribut); + if(!attribut){ + continue; + } + + var elementSousId = spl.shift() + spl.shift() + '_' + spl.pop(); + + var estArboPermission = (this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true); + + spl = attribut.obtenirId().split('_'); + type_attribut = spl.shift(); + + //On est dans l'arbo des permission et c'est un attribut de couche qu'on a cliqué + if(estArboPermission && attribut.parent.parent.estCouche() ){ + + //L'attribut correspond (ou est le double) de celui qu'on a cliqué + if(type_attribut + spl.shift() + '_' + spl.pop() == elementSousId){ + + attribut.click(); + + } + } else if (attribut.obtenirId() == idElement) { + attribut.click(); + return true; + + } + + } + } +} + +/** + * Trouver un élément groupe ou couche + * @param object groupe ou couche + * @param string id de l'élément à trouver + */ +Arborescence.prototype.obtenirElement = function(idElement) { + + return this._obtenirElement(this.enfants, idElement); + +} + +Arborescence.prototype.obtenirElementAmeliore = function(idElement){ + + //Déterminer à quoi on a affaire + var typeElement = ''; + if(idElement.substring(0,7) == "colonne"){ + typeElement = 'colonne'; + }else if(idElement.substring(0,6) == "couche"){ + typeElement = 'couche'; + + }else if(idElement.substring(0,6) == "groupe"){ + typeElement = 'groupe'; + }else{ + alert("C'est un attribut?"); + } + + switch(typeElement){ + case 'colonne': + return this.obtenirColonne(idElement); + case 'couche': + return this.obtenirCouche(idElement); + case 'groupe': + return this.obtenirGroupe(idElement); + case 'attribut': + return this.obtenirAttribut(idElement); + default: + break; + } + + return false; + +} + +Arborescence.prototype.obtenirColonne = function(id){ + return this.colonnes.obtenirElement(id); +} + + +Arborescence.prototype.obtenirCouche = function(id){ + return this.couches.obtenirElement(id); +} + +Arborescence.prototype.obtenirGroupe = function(id){ + return this.groupes.obtenirElement(id); + +} + +Arborescence.prototype.obtenirAttribut = function(id){ + return this.attributs.obtenirElement(id); +} + +/* + * Récupère une référence sur un élément + * @param object elements Éléments à fouiller + * @param string idElement Id de l'élément qu'on cherche + */ +Arborescence.prototype._obtenirElement = function(elements, idElement) { + + var elementTrouve = false; + var element; + for (id in elements) { + element = elements[id]; + + //On a trouvé l'élément cherché + if (element.id == idElement) { + return element; + } + + //Chercher dans les enfants si possible + if(element.nbEnfants > 0) { + + //Chercher parmis les enfants + elementTrouve = this._obtenirElement(element.enfants, idElement); + + } + + //Chercher dans les attributs si possible + if(!elementTrouve && element.attributs && element.attributs.nbAttributs > 0) { + + //Chercher parmis les attributs + var attributs = element.attributs.attributs; + var attribut; + for(nomAttribut in attributs){ + attribut = attributs[nomAttribut]; + if(attribut.obtenirId() == idElement){ + elementTrouve = attribut; + } + } + } + + if (elementTrouve) { + return elementTrouve; + } + } + + //on a pas trouvé l'élément + return elementTrouve; + +} + +Arborescence.prototype.ajouterGroupe = function(groupe) { + + groupe.parent = this; + this.enfants[groupe.id] = groupe; + this.nbEnfants++; + + groupe.ajusterOrdre(); + + this.groupes.ajouterElement(groupe); + + this.ajouterAttributsALaListe(groupe.obtenirAttributs()); + +} + +Arborescence.prototype.ajouterAttributsALaListe = function(attributs){ + for(ind in attributs){ + this.attributs.ajouterElement(attributs[ind]); + } +} + +Arborescence.prototype.ordreMax = function(){ + + var max = 1; + var enfant; + //parcourir le parent et trouver le ordre max + for(cle in this.enfants){ + enfant = this.enfants[cle]; + if(enfant.ordre > max){ + max = enfant.ordre; + } + } + return max; +} + +/** + * Ajuster l'affichage des flêches monter/descendre + */ +Arborescence.prototype.rafraichirFleches = function(){ + + var liste = this.obtenirReference().find(' > ul > li'); + + //Cacher les flèches des items non activées + liste.children('.masquer.action-monter').hide(); + liste.children('.masquer.action-descendre').hide(); + liste.children('.masquer.action-deplacer').hide(); + + //Afficher la flèche monter de tous les activés, sauf le premier + liste.children('.afficher.action-monter').show().first().hide(); + + //Afficher la flèche descendre de tous les activés, sauf le dernier + liste.children('.afficher.action-descendre').show().last().hide(); + + liste.children('.afficher.action-deplacer').show(); + +} + +/** + * Tri les items en fonction de la valeur de leur ordre + */ +Arborescence.prototype.fonctionDeTri = function(a, b){ + + //Les items ayant un ordre "0" sont envoyé en fin de liste + var valeurA = parseInt($(a).children('.input-ordre').val()); + if(valeurA == 0){ + return 1; + } + var valeurB = parseInt($(b).children('.input-ordre').val()); + if(valeurB == 0){ + return -1; + } + + //Trier en ordre croisant + return valeurA - valeurB; +} + +Arborescence.prototype.trier = function(){ + this.trierGroupes(this); +} + +/** + * Trier les groupes + * @param Groupe item Groupe de couches à trier + */ +Arborescence.prototype.trierGroupes = function(item){ + + var parent, liste; + + if(item.estArbo()){ + parent = this.obtenirReference().children('ul'); + }else{ + parent = this.obtenirReference().find('#' + item.id).children('ul'); + } + liste = parent.children('li'); + + liste.sort(this.fonctionDeTri); + + liste.appendTo(parent); + item.rafraichirFleches(); + +} + +/** + * Tri les couches + * @param Groupe item Groupe de couches + */ +Arborescence.prototype.trierCouches = function(item){ + + var parent = this.obtenirReference().find('#' + item.id).children('ul'); + var liste = parent.children('li'); + + liste.sort(this.fonctionDeTri); + + liste.appendTo(parent); + item.rafraichirFleches(); +} + +Arborescence.prototype.estGroupe = function(){ + return false; +} + +Arborescence.prototype.estArbo = function(){ + return true; +} + +Arborescence.prototype.obtenirArbo = function(){ + + return this; +} + +/** + * Récupère une référence jQuery sur l'arborescence + * @returns + */ +Arborescence.prototype.obtenirReference = function(){ + if(this.reference == undefined){ + this.reference = $(document.getElementById(this.id)); + } + return this.reference; +} + +/** + * Ajoute du contenu au HTML qui va construire l'arborescence + */ +Arborescence.prototype.ecrire = function(texte){ + this.contenuAAfficher.push(texte); +} + +/** + * Tous les champs contenus dans l'arborescence + * @returns {undefined} + */ +Arborescence.prototype.getJSON = function(){ + + //Générer un ordre de tri total pour toutes les couches et les groupes + this.obtenirReference().find('li').has('.check-coche, .check-complet, .check-partiel, .check-exclu').each($.proxy(function(index, valeur){ + + var item = this.obtenirElementAmeliore(valeur.id); + item.definirOrdre(index + 1); + }, this)); + + var data = {}; + this.obtenirReference().find('input[name]').each($.proxy(function(index, element){ + + //Dans le formulaire, pour le même name, on a un input[type=checkbox] + //avec un value à 0 et un autre à 1. Si aucun est coché, on veut que la + //valeur soit 0. Si celui qui a value=1 est coché, on veut 1. + + //C'est le cch par défaut, ou la cch de l'attribut est cochée + if(element.value == 0 || (element.checked)){ + data[element.name] = element.value; + } + + //Inclure l'élément titre et ordre au besoin + if(this.estEnModeEdition()){ + + var utilite = element.getAttribute('data-utilite'); + if(('ordre' == utilite || 'titre' == utilite)){ + + data[element.name] = element.value; + + } + + } + + }, this)); + + return JSON.stringify(data); + +} + +Arborescence.debutPatienter = function(){ + $('body').addClass('wait'); + +} + +Arborescence.finPatienter = function(){ + $('body').removeClass('wait'); +} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Attribut.js b/pilotage/public/js/arborescence/Attribut.js new file mode 100644 index 00000000..494c2dd4 --- /dev/null +++ b/pilotage/public/js/arborescence/Attribut.js @@ -0,0 +1,530 @@ +/** + * Classe Attribut représente un attribut de Groupe ou de Couche. Un attribut + * désigne l'état de la couche, soit visible, actif, lecture, écriture, export, + * etc. Le constructeur est généralement appelé par la classe Attributs. + */ + +/** + * + * @param string nomAttribut Nom de l'attribut (ex : "lecture", "analyse", "ecriture", "export", "association" + * @param bool checked + * @param bool association L'utilisateur à le droit d'associer (cocher/décocher) cet attribut + * @returns {Attribut} + */ +function Attribut(nomAttribut, checked, association) { + + this.nomAttribut = nomAttribut; + this.etat = checked ? 'coche' : 'decoche'; + this.association = association; + +} + +Attribut.prototype.id = ''; +Attribut.prototype.parent = ''; //Défini lors de Attributs.ajouterAttribut() +Attribut.prototype.reference = undefined; //référence jQuery + +Attribut.prototype.getClassName = function(){ + return 'Attribut'; +} + +/** + * + * @param {type} etatDuParent "coche", "decoche", "exclu", "partiel" ou "complet" + */ +Attribut.prototype.init = function(etatDuParent){ + + if(!this.association){ + + document.getElementById(this.obtenirId()).setAttribute('disabled', true); + } + + //La parent est coché + if (etatDuParent == "coche"){ + + //L'enfant est exclu + if(this.nomAttribut == "visible" && this.etat == "decoche" && this.obtenirArbo().estEnModeEdition()){ + + this.etat = 'exclu'; + this.parent.parent.majClasse(); + }else{ + + this.etat = 'coche'; + } + + //Le parent est exclu + }else if(etatDuParent == 'exclu' && this.nomAttribut == "visible" && this.obtenirArbo().estEnModeEdition()){ + this.etat = 'exclu'; + this.parent.parent.majClasse(); + } + + if(this.estUnAttributDeGroupe()){ + + //Stocker l'état de l'attributs de tous les enfants(récursivement) + var etatDesAttributsDesEnfants = []; + var enfants = this.parent.parent.enfants; + for(indiceEnfant in enfants){ + + //Initialiser l'attribur enfant et récupérer son résultat + etatDesAttributsDesEnfants.push(enfants[indiceEnfant].obtenirAttribut(this.nomAttribut).init(this.etat)); + } + + //L'attribut n'est pas coché + if(!this.estCoche() && !this.estExclu()){ + + //Déterminer son état en fonction de celui de ses enfants + var nbTotal = etatDesAttributsDesEnfants.length; + var nbCoche = 0; + var nbPartiel = 0; + + var etat; + for(ind = 0; ind < nbTotal ; ind++){ + etat = etatDesAttributsDesEnfants[ind]; + if(etat == "coche" || etat == "complet"){ + nbCoche++; + }else if(etat == "partiel"){ + nbPartiel++; + } + + } + + if(nbTotal == nbCoche){ + this.etat = 'complet'; + }else if(nbCoche > 0 || nbPartiel > 0){ + this.etat = 'partiel'; + }else{ + this.etat = 'decoche'; + + } + } + } + + this.majAffichageAttribut(); + return this.etat; +} + +/** + * Récupère une référence jQuery sur l'attribut + */ +Attribut.prototype.obtenirReference = function(){ + if(this.reference == undefined){ + this.reference = $(document.getElementById(this.obtenirId())); + } + return this.reference; +} + +Attribut.prototype.obtenirId = function(){ + + if(!this.id){ + this.id = this.parent.parent.id + '_' + this.nomAttribut; + } + return this.id; +} + +/** + * Indique si le parent ayant le même attribut est coché + * @returns {undefined} + */ +Attribut.prototype.parentEstCoche = function(){ + + //Il n'y a pas de parent + if(this.parent.parent.parent.estArbo()){ + return false; + } + return this.parent.parent.parent.obtenirAttribut(this.nomAttribut).estCoche(); +} + +/* + * Gère le click sur un attribut + */ +Attribut.prototype.click = function() { + + var arbo = this.obtenirArbo(); + + //Indiquer qu'une modification non enregistrée à été faite + arbo.estModifie = true; + + //Détacher du DOM le temps de faire les mises à jour + var arboTempo = $(document.getElementById(arbo.id)).detach(); + + switch(this.etat){ + + case 'coche': + + //On a cliqué sur l'attribut "visible", on n'est pas à la racine, le parent est coché et il a au moins 2 enfants + if(this.nomAttribut == 'visible' && this.parentEstCoche() && this.parent.parent.parent.nbEnfants > 1){ + this.exclure(); + + //L'attribut était exclu + }else{ + + this.deExclure(); + } + break; + + //L'attribut n'était pas coché ou exclu + case 'decoche': + case 'partiel': + case 'complet': + this.etat = 'coche'; + break; + + case 'exclu': + if(this.parentEstCoche()){ + this.deExclure(); + this.etat = 'coche'; + }else{ + this.deExcluACoche(); + } + + break; + } + + this.parent.parent.majClasse(); + + this.majAffichageAttribut(); + this.parent.parent.majEtatOutilsEdition(); + + this.changerEtatEnfants(); + this.changerEtatParents(); + + //Ratacher l'arbo du DOM à la fin des maj + arboTempo.appendTo('#conteneur-arborescence'); + +} + +/** + * Met à jour le style d'un attribut en fonction de son état + * @returns {undefined} + */ +Attribut.prototype.majAffichageAttribut = function(){ + + var estArboPermission = (this.obtenirArbo().params.estArboPermission && this.obtenirArbo().params.estArboPermission == true); + var cch = this.obtenirReference(); + cch.removeClass('check-coche') + .removeClass('check-decoche') + .removeClass('check-partiel') + .removeClass('check-partiel-gris') + .removeClass('check-complet') + .removeClass('check-complet-gris') + .removeClass('check-exclu'); + + switch(this.etat){ + case 'coche': + cch.addClass('check-coche').prop('checked', true); + + break; + case 'decoche': + cch.addClass('check-decoche').prop('checked', false); + + break; + case 'partiel': + cch.addClass('check-partiel'); + if(!estArboPermission && this.parent.parent.estGroupeDeGroupe()){ + cch.addClass('check-partiel-gris'); + } + break; + case 'complet': + cch.addClass('check-complet'); + if(!estArboPermission && this.parent.parent.estGroupeDeGroupe()){ + cch.addClass('check-complet-gris'); + } + break; + case 'exclu': + cch.addClass('check-exclu'); + + if(this.parent.parent.estCouche()){ + this.parent.parent.decocherColonnes(); + } + break; + } + +} + +/** + * Fait changer l'état de l'attribut du même type, pour les groupes et couches enfants + * @param bool checked État du parent original qui déclenche le changement + * @returns {undefined} + */ +Attribut.prototype.changerEtatEnfants = function(){ + + var conteneurParent = this.parent.parent; + if(conteneurParent.nbEnfants == 0){ + return; + } + + if (conteneurParent.estGroupe()){ + + var enfant, attributEnfant, attributEnfantInput; + + var enfants = conteneurParent.enfants; + for(id in enfants){ + + enfant = enfants[id]; + + //Attribut correspondant dans l'enfant + attributEnfant = enfant.obtenirAttribut(this.nomAttribut); + attributEnfantInput = attributEnfant.obtenirReference(); + + if(this.estDecoche()){ + attributEnfantInput.removeClass("parent-est-coche").prop('checked', false); + attributEnfant.etat = 'decoche'; + }else if(this.estExclu()){ + attributEnfantInput.removeClass("parent-est-coche").prop('checked', false); + + }else{ + attributEnfantInput.addClass("parent-est-coche").prop('checked', true); + attributEnfant.etat = 'coche'; + } + + attributEnfant.majAffichageAttribut(); + attributEnfant.changerEtatEnfants(); + + } + + //On est dans une couche + }else{ + + if(this.estDecoche()){ + conteneurParent.decocherColonnes(); + + } + } + + conteneurParent.majEtatOutilsEdition(); + + conteneurParent.parent.majOrdre(); + conteneurParent.parent.rafraichirFleches(); + +} + +/** + * Coche l'élément parent si vous ses enfants sont coché + * Attention : le parent direct est un groupe ou une couche, ici on s'intéresse + * au "grand-parent" + */ +Attribut.prototype.changerEtatParents = function (){ + + //Récupérer le groupe parent de l'attribut + var parent = this.parent.parent.parent; + + //Il n'y a pas de groupe ou couche parent + if(parent.estArbo()){ + return; + } + + if(this.obtenirReference().prop('disabled')){ + return; + } + + //Récupérer l'attribut dans le groupe parent + var parentAttribut = parent.obtenirAttribut(this.nomAttribut); + + //S'assurer que l'utilisateur a les permissions nécessaires + if(!parentAttribut.association){ + + return; + } + + //L'attribut est maintenant exclu, il était donc coché auparavant, et tous les enfants de sont parent ne sont pas décoché + if(this.estExclu() && parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ + //Ne pas modifier l'état du parent + + //On vient de cocher un élément dont le parent est exclu + }else if(parentAttribut.estExclu() && this.estCoche()){ + + //marquer le parent comme coché + parentAttribut.etat = 'coche'; + parentAttribut.parent.parent.majClasse(); + parentAttribut.parent.parent.majEtatOutilsEdition(); + + }else if(parent.auMoinsUnEnfantExclu(this.nomAttribut)){ + //Ne pas modifier l'état du parent + + }else if(parentAttribut.etat == 'coche' && parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ + + //Ne pas modifier l'état du parent + + //Tous les enfants ayant le même attribut sont coché + }else if(parent.enfantsDirectsTousCochesOuCompletOuExclu(this.nomAttribut)){ + + //Mettre le parent à l'état "tous les enfants sont cochés" + parentAttribut.etat = 'complet'; + + //Au moins un enfant ayant le même attribut est coché + }else if(parent.enfantCochePartiel(this.nomAttribut)){ + + parentAttribut.etat = 'partiel'; + + //Aucun enfant coché + }else{ + + parentAttribut.etat = 'decoche'; + } + + parentAttribut.obtenirReference().prop('checked', false); + + parentAttribut.majAffichageAttribut(); + parent.majEtatOutilsEdition(); + parent.rafraichirFleches(); + parentAttribut.changerEtatParents(); + + parent.majOrdre(); + +} + +/** + * @return string Libellé associé à l'attribut + */ +Attribut.prototype.getTitle = function() { + var title = ''; + switch (this.nomAttribut) { + case 'visible': + title = 'Visible'; + break; + case 'active': + title = 'Actif'; + break; + case 'lecture': + title = 'Lecture'; + break; + case 'analyse': + title = 'Analyse'; + break; + case 'ecriture': + title = 'Écriture'; + break; + case 'export': + title = 'Export'; + break; + case 'association': + title = 'Association'; + default: + break; + } + return title; + +} + +/** + * + * @returns string Séparateur associé au nom de l'attribut + */ +Attribut.prototype.getSeparateur = function() { + var separateur = ''; + switch (this.nomAttribut) { + case 'visible': + separateur = 'V'; + break; + case 'active': + separateur = 'A'; + break; + case 'lecture': + separateur = 'L'; + break; + case 'analyse': + separateur = 'A'; + break; + case 'ecriture': + separateur = 'E'; + break; + case 'export': + separateur = 'P'; + break; + case 'association': + separateur = 'S'; + break; + default: + break; + } + return separateur; + +} + +/** + * Exclu l'attribut et réperture sur les enfants de son groupe/couche + */ +Attribut.prototype.exclure = function(){ + + this.etat = 'exclu'; + this.majAffichageAttribut(); + this.parent.parent.majClasse(); + + //Répercuter l'exclusion jusqu'aux couches + var parent = this.parent.parent; + if(parent.estGroupe()){ + var enfants = parent.enfants; + for(id in enfants){ + + enfants[id].obtenirAttribut(this.nomAttribut).exclure(); + + } + } +} + +/** + * Fait passer l'état de exclu à coché + */ +Attribut.prototype.deExcluACoche = function(){ + + this.etat = 'coche'; + this.majAffichageAttribut(); + this.parent.parent.majClasse(); + + //Répercuter la déexclusion à tous les enfants + var parent = this.parent.parent; + if(parent.estGroupe()){ + var enfants = parent.enfants; + for(id in enfants){ + + enfants[id].obtenirAttribut(this.nomAttribut).deExcluACoche(); + + } + } +} + +Attribut.prototype.deExclure = function(){ + this.etat = 'decoche'; + this.parent.parent.obtenirReference().find('li.exclu').removeClass('exclu'); +} + +//L'item est bien coché +Attribut.prototype.estCoche = function(){ + return this.etat == 'coche'; +} + +//L'item n'est pas coché +Attribut.prototype.estDecoche = function(){ + return this.etat == 'decoche'; +} + +//Au moins un enfant de cet item est coché, intermédiaire ou complet +Attribut.prototype.estPartiel = function(){ + return this.etat == 'partiel'; +} + +//Tous les enfants de cet item sont cochés, itermédiaires ou complets +Attribut.prototype.estComplet = function(){ + return this.etat == 'complet'; +} + +//L'item est exclu +Attribut.prototype.estExclu = function(){ + return this.etat == 'exclu'; +} + +Attribut.prototype.estCommun = function(){ + return this.commun; +} + +Attribut.prototype.estUnAttributDeGroupe = function(){ + + return (this.parent.parent.estGroupe()); +} + +/** + * Retourne une référence sur l'arbo qui contient l'attribut + */ +Attribut.prototype.obtenirArbo = function(){ + + return this.parent ? this.parent.obtenirArbo() : ''; +} diff --git a/pilotage/public/js/arborescence/Attributs.js b/pilotage/public/js/arborescence/Attributs.js new file mode 100644 index 00000000..3558f2ea --- /dev/null +++ b/pilotage/public/js/arborescence/Attributs.js @@ -0,0 +1,70 @@ +/** + * Représente une liste d'attributs. + */ + +/** + * Construit la liste d'attributs en fonction du nom et de leur état + * @param {} attributs ex : {'visible':true, 'active':false} + */ +function Attributs(attributs) { + + this.attributs = {}; + + for (nomAttribut in attributs) { + this.ajouterAttribut(new Attribut(nomAttribut, attributs[nomAttribut]['valeur'], attributs[nomAttribut]['association'])); + } +} + +Attributs.prototype.parent = ''; //Défini lors de Couche.ajouterAttributs() +Attributs.prototype.nbAttributs = 0; + +Attributs.prototype.init = function(){ + var attribut; + var etat; + for(nomAttribut in this.attributs){ + attribut = this.attributs[nomAttribut]; + etat = attribut.init('decoche'); + attribut.etat = etat; + + } + +} + +Attributs.prototype.ajouterAttribut = function(attribut){ + attribut.parent = this; + this.attributs[attribut.nomAttribut] = attribut; + this.nbAttributs++; +} + +/* + * Permet d'accéder à un attribut sans faire attributs.attributs[nomAttribut] + * @param string nomAttribut + * @returns + */ +Attributs.prototype.obtenirAttribut = function(nomAttribut) { + return this.attributs[nomAttribut] != undefined ? this.attributs[nomAttribut] : false; +} + +/** + * Nombre d'attributs activés, soit coché, intermédiaire ou complet + * @returns int + */ +Attributs.prototype.nbAttributsActives = function() { + var nbCoche = 0; + var attribut; + for (id in this.attributs) { + attribut = this.attributs[id]; + if (id != 'commune' && (attribut.estCoche() || attribut.estPartiel() || attribut.estComplet())) { + nbCoche++; + } + } + return nbCoche; +} + +/** + * Retourne une référence sur l'arbo qui contient l'attribut + */ +Attributs.prototype.obtenirArbo = function(){ + + return this.parent ? this.parent.obtenirArbo() : ''; +} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Colonne.js b/pilotage/public/js/arborescence/Colonne.js new file mode 100644 index 00000000..11c4a1ad --- /dev/null +++ b/pilotage/public/js/arborescence/Colonne.js @@ -0,0 +1,165 @@ +/** + * Colonne représente un champ de BD. Est rataché à une Couche + */ + +/** + * + * @param {type} id Ex : 12_13_19 + * @param string libelle Nom du champ + * @param bool estCochee Est exclus + * @returns {Colonne} + */ +function Colonne(id, libelle, estCochee) { + this.id = 'colonne_' + id; + this.name = 'C' + 'X' + id; + this.libelle = libelle; + this.estCochee = estCochee; + + var spl = id.split('_'); + this.idDeLaColonne = spl[spl.length-1]; //Ex : 19 + +} + +Colonne.prototype.parent = ''; //Initialisé lors de Couche.ajouterColonne() +Colonne.prototype.reference = undefined; + +Colonne.prototype.getClassName = function(){ + return 'Colonne'; +} + +/** + * + */ +Colonne.prototype.init = function(){ + + this.updateInput(); + this.updateLabel(); + +} + +Colonne.prototype.click = function(){ + + //Récupérer l'état actuelle se sa cch + var cch = this.obtenirReference(); + var cchEstCoche = cch.prop('checked'); + + if(cchEstCoche && (this.getCoucheParent().nbAttributsActives() == 0)){ + + //Annuler l'exclusion + cch.prop('checked', false); + alert("Il faut d'abord associer la couche avant d'en exclure une colonne."); + return; + } + + this.estCochee = cchEstCoche; + this.updateLabel(); + +} + +Colonne.prototype.updateInput = function(){ + + this.obtenirReference().prop('checked', this.estCochee); +} + +Colonne.prototype.updateLabel = function(){ + var label = this.getLabel(); + if(this.estCochee){ + label.css('text-decoration', 'line-through'); + }else{ + label.css('text-decoration', ''); + } +} + +Colonne.prototype.getCoucheParent = function(){ + + return this.parent; + +} + +Colonne.prototype.getLabel = function(){ + var arbo = this.obtenirArbo(); + return arbo.obtenirReference().find('label[for="' + this.id + '"]'); +} + +/** + * Récupère une référence jQuery sur la colonne + */ +Colonne.prototype.obtenirReference = function(){ + if(this.reference == undefined){ + this.reference = $(document.getElementById(this.id)); + } + return this.reference; +} + +Colonne.prototype.decocher = function(){ + + var input = this.obtenirReference(); + if(input.prop('checked')){ + input.click(); + } + +} + +/** + * Ajoute le contenu de la colonne au HTML qui va construire l'arborescence + */ +Colonne.prototype.afficher = function() { + + var checked = this.estCochee ? "checked" : ''; + var arbo = this.obtenirArbo(); + arbo.ecrire(['
  • ' + , '' + , '' + , '' + , '
  • '].join('')); + +} + +/** + * Indique si le terme est contenu la colonne + * @param string terme + * @returns bool + */ +Colonne.prototype.contientLeTerme = function(terme) { + return indexOfRegExp(this.libelle, terme); +} + +/** + * Retourne une référence sur l'arbo qui contient la colonne + */ +Colonne.prototype.obtenirArbo = function(){ + return this.parent ? this.parent.obtenirArbo() : false; +} + + + +/** + * Fait ajuster l'état des colonnes ayant le même id + */ +Colonne.prototype.majEtatColonnesAvecLeMemeId = function(){ + + var colonnes = this.obtenirArbo().colonnes; + var colonne; + + for(indColonne in colonnes){ + + colonne = colonnes[indColonne]; + + //La colonne correspond et ce n'est pas celle qu'on a cliqués originalement + if(this.idDeLaColonne == colonne.idDeLaColonne && this.id != colonne.id){ + + //La colonne peut être cochée + if(colonne.parent.estActive()){ + var inputColonne = colonne.obtenirReference() + inputColonne.prop('checked', this.estCochee); + colonne.click(); + } + } + + } + + +} + diff --git a/pilotage/public/js/arborescence/Couche.js b/pilotage/public/js/arborescence/Couche.js new file mode 100644 index 00000000..569a9440 --- /dev/null +++ b/pilotage/public/js/arborescence/Couche.js @@ -0,0 +1,406 @@ +/** + * Représente une couche. Couche contient généralement des colonnes (Colonne) + * et est contenu dans un Groupe + */ + +/** + * Classe couche + * @param string id + * @param string libelle + * @param string url + * @param int ordre + * @param {} attributs + * @returns {Couche} + */ +function Couche(id, libelle, url, ordre, attributs) { + + this.id = 'couche_' + id; + this.no = id; + this.libelle = $('
    ').html(libelle).text(); + this.url = url; + this.ordre = ordre; + this.enfants = {}; + this.ajouterAttributs(new Attributs(attributs)); + +} + +Couche.prototype.nbEnfants = 0; +Couche.prototype.parent = ''; +Couche.prototype.attributs = null; +Couche.prototype.reference = undefined; //référence jQuery + +Couche.prototype.init = function(){ + + //Initialiser les colonnes + for(cle in this.enfants){ + + this.enfants[cle].init(); + + } + + this.majEtatOutilsEdition(); + this.majClasse(); + +} + +Couche.prototype.obtenirReference = function(){ + + if(this.reference == undefined){ + this.reference = $(document.getElementById(this.id)); + } + return this.reference; +} + +/** + * + * @param Attributs attributs + */ +Couche.prototype.ajouterAttributs = function(attributs){ + + this.attributs = attributs; + this.attributs.parent = this; + +} + +Couche.prototype.getClassName = function(){ + return 'Couche'; +} + +Couche.prototype.obtenirLibelle = function(){ + return this.libelle; +} + +Couche.prototype.definirLibelle = function(libelle){ + + var arbo = this.obtenirArbo(); + this.libelle = libelle; + + var libelleEchappe = $('
    ').text(libelle).html(); + arbo.obtenirReference().find('#CT' + this.no + '').val(libelleEchappe); + arbo.obtenirReference().find('#libelle_' + this.id).html(libelleEchappe); + +} + +/** + * Place la couche et ses équivalent dans le bon ordre + */ +Couche.prototype.trier = function(){ + var arbo = this.obtenirArbo(); + var parent = this.obtenirReference().parent(); + var liste = parent.children('li'); + + liste.sort(arbo.fonctionDeTri); + + liste.appendTo(parent); + + this.parent.rafraichirFleches(); + +} + +/* + * Retourne la couche suivante dans la liste en se basant sur l'ordre + * @returns {Couche} + */ +Couche.prototype.suivant = function(){ + + var parent = this.parent; + var suivant = false; + + var autre; + for(cle in parent.enfants){ + autre = parent.enfants[cle]; + if(this.ordre < autre.ordre && (!suivant || autre.ordre < suivant.ordre)){ + + suivant = autre; + } + + } + return suivant; + +} + +/* + * Retourne la couche précédante dans la liste en se basant sur l'ordre + * @returns {Couche} + */ +Couche.prototype.precedant = function(){ + + var parent = this.parent; + var precedant = false; + + var autre; + for(cle in parent.enfants){ + autre = parent.enfants[cle]; + if(this.ordre > autre.ordre && (!precedant || autre.ordre > precedant.ordre)){ + + precedant = autre; + } + + } + return precedant; + +} + +/** + * Échange l'ordre de deux couches + */ +Couche.prototype.echangerOrdre = function(autre){ + + //Échanger l'ordre des deux groupes + var ordre = this.ordre; + this.definirOrdre(autre.ordre); + autre.definirOrdre(ordre); + + this.obtenirArbo().trierCouches(this.parent); + +} + +Couche.prototype.majClasse = function(){ + + var attributVisible = this.obtenirAttribut('visible'); + if(attributVisible && attributVisible.estExclu()){ + this.obtenirReference().addClass('exclu'); + }else{ + this.obtenirReference().removeClass('exclu'); + } +} + +Couche.prototype.afficher = function() { + + var arbo = this.obtenirArbo(); + + arbo.ecrire('
  • ' + + ''); + this.afficherAttributs(); + if (this.url) { + arbo.ecrire(''); + } + arbo.ecrire('' + this.libelle + ''); + if (this.url) { + arbo.ecrire(''); + } + + if(arbo.estEnModeEdition()){ + + //Icône d'édition + arbo.ecrire(['' + , '' + , '' + , '' + , '' + , ''].join('')); + + } + + if (this.nbEnfants > 0) { + arbo.ecrire('
      '); + var colonne; + for (nomColonne in this.enfants) { + colonne = this.enfants[nomColonne]; + colonne.afficher(); + + } + arbo.ecrire('
    '); + } + arbo.ecrire('
  • '); + +} + +/** + * Permet d'accéder aux attributs sans devoir faire this.attributs.attributs + */ +Couche.prototype.obtenirAttributs = function() { + + return this.attributs.attributs; +} + +Couche.prototype.afficherAttributs = function() { + + var attributs = this.obtenirAttributs(); + var attribut, checked, id, title, separateurAttribut, name; + var arbo = this.obtenirArbo(); + for (nomAttribut in attributs) { + + if (nomAttribut != 'commune'){ + + attribut = this.obtenirAttribut(nomAttribut); + checked = attribut.estCoche() ? 'checked' : ''; + id = this.id + '_' + nomAttribut; + title = attribut.getTitle(); + separateurAttribut = attribut.getSeparateur(); + name = 'C' + separateurAttribut + this.no; + + arbo.ecrire(['' , + '', + ''+ + '', + ''].join('')); + } + } +} + +Couche.prototype.ajouterColonne = function(colonne) { + + colonne.parent = this; + this.enfants[colonne.libelle] = colonne; + this.nbEnfants++; + + this.obtenirArbo().colonnes.ajouterElement(colonne); + +} + +Couche.prototype.ajusterOrdre = function(){ + + if(!this.obtenirArbo().estEnModeEdition()){ + return; + } + + if(this.ordre == 0){ + return; + } + + if(this.ordreDejaUtilise()){ + this.ordre = this.ordreMax() + 1; + } +} + +Couche.prototype.ordreDejaUtilise = function(){ + + var enfants = this.parent.enfants; + for(cle in enfants){ + if(this.ordre == enfants[cle]){ + return true; + } + } + return false; +} + +Couche.prototype.ordreMax = function(){ + + var max = 1; + var enfants = this.parent.enfants; + for(cle in enfants){ + if(enfants[cle].ordre > max){ + max = enfants[cle].ordre; + } + } + return max; +} + +Couche.prototype.definirOrdre = function(ordre){ + this.ordre = ordre; + this.getOrdreInput().val(ordre); +} + +Couche.prototype.getOrdreInput = function(ordre){ + + return $(document.getElementById('CO' + this.no)); + +} + +/** + * Indique si le terme est contenu dans l'iten ou dans un des enfants + */ +Couche.prototype.contientLeTerme = function(terme) { + var contient = indexOfRegExp(this.libelle, terme); + + if (!contient) { + + if (this.nbEnfants > 0) { + + //Vérifier dans les enfants + for (idColonne in this.enfants) { + contient = this.enfants[idColonne].contientLeTerme(terme); + + if (contient) { + return contient; + } + } + } + } + + return contient; +} + +/** + * Ajuste l'état des boutons et des inputs lié au groupe ou à la couche de l'attribut +*/ +Couche.prototype.majEtatOutilsEdition = function(){ + + var arbo = this.obtenirArbo(); + + if(arbo.estEnModeEdition()){ + + var id = this.id; + var activer = this.nbAttributsActives() > 0; + var item = this.obtenirReference(); + + //Libellé et ordre signifiant "rien" + var libelle = ''; + var ordre = 0; + + if(activer){ + + libelle = $('
    ').text(this.libelle).html(); + ordre = this.ordre; + item.children('.action').addClass('afficher').removeClass('masquer').show(); + }else{ + item.children('.action').addClass('masquer').removeClass('afficher').hide(); + this.ordre = 0; + } + + item.children('#CT' + this.no).val(libelle); + item.children('#CO' + this.no).val(ordre); + + } +} + +Couche.prototype.decocherColonnes = function(){ + + var colonnes = this.enfants; + for(id in colonnes){ + + //Il n'est pas possible d'exclure une colonne qui fait partie d'une couche pas dans le contexte + colonnes[id].decocher(); + + } +} + +Couche.prototype.obtenirAttribut = function(nomAttribut) { + return this.attributs.obtenirAttribut(nomAttribut); +} + +Couche.prototype.nbAttributsActives = function(){ + + return this.attributs.nbAttributsActives(); +} + +Couche.prototype.estActive = function(){ + return this.nbAttributsActives() > 0; +} + +/** + * Indique si la couche est à la racine + * @return bool Devrait toujours retourner faux + */ +Couche.prototype.estALaRacine = function(){ + + return this.parent.estArbo(); +} + +Couche.prototype.estCouche = function(){ + return true; +} + +Couche.prototype.estGroupe = function(){ + return false; +} + +Couche.prototype.estArbo = function(){ + return false; +} + +Couche.prototype.obtenirArbo = function(){ + + return this.parent ? this.parent.obtenirArbo() : ''; +} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/Groupe.js b/pilotage/public/js/arborescence/Groupe.js new file mode 100644 index 00000000..db1ab37e --- /dev/null +++ b/pilotage/public/js/arborescence/Groupe.js @@ -0,0 +1,533 @@ +/** + * Représente un groupe. + */ + +/** + * Classe groupe + * @param string id + * @param string no + * @param string libelle + * @param string url + * @param int ordre + * @param {} attributs + * @returns {Couche} + */ +function Groupe(id, no, libelle, url, ordre, attributs) { + + this.id = 'groupe_' + id; //Identifiant unique du champ + this.no = no; // Ex : tous les groupes Carte de glace ont le même no + this.libelle = $('
    ').html(libelle).text(); + this.url = url; + this.ordre = ordre; + this.enfants = {}; + this.ajouterAttributs(new Attributs(attributs)); +} + +Groupe.prototype.nbEnfants = 0; +Groupe.prototype.parent = ''; //Initialisé lors de Groupe.ajouterGroupe() +Groupe.prototype.attributs = null; +Groupe.prototype.reference = undefined; //référence jQuery +Groupe.prototype._estGroupeDeGroupe = undefined; //Contient des groupes ou des couches + +Groupe.prototype.getClassName = function(){ + return 'Groupe'; +} + +/** + * + * @param Attributs attributs + */ +Groupe.prototype.ajouterAttributs = function(attributs){ + this.attributs = attributs; + this.attributs.parent = this; +} + +Groupe.prototype.init = function(){ + + var arbo = this.obtenirArbo(); + + for(cle in this.enfants){ + this.enfants[cle].init(); + } + + if(arbo.estEnModeEdition()){ + + //S'assurer que l'ordre d'affichage corresponde à ce qu'on a dans la BD + this.trier(); + + this.majEtatOutilsEdition(); + this.majClasse(); + this.rafraichirFleches(); + + //Décaller l'activation du tri pour accélérer l'affichage initial + setTimeout(function(that){ + + //Activer le tri glisser/déposer des enfants de ce groupe + that.obtenirReference().children('ul').sortable({ + placeholder: "ui-state-highlight", + axis:'y', + connectWith:'> ul', + items: "> li:has(.afficher)", + cancel:"> li:not(:has(.afficher))", + cursor:"n-resize", + handle:'.action-deplacer', + update:$.proxy(function(event, ui){ + + this.obtenirArbo().estModifie = true; + this.majOrdre(); + this.trier(); + + }, that) + }); + },0,this); + + } + +} + +/** + * Récupère une référence jQuery sur le groupe + */ +Groupe.prototype.obtenirReference = function(){ + + if(this.reference == undefined){ + this.reference = $(document.getElementById(this.id)); + } + return this.reference; +} + +/** + * Met à jour l'ordre des enfants en se basant sur leur ordre dans le DOM + */ +Groupe.prototype.majOrdre = function(){ + + var arbo = this.obtenirArbo(); + + this.obtenirReference().find(' > ul > li').each($.proxy(Arborescence._majOrdre, arbo)); + +} + +Groupe.prototype.majClasse = function(){ + + var attributVisible = this.obtenirAttribut('visible'); + if(attributVisible && attributVisible.estExclu()){ + this.obtenirReference().addClass('exclu'); + }else{ + this.obtenirReference().removeClass('exclu'); + } +} + +/** + * Indique si le groupe contient des/un groupe + * @returns bool + */ +Groupe.prototype.estGroupeDeGroupe = function(){ + + if(this._estGroupeDeGroupe != undefined){ + return this._estGroupeDeGroupe; + } + + if(this.enfants == 0){ + this._estGroupeDeGroupe = true; + + }else{ + //TODO Vérifier si on peut tester le premier seulement --> [0]... + for(cle in this.enfants){ + this._estGroupeDeGroupe = this.enfants[cle].estGroupe(); + break; + } + } + + return this._estGroupeDeGroupe; + +} + +/** + * Tri les éléments contenus dans le groupe + */ +Groupe.prototype.trier = function(){ + + if(this.estGroupeDeGroupe()){ + this.obtenirArbo().trierGroupes(this); + }else{ + this.obtenirArbo().trierCouches(this); + } +} + +Groupe.prototype.obtenirAttributs = function() { + return this.attributs.attributs; +} + +Groupe.prototype.obtenirAttribut = function(nomAttribut) { + return this.attributs.obtenirAttribut(nomAttribut); +} + +Groupe.prototype.ajouterGroupe = function(groupe) { + + var arbo = this.obtenirArbo(); + + groupe.parent = this; + this.enfants[groupe.id] = groupe; + this.nbEnfants++; + + groupe.ajusterOrdre(); + arbo.groupes.ajouterElement(groupe); + + arbo.ajouterAttributsALaListe(groupe.obtenirAttributs()); + +} + +Groupe.prototype.ajouterCouche = function(couche) { + + var arbo = this.obtenirArbo(); + couche.parent = this; + this.enfants[couche.id] = couche; + this.nbEnfants++; + + couche.ajusterOrdre(); + arbo.couches.ajouterElement(couche); + + arbo.ajouterAttributsALaListe(couche.obtenirAttributs()); + +} + +Groupe.prototype.obtenirLibelle = function(){ + return this.libelle; +} + +Groupe.prototype.definirLibelle = function(libelle){ + var arbo = this.obtenirArbo(); + + this.libelle = libelle; + + var libelleEchappe = $('
    ').text(libelle).html(); + arbo.obtenirReference().find('#GT' + this.no).val(libelleEchappe); + arbo.obtenirReference().find('#libelle_' + this.id).html(libelleEchappe); + +} + +//TODO le contenu de cette fonction devrait peut être aller ailleurs. Le code qui masque est où? +Groupe.prototype.rafraichirFleches = function(){ + + var arbo = this.obtenirArbo(); + var liste = this.obtenirReference().find('> ul > li'); + + //Cacher les flèches des items non activées + liste.children('.masquer.action-monter').hide(); + liste.children('.masquer.action-descendre').hide(); + liste.children('.masquer.action-deplacer').hide(); + + //Afficher la flèche monter de tous les activés, sauf le premier + liste.children('.afficher.action-monter').show().first().hide(); + + //Afficher la flèche descendre de tous les activés, sauf le dernier + liste.children('.afficher.action-descendre').show().last().hide(); + +} + +Groupe.prototype.suivant = function(){ + + var parent = this.parent; + var suivant = false; + + var autre; + for(cle in parent.enfants){ + autre = parent.enfants[cle]; + if(this.ordre < autre.ordre && (!suivant || autre.ordre < suivant.ordre)){ + + suivant = autre; + } + + } + return suivant; +} + +Groupe.prototype.precedant = function(){ + + var parent = this.parent; + var precedant = false; + + var autre; + for(cle in parent.enfants){ + autre = parent.enfants[cle]; + if(this.ordre > autre.ordre && (!precedant || autre.ordre > precedant.ordre)){ + + precedant = autre; + } + + } + return precedant; +} + +Groupe.prototype.echangerOrdre = function(autre){ + + //Échanger l'ordre des deux groupes + var ordre = this.ordre; + this.definirOrdre(autre.ordre); + autre.definirOrdre(ordre); + + this.obtenirArbo().trierGroupes(this.parent); + +} + +Groupe.prototype.definirOrdre = function(ordre){ + this.ordre = ordre; + this.getOrdreInput().val(ordre); +} + +Groupe.prototype.getOrdreInput = function(){ + return $(document.getElementById('GO' + this.no)); + +} + +Groupe.prototype.afficher = function() { + + var arbo = this.obtenirArbo(); + + arbo.ecrire('
  • ' + + ''); + this.afficherAttributs(); + if (this.url) { + + arbo.ecrire(''); + } + arbo.ecrire('' + this.libelle + ''); + if (this.url) { + + arbo.ecrire(''); + } + + if(this.obtenirArbo().estEnModeEdition()){ + + //Icône d'édition + arbo.ecrire(['' + , '' + , '' + , '' + , '' + , ''].join('')); + } + + if (this.nbEnfants > 0) { + arbo.ecrire('
      '); + for (id in this.enfants) { + this.enfants[id].afficher(); + } + arbo.ecrire('
    '); + } + arbo.ecrire('
  • '); +} + +Groupe.prototype.afficherAttributs = function() { + + var attribut, checked, id, title, name; + var arbo = this.obtenirArbo(); + + for (nomAttribut in this.obtenirAttributs()) { + attribut = this.obtenirAttribut(nomAttribut); + checked = ''; + id = this.id + '_' + nomAttribut; + title = attribut.getTitle(); + name = 'G' + attribut.getSeparateur() + this.no; + + if (attribut.estCoche()) { + checked = 'checked'; + } + + arbo.ecrire(['' + , '' + , '' + , '' + , ''].join('')); + + } +} + +/** + * Indique si tous les enfants directs (groupes ou couches) d'un + * groupe sont cochés, complets ou exclus, pour un attribut donné + * @param string nomAttribut Nom de l'attribut à vérifier + */ +Groupe.prototype.enfantsDirectsTousCochesOuCompletOuExclu = function(nomAttribut) { + + if (this.nbEnfants > 0) { + + var element; + var attribut; + for (id in this.enfants) { + + element = this.enfants[id]; + attribut = element.obtenirAttribut(nomAttribut); + + //N'est pas coché ou complet + if (!(attribut.estCoche() || attribut.estComplet() || attribut.estExclu()) ) { + return false; + } + } + } + return true; +} + +Groupe.prototype.auMoinsUnEnfantExclu = function(nomAttribut){ + + if (this.nbEnfants > 0) { + + var element; + var attribut; + for (id in this.enfants) { + + element = this.enfants[id]; + attribut = element.obtenirAttribut(nomAttribut); + + //N'est pas coché ou complet + if (attribut.estExclu()) { + return true; + } + } + } + return false; +} + +/** + * Indique si tous les enfants directs (groupes ou couches) d'un + * groupe sont coché, pour un attribut donné + * @param string nomAttribut Nom de l'attribut à vérifier + */ +Groupe.prototype.enfantCochePartiel = function(nomAttribut) { + + if (this.nbEnfants > 0) { + + var element; + for (id in this.enfants) { + + element = this.enfants[id]; + if (element.obtenirAttribut(nomAttribut).estCoche() || element.obtenirAttribut(nomAttribut).estComplet() || element.obtenirAttribut(nomAttribut).estPartiel()) { + return true; + } + + } + } + return false; +} + +/** + * S'assurer que l'ordre du groupe n'est pas déjà utilisé par un autre + * @returns {undefined} + */ +Groupe.prototype.ajusterOrdre = function(){ + + if(!this.obtenirArbo().estEnModeEdition()){ + return; + } + + if(this.ordre == 0){ + return; + } + + if(this.ordreDejaUtilise()){ + this.ordre = this.ordreMax() + 1; + } + +} + +Groupe.prototype.ordreDejaUtilise = function(){ + + for(cle in this.parent.enfants){ + if(this.ordre == this.parent.enfants[cle]){ + return true; + } + } + return false; +} + +Groupe.prototype.ordreMax = function(){ + + var max = 1; + var enfants = this.parent.enfants; + for(cle in enfants){ + if(enfants[cle].ordre > max){ + max = enfants[cle].ordre; + } + } + return max; +} + +//Indique si le terme est contenu dans l'iten ou dans un des enfants +Groupe.prototype.contientLeTerme = function(terme) { + var contient = indexOfRegExp(this.libelle, terme); + + if (!contient) { + + if (this.nbEnfants > 0) { + + //Vérifier dans les enfants + for (idEnfant in this.enfants) { + contient = this.enfants[idEnfant].contientLeTerme(terme); + + if (contient) { + return contient; + } + } + } + } + + return contient; +} + +/** + * Ajuste l'état des boutons et des inputs lié au groupe ou à la couche de l'attribut +*/ +Groupe.prototype.majEtatOutilsEdition = function(){ + + var arbo = this.obtenirArbo(); + + if(arbo.estEnModeEdition()){ + + var id = this.id; + var activer = this.attributs.nbAttributsActives() > 0; + var item = this.obtenirReference(); + + //Libellé et ordre signifiant "rien" + var libelle = ''; + var ordre = 0; + + if(activer){ + + libelle = $('
    ').text(this.libelle).html(); + ordre = this.ordre; + item.children('.action').addClass('afficher').removeClass('masquer').show(); + }else{ + item.children('.action').addClass('masquer').removeClass('afficher').hide(); + + } + + item.children('#GT' + this.no).val(libelle); + item.children('#GO' + this.no).val(ordre); + + } +} + +Groupe.prototype.estALaRacine = function(){ + + return this.parent.estArbo(); +} + +Groupe.prototype.estCouche = function(){ + return false; +} + +Groupe.prototype.estGroupe = function(){ + return true; +} + +Groupe.prototype.estArbo = function(){ + return false; +} + +/** + * Retourne une référence sur l'arbo qui contient le groupe + */ +Groupe.prototype.obtenirArbo = function(){ + + return this.parent ? this.parent.obtenirArbo() : ''; +} diff --git a/pilotage/public/js/arborescence/ListeElement.js b/pilotage/public/js/arborescence/ListeElement.js new file mode 100644 index 00000000..605d6da0 --- /dev/null +++ b/pilotage/public/js/arborescence/ListeElement.js @@ -0,0 +1,48 @@ +function ListeElement(){ + + this.index = []; +} + +//Stocke un élément +ListeElement.prototype.ajouterElement = function(element){ + + var hash; + if(element.getClassName() == "Attribut"){ + hash = this.obtenirHash(element.parent.parent.id); + }else{ + hash = this.obtenirHash(element.id); + } + + if(this.index[hash] == undefined){ + this.index[hash] = []; + } + + this.index[hash].push(element); +} + +//Retourne un élément +ListeElement.prototype.obtenirElement = function(id){ + + var hash = this.index[this.obtenirHash(id)]; + for(ind in hash){ + if(hash[ind].id == id){ + return hash[ind]; + } + } + return false; + +} + +ListeElement.prototype.obtenirHash = function(str){ + var hash = 0; + if (str.length == 0){ + return hash; + } + for (i = 0; i < str.length; i++) { + char = str.charCodeAt(i); + hash = ((hash<<5)-hash)+char; + hash = hash & hash; + } + return hash; + +} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/tree.js b/pilotage/public/js/arborescence/tree.js new file mode 100644 index 00000000..6a448cff --- /dev/null +++ b/pilotage/public/js/arborescence/tree.js @@ -0,0 +1,162 @@ +/** + * Gère le comportement et l'affichage de l'outil css-treeview. + */ + +/** +* Ouvrir toute l'arboresence +* @returns {undefined} +*/ +function ouvrirArborescence(){ + var terme = $('#terme').val(); + + _ouvrirArborescence(arbo.obtenirElements(), terme); + + return false; + +} + +/** +* +* @param {type} items Items à parcourir +* @param {type} terme Terme à considérer +*/ +function _ouvrirArborescence(items, terme){ + + var item; + for(cle in items){ + item = items[cle]; + if(doitEtreOuvert(item, terme)){ + ouvrirItem(item); + } + //si a des enfants + if(item.nbEnfants > 0){ + _ouvrirArborescence(item.enfants, terme); + } + } +} + +/** +* Ouvrir les items cochés de l'arborescence +*/ +function ouvrirArborescenceCoche(){ + + var items = arbo.obtenirElements(); + _ouvrirArborescenceCoche(items); + +} + +/** +* Ouvrir les items cochés de l'arborescence +* @param {type} items Items à parcourir +*/ +function _ouvrirArborescenceCoche(items){ + + var item; + for(cle in items){ + item = items[cle]; + + //C'est un groupe ou une couche, et l'item est coché ou bien un enfant est coché + if(item.attributs && item.attributs.nbAttributsActives() > 0){ + ouvrirItem(item); + } + + //si a des enfants + if(item.nbEnfants > 0){ + _ouvrirArborescenceCoche(item.enfants); + } + } +} + +/** + * TODO Remplacer par une fonction ouvrirParent() ? + * Ouvre le dossier et ouvre tous les ancêtres + * @param jQuery item Item à ouvrir + */ +function ouvrirItem(item){ + + //TODO Remplacer par item.ouvrir(), soir Couche.ouvrir() et Groupe.ouvrir() ?? + //ouvrir l'item + $('#arborescence input[data-expander-pour-id="' + item.id + '"]').prop('checked', 'checked'); + + if(item.parent && item.parent.estArbo()){ + ouvrirItem(item.parent); + } +} + +/** + * Fermer toute l'arborescence + */ +function fermerArborescence(){ + $('#arborescence .expander').each(function(){ + $(this).prop('checked', false); + }); + +} + +function selectionnerCommun(){ + _selectionnerCommun(arbo.obtenirElements()); + + return false; +} + +function _selectionnerCommun(items){ + var item; + var commune; + for(cle in items){ + item = items[cle]; + commune = item.attributs.obtenirAttribut('commune'); + if(commune && commune.estCoche()){ + selectionnerItem(item); + } + //si a des enfants + if(item.nbEnfants > 0 && item.estGroupe()){ + _selectionnerCommun(item.enfants); + } + } +} + +function selectionnerItem(item){ + //ouvrir l'item + $('#' + item.id + '_visible').click(); + if(item.parent){ + ouvrirItem(item.parent); + } +} + +/** + * Indique si un dossier doit être ouvert + * @param {type} item + * @param {type} terme + * @returns {Boolean} + */ +function doitEtreOuvert(item, terme){ + + //On veut que le texte spécifié soit présent + if(terme){ + + //Indiquer si le texte est présent + return item.contientLeTerme(terme); + + } + + return true; +} + +/** + * Initialise l'affichage et l'état de l'arborescence + * @returns {undefined} + */ +function initComposantesArbo(){ + + //Initialiser l'état pour ceux qui sont déjà coché + $("#ouvrirArborescence").on('click', ouvrirArborescence); + $("#fermerArborescence").on('click', fermerArborescence); + $("#selectionnerCommun").on('click', selectionnerCommun); + $("#terme").on('keypress', function(event){ + if ( event.which == 13 ) { + $("#ouvrirArborescence").click(); + } + + }); + +} \ No newline at end of file diff --git a/pilotage/public/js/arborescence/util.js b/pilotage/public/js/arborescence/util.js new file mode 100644 index 00000000..062ee0a6 --- /dev/null +++ b/pilotage/public/js/arborescence/util.js @@ -0,0 +1,214 @@ +function get_html_translation_table(table, quote_style) { + + var entities = {}, + hash_map = {}, + decimal; + var constMappingTable = {}, + constMappingQuoteStyle = {}; + var useTable = {}, + useQuoteStyle = {}; + + // Translate arguments + constMappingTable[0] = 'HTML_SPECIALCHARS'; + constMappingTable[1] = 'HTML_ENTITIES'; + constMappingQuoteStyle[0] = 'ENT_NOQUOTES'; + constMappingQuoteStyle[2] = 'ENT_COMPAT'; + constMappingQuoteStyle[3] = 'ENT_QUOTES'; + + useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS'; + useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : + 'ENT_COMPAT'; + + if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') { + throw new Error('Table: ' + useTable + ' not supported'); + // return false; + } + + entities['38'] = '&'; + if (useTable === 'HTML_ENTITIES') { + entities['160'] = ' '; + entities['161'] = '¡'; + entities['162'] = '¢'; + entities['163'] = '£'; + entities['164'] = '¤'; + entities['165'] = '¥'; + entities['166'] = '¦'; + entities['167'] = '§'; + entities['168'] = '¨'; + entities['169'] = '©'; + entities['170'] = 'ª'; + entities['171'] = '«'; + entities['172'] = '¬'; + entities['173'] = '­'; + entities['174'] = '®'; + entities['175'] = '¯'; + entities['176'] = '°'; + entities['177'] = '±'; + entities['178'] = '²'; + entities['179'] = '³'; + entities['180'] = '´'; + entities['181'] = 'µ'; + entities['182'] = '¶'; + entities['183'] = '·'; + entities['184'] = '¸'; + entities['185'] = '¹'; + entities['186'] = 'º'; + entities['187'] = '»'; + entities['188'] = '¼'; + entities['189'] = '½'; + entities['190'] = '¾'; + entities['191'] = '¿'; + entities['192'] = 'À'; + entities['193'] = 'Á'; + entities['194'] = 'Â'; + entities['195'] = 'Ã'; + entities['196'] = 'Ä'; + entities['197'] = 'Å'; + entities['198'] = 'Æ'; + entities['199'] = 'Ç'; + entities['200'] = 'È'; + entities['201'] = 'É'; + entities['202'] = 'Ê'; + entities['203'] = 'Ë'; + entities['204'] = 'Ì'; + entities['205'] = 'Í'; + entities['206'] = 'Î'; + entities['207'] = 'Ï'; + entities['208'] = 'Ð'; + entities['209'] = 'Ñ'; + entities['210'] = 'Ò'; + entities['211'] = 'Ó'; + entities['212'] = 'Ô'; + entities['213'] = 'Õ'; + entities['214'] = 'Ö'; + entities['215'] = '×'; + entities['216'] = 'Ø'; + entities['217'] = 'Ù'; + entities['218'] = 'Ú'; + entities['219'] = 'Û'; + entities['220'] = 'Ü'; + entities['221'] = 'Ý'; + entities['222'] = 'Þ'; + entities['223'] = 'ß'; + entities['224'] = 'à'; + entities['225'] = 'á'; + entities['226'] = 'â'; + entities['227'] = 'ã'; + entities['228'] = 'ä'; + entities['229'] = 'å'; + entities['230'] = 'æ'; + entities['231'] = 'ç'; + entities['232'] = 'è'; + entities['233'] = 'é'; + entities['234'] = 'ê'; + entities['235'] = 'ë'; + entities['236'] = 'ì'; + entities['237'] = 'í'; + entities['238'] = 'î'; + entities['239'] = 'ï'; + entities['240'] = 'ð'; + entities['241'] = 'ñ'; + entities['242'] = 'ò'; + entities['243'] = 'ó'; + entities['244'] = 'ô'; + entities['245'] = 'õ'; + entities['246'] = 'ö'; + entities['247'] = '÷'; + entities['248'] = 'ø'; + entities['249'] = 'ù'; + entities['250'] = 'ú'; + entities['251'] = 'û'; + entities['252'] = 'ü'; + entities['253'] = 'ý'; + entities['254'] = 'þ'; + entities['255'] = 'ÿ'; + } + + if (useQuoteStyle !== 'ENT_NOQUOTES') { + entities['34'] = '"'; + } + if (useQuoteStyle === 'ENT_QUOTES') { + entities['39'] = '''; + } + entities['60'] = '<'; + entities['62'] = '>'; + + // ascii decimals to real symbols + for (decimal in entities) { + if (entities.hasOwnProperty(decimal)) { + hash_map[String.fromCharCode(decimal)] = entities[decimal]; + } + } + + return hash_map; +} + + +function html_entity_decode(string, quote_style) { + + var hash_map = {}, + symbol = '', + tmp_str = '', + entity = ''; + tmp_str = string.toString(); + + if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) { + return false; + } + + // fix & problem + // http://phpjs.org/functions/get_html_translation_table:416#comment_97660 + delete(hash_map['&']); + hash_map['&'] = '&'; + + for (symbol in hash_map) { + entity = hash_map[symbol]; + tmp_str = tmp_str.split(entity) + .join(symbol); + } + tmp_str = tmp_str.split(''') + .join("'"); + + return tmp_str; +} + + +var removeDiacritics = (function() { + var diacritics = {"\u24B6": "A", "\uFF21": "A", "\u00C0": "A", "\u00C1": "A", "\u00C2": "A", "\u1EA6": "A", "\u1EA4": "A", "\u1EAA": "A", "\u1EA8": "A", "\u00C3": "A", "\u0100": "A", "\u0102": "A", "\u1EB0": "A", "\u1EAE": "A", "\u1EB4": "A", "\u1EB2": "A", "\u0226": "A", "\u01E0": "A", "\u00C4": "A", "\u01DE": "A", "\u1EA2": "A", "\u00C5": "A", "\u01FA": "A", "\u01CD": "A", "\u0200": "A", "\u0202": "A", "\u1EA0": "A", "\u1EAC": "A", "\u1EB6": "A", "\u1E00": "A", "\u0104": "A", "\u023A": "A", "\u2C6F": "A", "\uA732": "AA", "\u00C6": "AE", "\u01FC": "AE", "\u01E2": "AE", "\uA734": "AO", "\uA736": "AU", "\uA738": "AV", "\uA73A": "AV", "\uA73C": "AY", "\u24B7": "B", "\uFF22": "B", "\u1E02": "B", "\u1E04": "B", "\u1E06": "B", "\u0243": "B", "\u0182": "B", "\u0181": "B", "\u24B8": "C", "\uFF23": "C", "\u0106": "C", "\u0108": "C", "\u010A": "C", "\u010C": "C", "\u00C7": "C", "\u1E08": "C", "\u0187": "C", "\u023B": "C", "\uA73E": "C", "\u24B9": "D", "\uFF24": "D", "\u1E0A": "D", "\u010E": "D", "\u1E0C": "D", "\u1E10": "D", "\u1E12": "D", "\u1E0E": "D", "\u0110": "D", "\u018B": "D", "\u018A": "D", "\u0189": "D", "\uA779": "D", "\u01F1": "DZ", "\u01C4": "DZ", "\u01F2": "Dz", "\u01C5": "Dz", "\u24BA": "E", "\uFF25": "E", "\u00C8": "E", "\u00C9": "E", "\u00CA": "E", "\u1EC0": "E", "\u1EBE": "E", "\u1EC4": "E", "\u1EC2": "E", "\u1EBC": "E", "\u0112": "E", "\u1E14": "E", "\u1E16": "E", "\u0114": "E", "\u0116": "E", "\u00CB": "E", "\u1EBA": "E", "\u011A": "E", "\u0204": "E", "\u0206": "E", "\u1EB8": "E", "\u1EC6": "E", "\u0228": "E", "\u1E1C": "E", "\u0118": "E", "\u1E18": "E", "\u1E1A": "E", "\u0190": "E", "\u018E": "E", "\u24BB": "F", "\uFF26": "F", "\u1E1E": "F", "\u0191": "F", "\uA77B": "F", "\u24BC": "G", "\uFF27": "G", "\u01F4": "G", "\u011C": "G", "\u1E20": "G", "\u011E": "G", "\u0120": "G", "\u01E6": "G", "\u0122": "G", "\u01E4": "G", "\u0193": "G", "\uA7A0": "G", "\uA77D": "G", "\uA77E": "G", "\u24BD": "H", "\uFF28": "H", "\u0124": "H", "\u1E22": "H", "\u1E26": "H", "\u021E": "H", "\u1E24": "H", "\u1E28": "H", "\u1E2A": "H", "\u0126": "H", "\u2C67": "H", "\u2C75": "H", "\uA78D": "H", "\u24BE": "I", "\uFF29": "I", "\u00CC": "I", "\u00CD": "I", "\u00CE": "I", "\u0128": "I", "\u012A": "I", "\u012C": "I", "\u0130": "I", "\u00CF": "I", "\u1E2E": "I", "\u1EC8": "I", "\u01CF": "I", "\u0208": "I", "\u020A": "I", "\u1ECA": "I", "\u012E": "I", "\u1E2C": "I", "\u0197": "I", "\u24BF": "J", "\uFF2A": "J", "\u0134": "J", "\u0248": "J", "\u24C0": "K", "\uFF2B": "K", "\u1E30": "K", "\u01E8": "K", "\u1E32": "K", "\u0136": "K", "\u1E34": "K", "\u0198": "K", "\u2C69": "K", "\uA740": "K", "\uA742": "K", "\uA744": "K", "\uA7A2": "K", "\u24C1": "L", "\uFF2C": "L", "\u013F": "L", "\u0139": "L", "\u013D": "L", "\u1E36": "L", "\u1E38": "L", "\u013B": "L", "\u1E3C": "L", "\u1E3A": "L", "\u0141": "L", "\u023D": "L", "\u2C62": "L", "\u2C60": "L", "\uA748": "L", "\uA746": "L", "\uA780": "L", "\u01C7": "LJ", "\u01C8": "Lj", "\u24C2": "M", "\uFF2D": "M", "\u1E3E": "M", "\u1E40": "M", "\u1E42": "M", "\u2C6E": "M", "\u019C": "M", "\u24C3": "N", "\uFF2E": "N", "\u01F8": "N", "\u0143": "N", "\u00D1": "N", "\u1E44": "N", "\u0147": "N", "\u1E46": "N", "\u0145": "N", "\u1E4A": "N", "\u1E48": "N", "\u0220": "N", "\u019D": "N", "\uA790": "N", "\uA7A4": "N", "\u01CA": "NJ", "\u01CB": "Nj", "\u24C4": "O", "\uFF2F": "O", "\u00D2": "O", "\u00D3": "O", "\u00D4": "O", "\u1ED2": "O", "\u1ED0": "O", "\u1ED6": "O", "\u1ED4": "O", "\u00D5": "O", "\u1E4C": "O", "\u022C": "O", "\u1E4E": "O", "\u014C": "O", "\u1E50": "O", "\u1E52": "O", "\u014E": "O", "\u022E": "O", "\u0230": "O", "\u00D6": "O", "\u022A": "O", "\u1ECE": "O", "\u0150": "O", "\u01D1": "O", "\u020C": "O", "\u020E": "O", "\u01A0": "O", "\u1EDC": "O", "\u1EDA": "O", "\u1EE0": "O", "\u1EDE": "O", "\u1EE2": "O", "\u1ECC": "O", "\u1ED8": "O", "\u01EA": "O", "\u01EC": "O", "\u00D8": "O", "\u01FE": "O", "\u0186": "O", "\u019F": "O", "\uA74A": "O", "\uA74C": "O", "\u0152": "OE", "\u01A2": "OI", "\uA74E": "OO", "\u0222": "OU", "\u24C5": "P", "\uFF30": "P", "\u1E54": "P", "\u1E56": "P", "\u01A4": "P", "\u2C63": "P", "\uA750": "P", "\uA752": "P", "\uA754": "P", "\u24C6": "Q", "\uFF31": "Q", "\uA756": "Q", "\uA758": "Q", "\u024A": "Q", "\u24C7": "R", "\uFF32": "R", "\u0154": "R", "\u1E58": "R", "\u0158": "R", "\u0210": "R", "\u0212": "R", "\u1E5A": "R", "\u1E5C": "R", "\u0156": "R", "\u1E5E": "R", "\u024C": "R", "\u2C64": "R", "\uA75A": "R", "\uA7A6": "R", "\uA782": "R", "\u24C8": "S", "\uFF33": "S", "\u015A": "S", "\u1E64": "S", "\u015C": "S", "\u1E60": "S", "\u0160": "S", "\u1E66": "S", "\u1E62": "S", "\u1E68": "S", "\u0218": "S", "\u015E": "S", "\u2C7E": "S", "\uA7A8": "S", "\uA784": "S", "\u1E9E": "SS", "\u24C9": "T", "\uFF34": "T", "\u1E6A": "T", "\u0164": "T", "\u1E6C": "T", "\u021A": "T", "\u0162": "T", "\u1E70": "T", "\u1E6E": "T", "\u0166": "T", "\u01AC": "T", "\u01AE": "T", "\u023E": "T", "\uA786": "T", "\uA728": "TZ", "\u24CA": "U", "\uFF35": "U", "\u00D9": "U", "\u00DA": "U", "\u00DB": "U", "\u0168": "U", "\u1E78": "U", "\u016A": "U", "\u1E7A": "U", "\u016C": "U", "\u00DC": "U", "\u01DB": "U", "\u01D7": "U", "\u01D5": "U", "\u01D9": "U", "\u1EE6": "U", "\u016E": "U", "\u0170": "U", "\u01D3": "U", "\u0214": "U", "\u0216": "U", "\u01AF": "U", "\u1EEA": "U", "\u1EE8": "U", "\u1EEE": "U", "\u1EEC": "U", "\u1EF0": "U", "\u1EE4": "U", "\u1E72": "U", "\u0172": "U", "\u1E76": "U", "\u1E74": "U", "\u0244": "U", "\u24CB": "V", "\uFF36": "V", "\u1E7C": "V", "\u1E7E": "V", "\u01B2": "V", "\uA75E": "V", "\u0245": "V", "\uA760": "VY", "\u24CC": "W", "\uFF37": "W", "\u1E80": "W", "\u1E82": "W", "\u0174": "W", "\u1E86": "W", "\u1E84": "W", "\u1E88": "W", "\u2C72": "W", "\u24CD": "X", "\uFF38": "X", "\u1E8A": "X", "\u1E8C": "X", "\u24CE": "Y", "\uFF39": "Y", "\u1EF2": "Y", "\u00DD": "Y", "\u0176": "Y", "\u1EF8": "Y", "\u0232": "Y", "\u1E8E": "Y", "\u0178": "Y", "\u1EF6": "Y", "\u1EF4": "Y", "\u01B3": "Y", "\u024E": "Y", "\u1EFE": "Y", "\u24CF": "Z", "\uFF3A": "Z", "\u0179": "Z", "\u1E90": "Z", "\u017B": "Z", "\u017D": "Z", "\u1E92": "Z", "\u1E94": "Z", "\u01B5": "Z", "\u0224": "Z", "\u2C7F": "Z", "\u2C6B": "Z", "\uA762": "Z", "\u24D0": "a", "\uFF41": "a", "\u1E9A": "a", "\u00E0": "a", "\u00E1": "a", "\u00E2": "a", "\u1EA7": "a", "\u1EA5": "a", "\u1EAB": "a", "\u1EA9": "a", "\u00E3": "a", "\u0101": "a", "\u0103": "a", "\u1EB1": "a", "\u1EAF": "a", "\u1EB5": "a", "\u1EB3": "a", "\u0227": "a", "\u01E1": "a", "\u00E4": "a", "\u01DF": "a", "\u1EA3": "a", "\u00E5": "a", "\u01FB": "a", "\u01CE": "a", "\u0201": "a", "\u0203": "a", "\u1EA1": "a", "\u1EAD": "a", "\u1EB7": "a", "\u1E01": "a", "\u0105": "a", "\u2C65": "a", "\u0250": "a", "\uA733": "aa", "\u00E6": "ae", "\u01FD": "ae", "\u01E3": "ae", "\uA735": "ao", "\uA737": "au", "\uA739": "av", "\uA73B": "av", "\uA73D": "ay", "\u24D1": "b", "\uFF42": "b", "\u1E03": "b", "\u1E05": "b", "\u1E07": "b", "\u0180": "b", "\u0183": "b", "\u0253": "b", "\u24D2": "c", "\uFF43": "c", "\u0107": "c", "\u0109": "c", "\u010B": "c", "\u010D": "c", "\u00E7": "c", "\u1E09": "c", "\u0188": "c", "\u023C": "c", "\uA73F": "c", "\u2184": "c", "\u24D3": "d", "\uFF44": "d", "\u1E0B": "d", "\u010F": "d", "\u1E0D": "d", "\u1E11": "d", "\u1E13": "d", "\u1E0F": "d", "\u0111": "d", "\u018C": "d", "\u0256": "d", "\u0257": "d", "\uA77A": "d", "\u01F3": "dz", "\u01C6": "dz", "\u24D4": "e", "\uFF45": "e", "\u00E8": "e", "\u00E9": "e", "\u00EA": "e", "\u1EC1": "e", "\u1EBF": "e", "\u1EC5": "e", "\u1EC3": "e", "\u1EBD": "e", "\u0113": "e", "\u1E15": "e", "\u1E17": "e", "\u0115": "e", "\u0117": "e", "\u00EB": "e", "\u1EBB": "e", "\u011B": "e", "\u0205": "e", "\u0207": "e", "\u1EB9": "e", "\u1EC7": "e", "\u0229": "e", "\u1E1D": "e", "\u0119": "e", "\u1E19": "e", "\u1E1B": "e", "\u0247": "e", "\u025B": "e", "\u01DD": "e", "\u24D5": "f", "\uFF46": "f", "\u1E1F": "f", "\u0192": "f", "\uA77C": "f", "\u24D6": "g", "\uFF47": "g", "\u01F5": "g", "\u011D": "g", "\u1E21": "g", "\u011F": "g", "\u0121": "g", "\u01E7": "g", "\u0123": "g", "\u01E5": "g", "\u0260": "g", "\uA7A1": "g", "\u1D79": "g", "\uA77F": "g", "\u24D7": "h", "\uFF48": "h", "\u0125": "h", "\u1E23": "h", "\u1E27": "h", "\u021F": "h", "\u1E25": "h", "\u1E29": "h", "\u1E2B": "h", "\u1E96": "h", "\u0127": "h", "\u2C68": "h", "\u2C76": "h", "\u0265": "h", "\u0195": "hv", "\u24D8": "i", "\uFF49": "i", "\u00EC": "i", "\u00ED": "i", "\u00EE": "i", "\u0129": "i", "\u012B": "i", "\u012D": "i", "\u00EF": "i", "\u1E2F": "i", "\u1EC9": "i", "\u01D0": "i", "\u0209": "i", "\u020B": "i", "\u1ECB": "i", "\u012F": "i", "\u1E2D": "i", "\u0268": "i", "\u0131": "i", "\u24D9": "j", "\uFF4A": "j", "\u0135": "j", "\u01F0": "j", "\u0249": "j", "\u24DA": "k", "\uFF4B": "k", "\u1E31": "k", "\u01E9": "k", "\u1E33": "k", "\u0137": "k", "\u1E35": "k", "\u0199": "k", "\u2C6A": "k", "\uA741": "k", "\uA743": "k", "\uA745": "k", "\uA7A3": "k", "\u24DB": "l", "\uFF4C": "l", "\u0140": "l", "\u013A": "l", "\u013E": "l", "\u1E37": "l", "\u1E39": "l", "\u013C": "l", "\u1E3D": "l", "\u1E3B": "l", "\u0142": "l", "\u019A": "l", "\u026B": "l", "\u2C61": "l", "\uA749": "l", "\uA781": "l", "\uA747": "l", "\u01C9": "lj", "\u24DC": "m", "\uFF4D": "m", "\u1E3F": "m", "\u1E41": "m", "\u1E43": "m", "\u0271": "m", "\u026F": "m", "\u24DD": "n", "\uFF4E": "n", "\u01F9": "n", "\u0144": "n", "\u00F1": "n", "\u1E45": "n", "\u0148": "n", "\u1E47": "n", "\u0146": "n", "\u1E4B": "n", "\u1E49": "n", "\u019E": "n", "\u0272": "n", "\u0149": "n", "\uA791": "n", "\uA7A5": "n", "\u01CC": "nj", "\u24DE": "o", "\uFF4F": "o", "\u00F2": "o", "\u00F3": "o", "\u00F4": "o", "\u1ED3": "o", "\u1ED1": "o", "\u1ED7": "o", "\u1ED5": "o", "\u00F5": "o", "\u1E4D": "o", "\u022D": "o", "\u1E4F": "o", "\u014D": "o", "\u1E51": "o", "\u1E53": "o", "\u014F": "o", "\u022F": "o", "\u0231": "o", "\u00F6": "o", "\u022B": "o", "\u1ECF": "o", "\u0151": "o", "\u01D2": "o", "\u020D": "o", "\u020F": "o", "\u01A1": "o", "\u1EDD": "o", "\u1EDB": "o", "\u1EE1": "o", "\u1EDF": "o", "\u1EE3": "o", "\u1ECD": "o", "\u1ED9": "o", "\u01EB": "o", "\u01ED": "o", "\u00F8": "o", "\u01FF": "o", "\u0254": "o", "\uA74B": "o", "\uA74D": "o", "\u0275": "o", "\u0153": "oe", "\u0276": "oe", "\u01A3": "oi", "\u0223": "ou", "\uA74F": "oo", "\u24DF": "p", "\uFF50": "p", "\u1E55": "p", "\u1E57": "p", "\u01A5": "p", "\u1D7D": "p", "\uA751": "p", "\uA753": "p", "\uA755": "p", "\u24E0": "q", "\uFF51": "q", "\u024B": "q", "\uA757": "q", "\uA759": "q", "\u24E1": "r", "\uFF52": "r", "\u0155": "r", "\u1E59": "r", "\u0159": "r", "\u0211": "r", "\u0213": "r", "\u1E5B": "r", "\u1E5D": "r", "\u0157": "r", "\u1E5F": "r", "\u024D": "r", "\u027D": "r", "\uA75B": "r", "\uA7A7": "r", "\uA783": "r", "\u24E2": "s", "\uFF53": "s", "\u015B": "s", "\u1E65": "s", "\u015D": "s", "\u1E61": "s", "\u0161": "s", "\u1E67": "s", "\u1E63": "s", "\u1E69": "s", "\u0219": "s", "\u015F": "s", "\u023F": "s", "\uA7A9": "s", "\uA785": "s", "\u017F": "s", "\u1E9B": "s", "\u00DF": "ss", "\u24E3": "t", "\uFF54": "t", "\u1E6B": "t", "\u1E97": "t", "\u0165": "t", "\u1E6D": "t", "\u021B": "t", "\u0163": "t", "\u1E71": "t", "\u1E6F": "t", "\u0167": "t", "\u01AD": "t", "\u0288": "t", "\u2C66": "t", "\uA787": "t", "\uA729": "tz", "\u24E4": "u", "\uFF55": "u", "\u00F9": "u", "\u00FA": "u", "\u00FB": "u", "\u0169": "u", "\u1E79": "u", "\u016B": "u", "\u1E7B": "u", "\u016D": "u", "\u00FC": "u", "\u01DC": "u", "\u01D8": "u", "\u01D6": "u", "\u01DA": "u", "\u1EE7": "u", "\u016F": "u", "\u0171": "u", "\u01D4": "u", "\u0215": "u", "\u0217": "u", "\u01B0": "u", "\u1EEB": "u", "\u1EE9": "u", "\u1EEF": "u", "\u1EED": "u", "\u1EF1": "u", "\u1EE5": "u", "\u1E73": "u", "\u0173": "u", "\u1E77": "u", "\u1E75": "u", "\u0289": "u", "\u24E5": "v", "\uFF56": "v", "\u1E7D": "v", "\u1E7F": "v", "\u028B": "v", "\uA75F": "v", "\u028C": "v", "\uA761": "vy", "\u24E6": "w", "\uFF57": "w", "\u1E81": "w", "\u1E83": "w", "\u0175": "w", "\u1E87": "w", "\u1E85": "w", "\u1E98": "w", "\u1E89": "w", "\u2C73": "w", "\u24E7": "x", "\uFF58": "x", "\u1E8B": "x", "\u1E8D": "x", "\u24E8": "y", "\uFF59": "y", "\u1EF3": "y", "\u00FD": "y", "\u0177": "y", "\u1EF9": "y", "\u0233": "y", "\u1E8F": "y", "\u00FF": "y", "\u1EF7": "y", "\u1E99": "y", "\u1EF5": "y", "\u01B4": "y", "\u024F": "y", "\u1EFF": "y", "\u24E9": "z", "\uFF5A": "z", "\u017A": "z", "\u1E91": "z", "\u017C": "z", "\u017E": "z", "\u1E93": "z", "\u1E95": "z", "\u01B6": "z", "\u0225": "z", "\u0240": "z", "\u2C6C": "z", "\uA763": "z", "\uFF10": "0", "\u2080": "0", "\u24EA": "0", "\u2070": "0", "\u00B9": "1", "\u2474": "1", "\u2081": "1", "\u2776": "1", "\u24F5": "1", "\u2488": "1", "\u2460": "1", "\uFF11": "1", "\u00B2": "2", "\u2777": "2", "\u2475": "2", "\uFF12": "2", "\u2082": "2", "\u24F6": "2", "\u2461": "2", "\u2489": "2", "\u00B3": "3", "\uFF13": "3", "\u248A": "3", "\u2476": "3", "\u2083": "3", "\u2778": "3", "\u24F7": "3", "\u2462": "3", "\u24F8": "4", "\u2463": "4", "\u248B": "4", "\uFF14": "4", "\u2074": "4", "\u2084": "4", "\u2779": "4", "\u2477": "4", "\u248C": "5", "\u2085": "5", "\u24F9": "5", "\u2478": "5", "\u277A": "5", "\u2464": "5", "\uFF15": "5", "\u2075": "5", "\u2479": "6", "\u2076": "6", "\uFF16": "6", "\u277B": "6", "\u2086": "6", "\u2465": "6", "\u24FA": "6", "\u248D": "6", "\uFF17": "7", "\u2077": "7", "\u277C": "7", "\u24FB": "7", "\u248E": "7", "\u2087": "7", "\u247A": "7", "\u2466": "7", "\u2467": "8", "\u248F": "8", "\u24FC": "8", "\u247B": "8", "\u2078": "8", "\uFF18": "8", "\u277D": "8", "\u2088": "8", "\u24FD": "9", "\uFF19": "9", "\u2490": "9", "\u277E": "9", "\u247C": "9", "\u2089": "9", "\u2468": "9", "\u2079": "9"}; + return function(str) { + var chars = str.split(''), + i = chars.length - 1, + alter = false, + ch; + for (; i >= 0; i--) { + ch = chars[i]; + if (diacritics.hasOwnProperty(ch)) { + chars[i] = diacritics[ch]; + alter = true; + } + } + if (alter) { + str = chars.join(''); + } + return str; + } +})(); + + + +function indexOfRegExp(chaine, cherche) { + + //Récupérer la version sans entitées html du texte + chaine = html_entity_decode(chaine, ''); + + //Enlever les accents + cherche = removeDiacritics(cherche); + chaine = removeDiacritics(chaine); + + //Échapper les caractères spéciaux dans l'expression régulière + cherche = cherche.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + cherche = cherche.replace(/\$/g, '$$$$'); + + var regExp = new RegExp(cherche, 'i'); + return chaine.match(regExp); +} \ No newline at end of file diff --git a/pilotage/public/js/bootstrap-datetimepicker.fr.js b/pilotage/public/js/bootstrap-datetimepicker.fr.js new file mode 100644 index 00000000..ccb27186 --- /dev/null +++ b/pilotage/public/js/bootstrap-datetimepicker.fr.js @@ -0,0 +1,56 @@ +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('fr', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + + diff --git a/pilotage/public/js/bootstrap-datetimepicker.js b/pilotage/public/js/bootstrap-datetimepicker.js new file mode 100644 index 00000000..ba247570 --- /dev/null +++ b/pilotage/public/js/bootstrap-datetimepicker.js @@ -0,0 +1,1166 @@ +/* +Version 3.0.0 +========================================================= +bootstrap-datetimepicker.js +https://github.com/Eonasdan/bootstrap-datetimepicker +========================================================= +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Peterson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +; (function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD is used - Register as an anonymous module. + define(['jquery', 'moment'], factory); + } else { + // AMD is not used - Attempt to fetch dependencies from scope. + if (!jQuery) { + throw 'bootstrap-datetimepicker requires jQuery to be loaded first'; + } else if (!moment) { + throw 'bootstrap-datetimepicker requires moment.js to be loaded first'; + } else { + factory(jQuery, moment); + } + } +} + +(function ($, moment) { + if (typeof moment === 'undefined') { + alert("momentjs is requried"); + throw new Error('momentjs is required'); + }; + + var dpgId = 0, + + pMoment = moment, + +// ReSharper disable once InconsistentNaming + DateTimePicker = function (element, options) { + var defaults = { + pickDate: true, + pickTime: true, + useMinutes: true, + useSeconds: false, + useCurrent: true, + minuteStepping: 1, + minDate: new pMoment({ y: 1900 }), + maxDate: new pMoment().add(100, "y"), + showToday: true, + collapse: true, + language: "en", + defaultDate: "", + disabledDates: false, + enabledDates: false, + icons: {}, + useStrict: false, + direction: "auto", + sideBySide: false, + daysOfWeekDisabled: false + }, + + icons = { + time: 'glyphicon glyphicon-time', + date: 'glyphicon glyphicon-calendar', + up: 'glyphicon glyphicon-chevron-up', + down: 'glyphicon glyphicon-chevron-down' + }, + + picker = this, + + init = function () { + + var icon = false, i, dDate, longDateFormat; + picker.options = $.extend({}, defaults, options); + picker.options.icons = $.extend({}, icons, picker.options.icons); + + picker.element = $(element); + + dataToOptions(); + + if (!(picker.options.pickTime || picker.options.pickDate)) + throw new Error('Must choose at least one picker'); + + picker.id = dpgId++; + pMoment.lang(picker.options.language); + picker.date = pMoment(); + picker.unset = false; + picker.isInput = picker.element.is('input'); + picker.component = false; + + if (picker.element.hasClass('input-group')) { + if (picker.element.find('.datepickerbutton').size() == 0) {//in case there is more then one 'input-group-addon' Issue #48 + picker.component = picker.element.find("[class^='input-group-']"); + } + else { + picker.component = picker.element.find('.datepickerbutton'); + } + } + picker.format = picker.options.format; + + longDateFormat = pMoment()._lang._longDateFormat; + + if (!picker.format) { + picker.format = (picker.options.pickDate ? longDateFormat.L : ''); + if (picker.options.pickDate && picker.options.pickTime) picker.format += ' '; + picker.format += (picker.options.pickTime ? longDateFormat.LT : ''); + if (picker.options.useSeconds) { + if (~longDateFormat.LT.indexOf(' A')) { + picker.format = picker.format.split(" A")[0] + ":ss A"; + } + else { + picker.format += ':ss'; + } + } + } + picker.use24hours = picker.format.toLowerCase().indexOf("a") < 1; + + if (picker.component) icon = picker.component.find('span'); + + if (picker.options.pickTime) { + if (icon) icon.addClass(picker.options.icons.time); + } + if (picker.options.pickDate) { + if (icon) { + icon.removeClass(picker.options.icons.time); + icon.addClass(picker.options.icons.date); + } + } + + picker.widget = $(getTemplate()).appendTo('body'); + + if (picker.options.useSeconds && !picker.use24hours) { + picker.widget.width(300); + } + + picker.minViewMode = picker.options.minViewMode || 0; + if (typeof picker.minViewMode === 'string') { + switch (picker.minViewMode) { + case 'months': + picker.minViewMode = 1; + break; + case 'years': + picker.minViewMode = 2; + break; + default: + picker.minViewMode = 0; + break; + } + } + picker.viewMode = picker.options.viewMode || 0; + if (typeof picker.viewMode === 'string') { + switch (picker.viewMode) { + case 'months': + picker.viewMode = 1; + break; + case 'years': + picker.viewMode = 2; + break; + default: + picker.viewMode = 0; + break; + } + } + + picker.options.disabledDates = indexGivenDates(picker.options.disabledDates); + picker.options.enabledDates = indexGivenDates(picker.options.enabledDates); + + picker.startViewMode = picker.viewMode; + picker.setMinDate(picker.options.minDate); + picker.setMaxDate(picker.options.maxDate); + fillDow(); + fillMonths(); + fillHours(); + fillMinutes(); + fillSeconds(); + update(); + showMode(); + attachDatePickerEvents(); + if (picker.options.defaultDate !== "" && getPickerInput().val() == "") picker.setValue(picker.options.defaultDate); + if (picker.options.minuteStepping !== 1) { + var rInterval = picker.options.minuteStepping; + picker.date.minutes((Math.round(picker.date.minutes() / rInterval) * rInterval) % 60).seconds(0); + } + }, + + getPickerInput = function () { + if (picker.isInput) { + return picker.element; + } else { + return dateStr = picker.element.find('input'); + } + }, + + dataToOptions = function () { + var eData + if (picker.element.is('input')) { + eData = picker.element.data(); + } + else { + eData = picker.element.data(); + } + if (eData.dateFormat !== undefined) picker.options.format = eData.dateFormat; + if (eData.datePickdate !== undefined) picker.options.pickDate = eData.datePickdate; + if (eData.datePicktime !== undefined) picker.options.pickTime = eData.datePicktime; + if (eData.dateUseminutes !== undefined) picker.options.useMinutes = eData.dateUseminutes; + if (eData.dateUseseconds !== undefined) picker.options.useSeconds = eData.dateUseseconds; + if (eData.dateUsecurrent !== undefined) picker.options.useCurrent = eData.dateUsecurrent; + if (eData.dateMinutestepping !== undefined) picker.options.minuteStepping = eData.dateMinutestepping; + if (eData.dateMindate !== undefined) picker.options.minDate = eData.dateMindate; + if (eData.dateMaxdate !== undefined) picker.options.maxDate = eData.dateMaxdate; + if (eData.dateShowtoday !== undefined) picker.options.showToday = eData.dateShowtoday; + if (eData.dateCollapse !== undefined) picker.options.collapse = eData.dateCollapse; + if (eData.dateLanguage !== undefined) picker.options.language = eData.dateLanguage; + if (eData.dateDefaultdate !== undefined) picker.options.defaultDate = eData.dateDefaultdate; + if (eData.dateDisableddates !== undefined) picker.options.disabledDates = eData.dateDisableddates; + if (eData.dateEnableddates !== undefined) picker.options.enabledDates = eData.dateEnableddates; + if (eData.dateIcons !== undefined) picker.options.icons = eData.dateIcons; + if (eData.dateUsestrict !== undefined) picker.options.useStrict = eData.dateUsestrict; + if (eData.dateDirection !== undefined) picker.options.direction = eData.dateDirection; + if (eData.dateSidebyside !== undefined) picker.options.sideBySide = eData.dateSidebyside; + }, + + place = function () { + var position = 'absolute', + offset = picker.component ? picker.component.offset() : picker.element.offset(), $window = $(window); + picker.width = picker.component ? picker.component.outerWidth() : picker.element.outerWidth(); + offset.top = offset.top + picker.element.outerHeight(); + + var placePosition; + if (picker.options.direction === 'up') { + placePosition = 'top' + } else if (picker.options.direction === 'bottom') { + placePosition = 'bottom' + } else if (picker.options.direction === 'auto') { + if (offset.top + picker.widget.height() > $window.height() + $window.scrollTop() && picker.widget.height() + picker.element.outerHeight() < offset.top) { + placePosition = 'top'; + } else { + placePosition = 'bottom'; + } + }; + if (placePosition === 'top') { + offset.top -= picker.widget.height() + picker.element.outerHeight() + 15; + picker.widget.addClass('top').removeClass('bottom'); + } else { + offset.top += 1; + picker.widget.addClass('bottom').removeClass('top'); + } + + if (picker.options.width !== undefined) { + picker.widget.width(picker.options.width); + } + + if (picker.options.orientation === 'left') { + picker.widget.addClass('left-oriented'); + offset.left = offset.left - picker.widget.width() + 20; + } + + if (isInFixed()) { + position = 'fixed'; + offset.top -= $window.scrollTop(); + offset.left -= $window.scrollLeft(); + } + + if ($window.width() < offset.left + picker.widget.outerWidth()) { + offset.right = $window.width() - offset.left - picker.width; + offset.left = 'auto'; + picker.widget.addClass('pull-right'); + } else { + offset.right = 'auto'; + picker.widget.removeClass('pull-right'); + } + + picker.widget.css({ + position: position, + top: offset.top, + left: offset.left, + right: offset.right + }); + }, + + notifyChange = function (oldDate, eventType) { + if (pMoment(picker.date).isSame(pMoment(oldDate))) return; + picker.element.trigger({ + type: 'dp.change', + date: pMoment(picker.date), + oldDate: pMoment(oldDate) + }); + + if (eventType !== 'change') + picker.element.change(); + }, + + notifyError = function (date) { + picker.element.trigger({ + type: 'dp.error', + date: pMoment(date) + }); + }, + + update = function (newDate) { + pMoment.lang(picker.options.language); + var dateStr = newDate; + if (!dateStr) { + dateStr = getPickerInput().val() + if (dateStr) picker.date = pMoment(dateStr, picker.format, picker.options.useStrict); + if (!picker.date) picker.date = pMoment(); + } + picker.viewDate = pMoment(picker.date).startOf("month"); + fillDate(); + fillTime(); + }, + + fillDow = function () { + pMoment.lang(picker.options.language); + var html = $(''), weekdaysMin = pMoment.weekdaysMin(), i; + if (pMoment()._lang._week.dow == 0) { // starts on Sunday + for (i = 0; i < 7; i++) { + html.append('' + weekdaysMin[i] + ''); + } + } else { + for (i = 1; i < 8; i++) { + if (i == 7) { + html.append('' + weekdaysMin[0] + ''); + } else { + html.append('' + weekdaysMin[i] + ''); + } + } + } + picker.widget.find('.datepicker-days thead').append(html); + }, + + fillMonths = function () { + pMoment.lang(picker.options.language); + var html = '', i = 0, monthsShort = pMoment.monthsShort(); + while (i < 12) { + html += '' + monthsShort[i++] + ''; + } + picker.widget.find('.datepicker-months td').append(html); + }, + + fillDate = function () { + pMoment.lang(picker.options.language); + var year = picker.viewDate.year(), + month = picker.viewDate.month(), + startYear = picker.options.minDate.year(), + startMonth = picker.options.minDate.month(), + endYear = picker.options.maxDate.year(), + endMonth = picker.options.maxDate.month(), + prevMonth, nextMonth, html = [], row, clsName, i, days, yearCont, currentYear, months = pMoment.months(); + + picker.widget.find('.datepicker-days').find('.disabled').removeClass('disabled'); + picker.widget.find('.datepicker-months').find('.disabled').removeClass('disabled'); + picker.widget.find('.datepicker-years').find('.disabled').removeClass('disabled'); + + picker.widget.find('.datepicker-days th:eq(1)').text( + months[month] + ' ' + year); + + prevMonth = pMoment(picker.viewDate).subtract("months", 1); + days = prevMonth.daysInMonth(); + prevMonth.date(days).startOf('week'); + if ((year == startYear && month <= startMonth) || year < startYear) { + picker.widget.find('.datepicker-days th:eq(0)').addClass('disabled'); + } + if ((year == endYear && month >= endMonth) || year > endYear) { + picker.widget.find('.datepicker-days th:eq(2)').addClass('disabled'); + } + + nextMonth = pMoment(prevMonth).add(42, "d"); + while (prevMonth.isBefore(nextMonth)) { + if (prevMonth.weekday() === pMoment().startOf('week').weekday()) { + row = $(''); + html.push(row); + } + clsName = ''; + if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) { + clsName += ' old'; + } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) { + clsName += ' new'; + } + if (prevMonth.isSame(pMoment({ y: picker.date.year(), M: picker.date.month(), d: picker.date.date() }))) { + clsName += ' active'; + } + if (isInDisableDates(prevMonth) || !isInEnableDates(prevMonth)) { + clsName += ' disabled'; + } + if (picker.options.showToday === true) { + if (prevMonth.isSame(pMoment(), 'day')) { + clsName += ' today'; + } + } + if (picker.options.daysOfWeekDisabled) { + for (i in picker.options.daysOfWeekDisabled) { + if (prevMonth.day() == picker.options.daysOfWeekDisabled[i]) { + clsName += ' disabled'; + break; + } + } + } + row.append('' + prevMonth.date() + ''); + prevMonth.add(1, "d"); + } + picker.widget.find('.datepicker-days tbody').empty().append(html); + currentYear = picker.date.year(), months = picker.widget.find('.datepicker-months') + .find('th:eq(1)').text(year).end().find('span').removeClass('active'); + if (currentYear === year) { + months.eq(picker.date.month()).addClass('active'); + } + if (currentYear - 1 < startYear) { + picker.widget.find('.datepicker-months th:eq(0)').addClass('disabled'); + } + if (currentYear + 1 > endYear) { + picker.widget.find('.datepicker-months th:eq(2)').addClass('disabled'); + } + for (i = 0; i < 12; i++) { + if ((year == startYear && startMonth > i) || (year < startYear)) { + $(months[i]).addClass('disabled'); + } else if ((year == endYear && endMonth < i) || (year > endYear)) { + $(months[i]).addClass('disabled'); + } + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + yearCont = picker.widget.find('.datepicker-years').find( + 'th:eq(1)').text(year + '-' + (year + 9)).end().find('td'); + picker.widget.find('.datepicker-years').find('th').removeClass('disabled'); + if (startYear > year) { + picker.widget.find('.datepicker-years').find('th:eq(0)').addClass('disabled'); + } + if (endYear < year + 9) { + picker.widget.find('.datepicker-years').find('th:eq(2)').addClass('disabled'); + } + year -= 1; + for (i = -1; i < 11; i++) { + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + }, + + fillHours = function () { + pMoment.lang(picker.options.language); + var table = picker.widget.find('.timepicker .timepicker-hours table'), html = '', current, i, j; + table.parent().hide(); + if (picker.use24hours) { + current = 0; + for (i = 0; i < 6; i += 1) { + html += ''; + for (j = 0; j < 4; j += 1) { + html += '' + padLeft(current.toString()) + ''; + current++; + } + html += ''; + } + } + else { + current = 1; + for (i = 0; i < 3; i += 1) { + html += ''; + for (j = 0; j < 4; j += 1) { + html += '' + padLeft(current.toString()) + ''; + current++; + } + html += ''; + } + } + table.html(html); + }, + + fillMinutes = function () { + var table = picker.widget.find('.timepicker .timepicker-minutes table'), html = '', current = 0, i, j, step = picker.options.minuteStepping; + table.parent().hide(); + if (step == 1) step = 5; + for (i = 0; i < Math.ceil(60 / step / 4) ; i++) { + html += ''; + for (j = 0; j < 4; j += 1) { + if (current < 60) { + html += '' + padLeft(current.toString()) + ''; + current += step; + } else { + html += ''; + } + } + html += ''; + } + table.html(html); + }, + + fillSeconds = function () { + var table = picker.widget.find('.timepicker .timepicker-seconds table'), html = '', current = 0, i, j; + table.parent().hide(); + for (i = 0; i < 3; i++) { + html += ''; + for (j = 0; j < 4; j += 1) { + html += '' + padLeft(current.toString()) + ''; + current += 5; + } + html += ''; + } + table.html(html); + }, + + fillTime = function () { + if (!picker.date) return; + var timeComponents = picker.widget.find('.timepicker span[data-time-component]'), + hour = picker.date.hours(), + period = 'AM'; + if (!picker.use24hours) { + if (hour >= 12) period = 'PM'; + if (hour === 0) hour = 12; + else if (hour != 12) hour = hour % 12; + picker.widget.find('.timepicker [data-action=togglePeriod]').text(period); + } + timeComponents.filter('[data-time-component=hours]').text(padLeft(hour)); + timeComponents.filter('[data-time-component=minutes]').text(padLeft(picker.date.minutes())); + timeComponents.filter('[data-time-component=seconds]').text(padLeft(picker.date.second())); + }, + + click = function (e) { + e.stopPropagation(); + e.preventDefault(); + picker.unset = false; + var target = $(e.target).closest('span, td, th'), month, year, step, day, oldDate = pMoment(picker.date); + if (target.length === 1) { + if (!target.is('.disabled')) { + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + showMode(1); + break; + case 'prev': + case 'next': + step = dpGlobal.modes[picker.viewMode].navStep; + if (target[0].className === 'prev') step = step * -1; + picker.viewDate.add(step, dpGlobal.modes[picker.viewMode].navFnc); + fillDate(); + break; + } + break; + case 'span': + if (target.is('.month')) { + month = target.parent().find('span').index(target); + picker.viewDate.month(month); + } else { + year = parseInt(target.text(), 10) || 0; + picker.viewDate.year(year); + } + if (picker.viewMode === picker.minViewMode) { + picker.date = pMoment({ + y: picker.viewDate.year(), + M: picker.viewDate.month(), + d: picker.viewDate.date(), + h: picker.date.hours(), + m: picker.date.minutes(), + s: picker.date.seconds() + }); + notifyChange(oldDate, e.type); + set(); + } + showMode(-1); + fillDate(); + break; + case 'td': + if (target.is('.day')) { + day = parseInt(target.text(), 10) || 1; + month = picker.viewDate.month(); + year = picker.viewDate.year(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month == 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + picker.date = pMoment({ + y: year, + M: month, + d: day, + h: picker.date.hours(), + m: picker.date.minutes(), + s: picker.date.seconds() + } + ); + picker.viewDate = pMoment({ + y: year, M: month, d: Math.min(28, day) + }); + fillDate(); + set(); + notifyChange(oldDate, e.type); + } + break; + } + } + } + }, + + actions = { + incrementHours: function () { + checkDate("add", "hours", 1); + }, + + incrementMinutes: function () { + checkDate("add", "minutes", picker.options.minuteStepping); + }, + + incrementSeconds: function () { + checkDate("add", "seconds", 1); + }, + + decrementHours: function () { + checkDate("subtract", "hours", 1); + }, + + decrementMinutes: function () { + checkDate("subtract", "minutes", picker.options.minuteStepping); + }, + + decrementSeconds: function () { + checkDate("subtract", "seconds", 1); + }, + + togglePeriod: function () { + var hour = picker.date.hours(); + if (hour >= 12) hour -= 12; + else hour += 12; + picker.date.hours(hour); + }, + + showPicker: function () { + picker.widget.find('.timepicker > div:not(.timepicker-picker)').hide(); + picker.widget.find('.timepicker .timepicker-picker').show(); + }, + + showHours: function () { + picker.widget.find('.timepicker .timepicker-picker').hide(); + picker.widget.find('.timepicker .timepicker-hours').show(); + }, + + showMinutes: function () { + picker.widget.find('.timepicker .timepicker-picker').hide(); + picker.widget.find('.timepicker .timepicker-minutes').show(); + }, + + showSeconds: function () { + picker.widget.find('.timepicker .timepicker-picker').hide(); + picker.widget.find('.timepicker .timepicker-seconds').show(); + }, + + selectHour: function (e) { + var period = picker.widget.find('.timepicker [data-action=togglePeriod]').text(), hour = parseInt($(e.target).text(), 10); + if (period == "PM") hour += 12 + picker.date.hours(hour); + actions.showPicker.call(picker); + }, + + selectMinute: function (e) { + picker.date.minutes(parseInt($(e.target).text(), 10)); + actions.showPicker.call(picker); + }, + + selectSecond: function (e) { + picker.date.seconds(parseInt($(e.target).text(), 10)); + actions.showPicker.call(picker); + } + }, + + doAction = function (e) { + var oldDate = pMoment(picker.date), action = $(e.currentTarget).data('action'), rv = actions[action].apply(picker, arguments); + stopEvent(e); + if (!picker.date) picker.date = pMoment({ y: 1970 }); + set(); + fillTime(); + notifyChange(oldDate, e.type); + return rv; + }, + + stopEvent = function (e) { + e.stopPropagation(); + e.preventDefault(); + }, + + change = function (e) { + pMoment.lang(picker.options.language); + var input = $(e.target), oldDate = pMoment(picker.date), newDate = pMoment(input.val(), picker.format, picker.options.useStrict); + if (newDate.isValid() && !isInDisableDates(newDate) && isInEnableDates(newDate)) { + update(); + picker.setValue(newDate); + notifyChange(oldDate, e.type); + set(); + } + else { + picker.viewDate = oldDate; + notifyChange(oldDate, e.type); + notifyError(newDate); + picker.unset = true; + } + }, + + showMode = function (dir) { + if (dir) { + picker.viewMode = Math.max(picker.minViewMode, Math.min(2, picker.viewMode + dir)); + } + var f = dpGlobal.modes[picker.viewMode].clsName; + picker.widget.find('.datepicker > div').hide().filter('.datepicker-' + dpGlobal.modes[picker.viewMode].clsName).show(); + }, + + attachDatePickerEvents = function () { + var $this, $parent, expanded, closed, collapseData; + picker.widget.on('click', '.datepicker *', $.proxy(click, this)); // this handles date picker clicks + picker.widget.on('click', '[data-action]', $.proxy(doAction, this)); // this handles time picker clicks + picker.widget.on('mousedown', $.proxy(stopEvent, this)); + if (picker.options.pickDate && picker.options.pickTime) { + picker.widget.on('click.togglePicker', '.accordion-toggle', function (e) { + e.stopPropagation(); + $this = $(this); + $parent = $this.closest('ul'); + expanded = $parent.find('.in'); + closed = $parent.find('.collapse:not(.in)'); + + if (expanded && expanded.length) { + collapseData = expanded.data('collapse'); + if (collapseData && collapseData.date - transitioning) return; + expanded.collapse('hide'); + closed.collapse('show'); + $this.find('span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date); + picker.element.find('.input-group-addon span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date); + } + }); + } + if (picker.isInput) { + picker.element.on({ + 'focus': $.proxy(picker.show, this), + 'change': $.proxy(change, this), + 'blur': $.proxy(picker.hide, this) + }); + } else { + picker.element.on({ + 'change': $.proxy(change, this) + }, 'input'); + if (picker.component) { + picker.component.on('click', $.proxy(picker.show, this)); + } else { + picker.element.on('click', $.proxy(picker.show, this)); + } + } + }, + + attachDatePickerGlobalEvents = function () { + $(window).on( + 'resize.datetimepicker' + picker.id, $.proxy(place, this)); + if (!picker.isInput) { + $(document).on( + 'mousedown.datetimepicker' + picker.id, $.proxy(picker.hide, this)); + } + }, + + detachDatePickerEvents = function () { + picker.widget.off('click', '.datepicker *', picker.click); + picker.widget.off('click', '[data-action]'); + picker.widget.off('mousedown', picker.stopEvent); + if (picker.options.pickDate && picker.options.pickTime) { + picker.widget.off('click.togglePicker'); + } + if (picker.isInput) { + picker.element.off({ + 'focus': picker.show, + 'change': picker.change + }); + } else { + picker.element.off({ + 'change': picker.change + }, 'input'); + if (picker.component) { + picker.component.off('click', picker.show); + } else { + picker.element.off('click', picker.show); + } + } + }, + + detachDatePickerGlobalEvents = function () { + $(window).off('resize.datetimepicker' + picker.id); + if (!picker.isInput) { + $(document).off('mousedown.datetimepicker' + picker.id); + } + }, + + isInFixed = function () { + if (picker.element) { + var parents = picker.element.parents(), inFixed = false, i; + for (i = 0; i < parents.length; i++) { + if ($(parents[i]).css('position') == 'fixed') { + inFixed = true; + break; + } + } + ; + return inFixed; + } else { + return false; + } + }, + + set = function () { + pMoment.lang(picker.options.language); + var formatted = '', input; + if (!picker.unset) formatted = pMoment(picker.date).format(picker.format); + getPickerInput().val(formatted); + picker.element.data('date', formatted); + if (!picker.options.pickTime) picker.hide(); + }, + + checkDate = function (direction, unit, amount) { + pMoment.lang(picker.options.language); + var newDate; + if (direction == "add") { + newDate = pMoment(picker.date); + if (newDate.hours() == 23) newDate.add(amount, unit); + newDate.add(amount, unit); + } + else { + newDate = pMoment(picker.date).subtract(amount, unit); + } + if (isInDisableDates(pMoment(newDate.subtract(amount, unit))) || isInDisableDates(newDate)) { + notifyError(newDate.format(picker.format)); + return; + } + + if (direction == "add") { + picker.date.add(amount, unit); + } + else { + picker.date.subtract(amount, unit); + } + picker.unset = false; + }, + + isInDisableDates = function (date) { + pMoment.lang(picker.options.language); + if (date.isAfter(picker.options.maxDate) || date.isBefore(picker.options.minDate)) return true; + if (picker.options.disabledDates === false) { + return false; + } + return picker.options.disabledDates[pMoment(date).format("YYYY-MM-DD")] === true; + }, + isInEnableDates = function (date) { + pMoment.lang(picker.options.language); + if (picker.options.enabledDates === false) { + return true; + } + return picker.options.enabledDates[pMoment(date).format("YYYY-MM-DD")] === true; + }, + + indexGivenDates = function (givenDatesArray) { + // Store given enabledDates and disabledDates as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: picker.options.enabledDates['2014-02-27'] === true) + var givenDatesIndexed = {}; + var givenDatesCount = 0; + for (i = 0; i < givenDatesArray.length; i++) { + dDate = pMoment(givenDatesArray[i]); + if (dDate.isValid()) { + givenDatesIndexed[dDate.format("YYYY-MM-DD")] = true; + givenDatesCount++; + } + } + if (givenDatesCount > 0) { + return givenDatesIndexed; + } + return false; + }, + + padLeft = function (string) { + string = string.toString(); + if (string.length >= 2) return string; + else return '0' + string; + }, + + getTemplate = function () { + if (picker.options.pickDate && picker.options.pickTime) { + var ret = ''; + ret = ''; + return ret; + } else if (picker.options.pickTime) { + return ( + '' + ); + } else { + return ( + '' + ); + } + }, + + dpGlobal = { + modes: [ + { + clsName: 'days', + navFnc: 'month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'year', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'year', + navStep: 10 + }], + headTemplate: + '' + + '' + + '‹›' + + '' + + '', + contTemplate: + '' + }, + + tpGlobal = { + hourTemplate: '', + minuteTemplate: '', + secondTemplate: '' + }; + + dpGlobal.template = + '
    ' + + '' + dpGlobal.headTemplate + '
    ' + + '
    ' + + '
    ' + + '' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
    ' + + '
    ' + + '
    ' + + '' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
    ' + + '
    '; + + tpGlobal.getTemplate = function () { + return ( + '
    ' + + '' + + '' + + '' + + '' + + '' + + (picker.options.useSeconds ? + '' : '') + + (picker.use24hours ? '' : '') + + '' + + '' + + ' ' + + '' + + ' ' + + (picker.options.useSeconds ? + '' : '') + + (picker.use24hours ? '' : '' + + '') + + '' + + '' + + '' + + '' + + '' + + (picker.options.useSeconds ? + '' : '') + + (picker.use24hours ? '' : '') + + '' + + '
    ' + (picker.options.useMinutes ? '' : '') + '
    ' + tpGlobal.hourTemplate + ':' + (picker.options.useMinutes ? tpGlobal.minuteTemplate : '00') + ':' + tpGlobal.secondTemplate + '
    ' + (picker.options.useMinutes ? '' : '') + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + (picker.options.useSeconds ? + '
    ' : '') + ); + }; + + picker.destroy = function () { + detachDatePickerEvents(); + detachDatePickerGlobalEvents(); + picker.widget.remove(); + picker.element.removeData('DateTimePicker'); + if (picker.component) + picker.component.removeData('DateTimePicker'); + }; + + picker.show = function (e) { + if (picker.options.useCurrent) { + if (getPickerInput().val() == '') { + if (picker.options.minuteStepping !== 1) { + var mDate = pMoment(), + rInterval = picker.options.minuteStepping; + mDate.minutes((Math.round(mDate.minutes() / rInterval) * rInterval) % 60) + .seconds(0); + picker.setValue(mDate.format(picker.format)) + } else { + picker.setValue(pMoment().format(picker.format)) + } + }; + } + picker.widget.show(); + picker.height = picker.component ? picker.component.outerHeight() : picker.element.outerHeight(); + place(); + picker.element.trigger({ + type: 'dp.show', + date: pMoment(picker.date) + }); + attachDatePickerGlobalEvents(); + if (e) { + stopEvent(e); + } + }, + + picker.disable = function () { + var input = picker.element.find('input'); + if (input.prop('disabled')) return; + + input.prop('disabled', true); + detachDatePickerEvents(); + }, + + picker.enable = function () { + var input = picker.element.find('input'); + if (!input.prop('disabled')) return; + + input.prop('disabled', false); + attachDatePickerEvents(); + }, + + picker.hide = function (event) { + if (event && $(event.target).is(picker.element.attr("id"))) + return; + // Ignore event if in the middle of a picker transition + var collapse = picker.widget.find('.collapse'), i, collapseData; + for (i = 0; i < collapse.length; i++) { + collapseData = collapse.eq(i).data('collapse'); + if (collapseData && collapseData.date - transitioning) + return; + } + picker.widget.hide(); + picker.viewMode = picker.startViewMode; + showMode(); + picker.element.trigger({ + type: 'dp.hide', + date: pMoment(picker.date) + }); + detachDatePickerGlobalEvents(); + }, + + picker.setValue = function (newDate) { + pMoment.lang(picker.options.language); + if (!newDate) { + picker.unset = true; + set(); + } else { + picker.unset = false; + } + if (!pMoment.isMoment(newDate)) newDate = pMoment(newDate); + if (newDate.isValid()) { + picker.date = newDate; + set(); + picker.viewDate = pMoment({ y: picker.date.year(), M: picker.date.month() }); + fillDate(); + fillTime(); + } + else { + notifyError(newDate); + } + }, + + picker.getDate = function () { + if (picker.unset) return null; + return picker.date; + }, + + picker.setDate = function (date) { + var oldDate = pMoment(picker.date); + if (!date) { + picker.setValue(null); + } else { + picker.setValue(date); + } + notifyChange(oldDate, "function"); + }, + + picker.setDisabledDates = function (dates) { + picker.options.disabledDates = indexGivenDates(dates); + if (picker.viewDate) update(); + }, + picker.setEnabledDates = function (dates) { + picker.options.enabledDates = indexGivenDates(dates); + if (picker.viewDate) update(); + }, + + picker.setMaxDate = function (date) { + if (date == undefined) return; + picker.options.maxDate = pMoment(date); + if (picker.viewDate) update(); + }, + + picker.setMinDate = function (date) { + if (date == undefined) return; + picker.options.minDate = pMoment(date); + if (picker.viewDate) update(); + }; + + init(); + }; + + $.fn.datetimepicker = function (options) { + return this.each(function () { + var $this = $(this), data = $this.data('DateTimePicker'); + if (!data) $this.data('DateTimePicker', new DateTimePicker(this, options)); + }); + }; +})); \ No newline at end of file diff --git a/pilotage/public/js/bootstrap-listTree.js b/pilotage/public/js/bootstrap-listTree.js new file mode 100644 index 00000000..72f04039 --- /dev/null +++ b/pilotage/public/js/bootstrap-listTree.js @@ -0,0 +1,311 @@ +/* + * Copyright 2012 Clay Walker + * Licensed under GPLv2 ONLY + */ +;(function($) { + var template = '\ +
      \ + <% _.each(context, function(parent, index) { %>\ +
    • \ + \ + <% if ( !_.isUndefined(ps = _.find(options.selected, function(elem) { return elem.key === this.key; }, parent)) ) { %>\ + checked="checked"\ + <% } %> value="<%= parent.key %>" /> <%= parent.key %>\ + <% if (options.startCollapsed) { %>\ +
        \ + <% } else { %>\ +
          \ + <% } %>\ + <% _.each(parent.values, function(child, index) { %>\ +
        • \ + \ + checked="checked"\ + <% } %> value="<%= child.key %>" /> <%= child.key %>\ +
        • \ + <% }, ps); %>\ +
        \ + \ + <% }); %>\ +
      '; + + /** Check all child checkboxes. + * @param jQElement The parent
    • . + */ + function _selectAllChildren(jQElement) { + jQElement.find('ul > li > span > input[type="checkbox"]') + .each(function() { + $(this).prop('checked', true); + }); + } + + /** Uncheck all child checkboxes. + * @param jQElement The parent
    • . + */ + function _deselectAllChildren(jQElement) { + jQElement.find('ul > li > span > input[type="checkbox"]') + .each(function() { + $(this).prop('checked', false); + }); + } + + /** Toggle all checkboxes. + * @param[in] jQElement The root
        of the list. + */ + function _toggleAllChildren(jQElement) { + if (jQElement.children('span').children('input[type="checkbox"]').prop('checked')) { + _selectAllChildren(jQElement); + } else { + _deselectAllChildren(jQElement); + } + } + + /** Toggle the collapse icon based on the current state. + * @param[in] jQElement The
      • of the header to toggle. + */ + function _toggleIcon(jQElement) { + // Change the icon. + if (jQElement.children('ul').is(':visible')) { + // The user wants to collapse the child list. + jQElement.children('span').children('i') + .removeClass('icon-chevron-down') + .addClass('icon-chevron-up'); + } else { + // The user wants to expand the child list. + jQElement.children('span').children('i') + .removeClass('icon-chevron-up') + .addClass('icon-chevron-down'); + } + } + + /** Make sure there isn't any bogus default selections. + * @param[in] selected The default selection object. + * @return The filtered selection object. + */ + function _validateDefaultSelectionValues(selected) { + return _.filter(selected, function(elem) { + return ( !_.isEmpty(elem.values) && !_.isUndefined(elem.values) ); + }); + } + + /** If a parent has at least one child node selected, check the parent. + * Conversely, if a parent has no child nodes selected, uncheck the parent. + * @param[in] jQElement The parent
      • . + */ + function _handleChildParentRelationship(jQElement) { + // If the selected node is a child: + if ( _.isEmpty(_.toArray(jQElement.children('ul'))) ) { + var childrenStatuses = _.uniq( + _.map(jQElement.parent().find('input[type="checkbox"]'), function(elem) { + return $(elem).prop('checked'); + }) + ); + + // Check to see if any children are checked. + if (_.indexOf(childrenStatuses, true) !== -1) { + // Check the parent node. + jQElement.parent().parent().children('span').children('input[type="checkbox"]').prop('checked', true); + } else { + // Uncheck the parent node. + jQElement.parent().parent().children('span').children('input[type="checkbox"]').prop('checked', false); + } + } + } + + /** Updates the internal object of selected nodes. + */ + function _updateSelectedObject() { + var data = $('.listTree').data('listTree'); + + // Filter the context to the selected parents. + var selected = _.filter($.extend(true, {}, data.context), function(parent) { + return $('.listTree > ul > li > span > input[value="' + parent.key + '"]').prop('checked') + }); + + // For each parent in the working context... + _.each(selected, function(parent) { + + // Filter the children to the selected children. + parent.values = _.filter(parent.values, function(child) { + return $('.listTree > ul > li > ul > li > span > input[value="' + child.key + '"]').prop('checked'); + }); + }); + + // Update the plugin's selected object. + $('.listTree').data('listTree', { + "target": data.target, + "context": data.context, + "options": data.options, + "selected": selected + }); + } + + var methods = { + init: function(context, options) { + // Default options + var defaults = { + "startCollapsed": false, + "selected": context + }; + options = $.extend(defaults, options); + + // Validate the user entered default selections. + options.selected = _validateDefaultSelectionValues(options.selected); + + return this.each(function() { + var $this = $(this), + data = $this.data('listTree'); + + // If the plugin hasn't been initialized yet... + if (!data) { + + $(this).data('listTree', { + "target": $this, + "context": context, + "options": options, + "selected": options.selected + }); + + // Register checkbox handlers. + $(document).on('change', '.listTree input[type="checkbox"]', function(e) { + var node = $(e.target).parent().parent(); + + // Toggle all children. + _toggleAllChildren(node); + + // Handle parent checkbox if all children are (un)checked. + _handleChildParentRelationship(node); + + // Filter context to selection and store in data.selected. + _updateSelectedObject(node); + }) + + // Register collapse handlers on parents. + .on('click', '.listTree > ul > li > span', function(e) { + var node = $(e.target).parent(); + + // Change the icon. + _toggleIcon(node); + + // Toggle the child list. + node.children('ul').slideToggle('fast'); + + e.stopImmediatePropagation(); + }); + + // Generate the list tree. + $this.html( _.template( template, { "context": context, "options": options } ) ); + } + }); + }, + destroy: function() { + return this.each(function() { + + var $this = $(this), + data = $this.data('listTree'); + + $(window).unbind('.listTree'); + $this.removeData('listTree'); + }); + }, + selectAll: function() { + // For each listTree... + return this.each(function() { + // Select each parent checkbox. + _selectAllChildren($(this)); + + // For each listTree parent... + $(this).children('ul > li:first-child').each(function() { + // Select each child checkbox. + _selectAllChildren($(this)); + }); + + _updateSelectedObject($(this)); + }); + }, + deselectAll: function() { + // For each listTree... + return this.each(function() { + // Deselect each parent checkbox. + _deselectAllChildren($(this)); + + // For each listTree parent... + $(this).children('ul > li:first-child').each(function() { + // Deselect each child checkbox. + _deselectAllChildren($(this)); + }); + + _updateSelectedObject($(this)); + }); + }, + expandAll: function() { + // For each listTree... + return this.each(function() { + var node = $(this).children('ul').children('li'); + + // Change the icon. + _toggleIcon(node); + + // Show the child list. + node.children('ul').slideDown('fast'); + }); + }, + collapseAll: function() { + // For each listTree... + return this.each(function() { + var node = $(this).children('ul').children('li'); + + // Change the icon. + _toggleIcon(node); + + // Hide the child list. + node.children('ul').slideUp('fast'); + }); + }, + update: function(context, options) { + // Default options + var defaults = { + "startCollapsed": false, + "selected": context + }; + options = $.extend(defaults, options); + + // Validate the user entered default selections. + options.selected = _validateDefaultSelectionValues(options.selected); + + return this.each(function() { + var $this = $(this), + data = $this.data('listTree'); + + // Ensure the plugin has been initialized... + if (data) { + // Update the context. + $(this).data('listTree', { + "target": $this, + "context": context, + "options": options, + "selected": options.selected + }); + + // Generate the list tree. + $this.html( _.template( template, { "context": context, "options": options } ) ); + } + }); + } + }; + + $.fn.listTree = function(method) { + + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.listTree'); + } + + }; +})(jQuery); + + diff --git a/pilotage/public/js/bootstrap.js b/pilotage/public/js/bootstrap.js new file mode 100644 index 00000000..850e6e53 --- /dev/null +++ b/pilotage/public/js/bootstrap.js @@ -0,0 +1,2006 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") } + +/* ======================================================================== + * Bootstrap: transition.js v3.0.3 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false, $el = this + $(this).one($.support.transition.end, function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.0.3 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.hasClass('alert') ? $this : $this.parent() + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent.trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(150) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.0.3 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + } + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (!data.resetText) $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d); + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons"]') + var changed = true + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') === 'radio') { + // see if clicking on current one + if ($input.prop('checked') && this.$element.hasClass('active')) + changed = false + else + $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + e.preventDefault() + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.0.3 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.DEFAULTS = { + interval: 5000 + , pause: 'hover' + , wrap: true + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getActiveIndex = function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + + return this.$items.index(this.$active) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getActiveIndex() + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + this.sliding = true + + isCycling && this.pause() + + var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid.bs.carousel', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) + }) + .emulateTransitionEnd(600) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid.bs.carousel') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.0.3 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null + + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var actives = this.$parent && this.$parent.find('> .panel > .in') + + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) + + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } + + $target.collapse(option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.0.3 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('