From f948131303a24cb5eb0e7cf5f11b81bfe6766e64 Mon Sep 17 00:00:00 2001 From: Phuong H Date: Sun, 28 Sep 2014 11:02:14 +0700 Subject: [PATCH 01/48] Refactor json.ftr.js --- .../assets/modules/collection/chart.ctrl.js | 4 ++-- .../webapp/assets/modules/common/json.ftr.js | 24 +++++++++---------- .../assets/modules/footer/footer.ctrl.js | 2 +- .../assets/modules/header/header.ctrl.js | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/webapp/assets/modules/collection/chart.ctrl.js b/src/main/webapp/assets/modules/collection/chart.ctrl.js index 0605e7ede..4eed030c1 100644 --- a/src/main/webapp/assets/modules/collection/chart.ctrl.js +++ b/src/main/webapp/assets/modules/collection/chart.ctrl.js @@ -174,7 +174,7 @@ angular.module('Chart').controller('chartController', function ($scope, jsonFact } - $scope.bubblePosition = _isNotMobile ? jsonFactory.dBubblePosition() : jsonFactory.mBubblePosition(); + $scope.bubblePosition = _isNotMobile ? jsonFactory.dBubblePosition : jsonFactory.mBubblePosition; var n = $scope.bubblePosition.length, nameTech = new Array(), java_locations = new Array(), @@ -1377,7 +1377,7 @@ angular.module('Chart').controller('chartController', function ($scope, jsonFact resize = -10; } - $scope.bubblePosition = _isNotMobile ? jsonFactory.dPositionDefault() : jsonFactory.mPositionDefault() + $scope.bubblePosition = _isNotMobile ? jsonFactory.dPositionDefault : jsonFactory.mPositionDefault for (var i = 0; i < 9; i++) { var t = $scope.bubblePosition[0].data[i].top, l = $scope.bubblePosition[0].data[i].left; diff --git a/src/main/webapp/assets/modules/common/json.ftr.js b/src/main/webapp/assets/modules/common/json.ftr.js index f6dad89fc..a4aefa1ca 100644 --- a/src/main/webapp/assets/modules/common/json.ftr.js +++ b/src/main/webapp/assets/modules/common/json.ftr.js @@ -1,7 +1,7 @@ angular.module("Common").factory("jsonFactory", function() { return { - mPositionDefault : function() { + mPositionDefault : (function() { return [ { "data" : [ { "top" : "290px", @@ -32,8 +32,8 @@ angular.module("Common").factory("jsonFactory", function() { "left" : "70px" } ] } ] - }, - dPositionDefault : function() { + })(), + dPositionDefault : (function() { return [ { "data" : [ { "top" : "5px", @@ -64,8 +64,8 @@ angular.module("Common").factory("jsonFactory", function() { "left" : "190px" } ] } ] - }, - mBubblePosition : function() { + })(), + mBubblePosition : (function() { return [ { "name" : "java", "data" : [ { @@ -337,8 +337,8 @@ angular.module("Common").factory("jsonFactory", function() { "left" : "130px" } ] } ] - }, - dBubblePosition : function() { + })(), + dBubblePosition : (function() { return [ { "name" : "java", "data" : [ { @@ -610,8 +610,8 @@ angular.module("Common").factory("jsonFactory", function() { "left" : "-80px" } ] } ] - }, - shortcuts : function() { + })(), + shortcuts : (function() { return [ { "id" : 1, "name" : "Career Analytics", @@ -629,9 +629,9 @@ angular.module("Common").factory("jsonFactory", function() { "name" : "Function Name 2", "keyShort" : "Ctrl + Alt + 2" } ]; - }, + })(), - companies : function() { + companies : (function() { return [ { "id" : 1, "img" : "images/cp-logo-atlassian.png", @@ -657,6 +657,6 @@ angular.module("Common").factory("jsonFactory", function() { "img" : "images/cp-logo-vtv.png", "url" : "https://www.vtv.vn/" } ]; - } + })() } }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/footer/footer.ctrl.js b/src/main/webapp/assets/modules/footer/footer.ctrl.js index 6730cf5ac..b4175e011 100644 --- a/src/main/webapp/assets/modules/footer/footer.ctrl.js +++ b/src/main/webapp/assets/modules/footer/footer.ctrl.js @@ -1,5 +1,5 @@ angular.module("Footer").controller("footerController", function($scope, $http, jsonFactory) { - $scope.companies = jsonFactory.companies(); + $scope.companies = jsonFactory.companies; var cp = $('.companies-bar'), list = $('.companies-list'); cp.click(function() { diff --git a/src/main/webapp/assets/modules/header/header.ctrl.js b/src/main/webapp/assets/modules/header/header.ctrl.js index f6cbff495..147c7adc3 100644 --- a/src/main/webapp/assets/modules/header/header.ctrl.js +++ b/src/main/webapp/assets/modules/header/header.ctrl.js @@ -1,6 +1,6 @@ angular.module("Header").controller("headerController", function($scope, $http, jsonFactory) { - $scope.keyList = jsonFactory.shortcuts(); + $scope.keyList = jsonFactory.shortcuts; // TODO: refactor later From 8f46513207c903b59e076cdc0d97b6a92e967628 Mon Sep 17 00:00:00 2001 From: Phuong H Date: Sun, 28 Sep 2014 16:15:25 +0700 Subject: [PATCH 02/48] Use grunt to inject js files into index.html --- .gitignore | 1 + src/main/webapp/assets/Gruntfile.js | 11 ++++++-- src/main/webapp/assets/bower.json | 28 ++++++++++--------- src/main/webapp/assets/index.html | 20 ++++++------- src/main/webapp/assets/index.tpl.html | 12 ++------ .../webapp/assets/modules/home/home.mod.js | 2 +- .../webapp/assets/modules/home/home.tpl.html | 2 +- src/main/webapp/assets/package.json | 8 ++---- 8 files changed, 41 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index b969a0573..01fa23e10 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ target/ .classpath target/ static/ +.log \ No newline at end of file diff --git a/src/main/webapp/assets/Gruntfile.js b/src/main/webapp/assets/Gruntfile.js index 50cd48db2..79df076f2 100644 --- a/src/main/webapp/assets/Gruntfile.js +++ b/src/main/webapp/assets/Gruntfile.js @@ -3,6 +3,12 @@ module.exports = function(grunt) { grunt.initConfig({ pkg : grunt.file.readJSON("package.json"), + wiredep : { + target : { + src : [ "index.html" ] + } + }, + includeSource : { options : { basePath : ".", @@ -11,7 +17,7 @@ module.exports = function(grunt) { }, target : { files : { - 'index.html' : 'index.tpl.html' + "index.html" : "index.tpl.html" } } }, @@ -54,7 +60,8 @@ module.exports = function(grunt) { grunt.loadNpmTasks("grunt-contrib-watch"); grunt.loadNpmTasks("grunt-contrib-connect"); grunt.loadNpmTasks("grunt-include-source"); + grunt.loadNpmTasks("grunt-wiredep") - grunt.registerTask("build", [ "includeSource:target" ]); + grunt.registerTask("build", [ "includeSource:target", "wiredep:target" ]); grunt.registerTask("run", [ "connect", "watch" ]); }; \ No newline at end of file diff --git a/src/main/webapp/assets/bower.json b/src/main/webapp/assets/bower.json index d306236ab..c3e044fff 100644 --- a/src/main/webapp/assets/bower.json +++ b/src/main/webapp/assets/bower.json @@ -1,15 +1,17 @@ { - "name": "techlooper", - "dependencies": { - "bootstrap" : "latest", - "components-font-awesome": "latest", - "angular": "latest", - "angular-resource": "latest", - "angular-route" : "latest", - "jquery": "latest", - "sockjs": "latest", - "stomp-websocket": "latest", - "showdown": "latest", - "angular-ui-router": "latest" - } + "name": "techlooper", + "dependencies": { + "jquery": "latest", + "bootstrap" : "latest", + "components-font-awesome": "latest", + "angular": "latest", + "angular-resource": "latest", + "angular-route" : "latest", + "sockjs": "latest", + "stomp-websocket": "latest", + "angular-ui-router": "latest" + }, + "overrides": { + "stomp-websocket": { "main": "lib/stomp.js" } + } } \ No newline at end of file diff --git a/src/main/webapp/assets/index.html b/src/main/webapp/assets/index.html index df07a7011..61abd2f79 100644 --- a/src/main/webapp/assets/index.html +++ b/src/main/webapp/assets/index.html @@ -44,16 +44,16 @@
- - - - - - - - - - + + + + + + + + + + diff --git a/src/main/webapp/assets/index.tpl.html b/src/main/webapp/assets/index.tpl.html index 678923a77..6b22c81bf 100644 --- a/src/main/webapp/assets/index.tpl.html +++ b/src/main/webapp/assets/index.tpl.html @@ -39,16 +39,8 @@
- - - - - - - - - - + + \ No newline at end of file diff --git a/src/main/webapp/assets/modules/home/home.mod.js b/src/main/webapp/assets/modules/home/home.mod.js index 8a6676875..a150f5a01 100644 --- a/src/main/webapp/assets/modules/home/home.mod.js +++ b/src/main/webapp/assets/modules/home/home.mod.js @@ -5,7 +5,7 @@ angular.module("Home").directive("chart", function() { templateUrl : "modules/collection/chart.tpl.html", controller : "chartController" } -}).directive("findJobs", function() { +}).directive("findjobs", function() { return { restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, diff --git a/src/main/webapp/assets/modules/home/home.tpl.html b/src/main/webapp/assets/modules/home/home.tpl.html index 83cf6ff85..c278778df 100644 --- a/src/main/webapp/assets/modules/home/home.tpl.html +++ b/src/main/webapp/assets/modules/home/home.tpl.html @@ -3,7 +3,7 @@
-
+
diff --git a/src/main/webapp/assets/package.json b/src/main/webapp/assets/package.json index ac329b211..ba35911ca 100644 --- a/src/main/webapp/assets/package.json +++ b/src/main/webapp/assets/package.json @@ -4,11 +4,7 @@ "grunt": "latest", "grunt-contrib-connect": "latest", "grunt-contrib-watch": "latest", - "grunt-include-source": "latest" - }, - "folders": { - "build": "target/", - "wwwRoot": "src/main/", - "jsSource": "src/main/webapp/modules/" + "grunt-include-source": "latest", + "grunt-wiredep": "latest" } } \ No newline at end of file From 5e87f680181efd3d3e65ee3d33271d6e7f5ced2b Mon Sep 17 00:00:00 2001 From: Phuong H Date: Sun, 28 Sep 2014 16:27:30 +0700 Subject: [PATCH 03/48] Clear unnecessary comment int index.tpl.html --- src/main/webapp/assets/Gruntfile.js | 4 ---- src/main/webapp/assets/index.html | 9 +-------- src/main/webapp/assets/index.tpl.html | 9 +-------- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/main/webapp/assets/Gruntfile.js b/src/main/webapp/assets/Gruntfile.js index 79df076f2..75853274c 100644 --- a/src/main/webapp/assets/Gruntfile.js +++ b/src/main/webapp/assets/Gruntfile.js @@ -23,10 +23,6 @@ module.exports = function(grunt) { }, watch : { - includeSource : { - files : [ "default.tpl.html" ], - tasks : [ "includeSource:target" ] - }, scripts : { files : [ "*.js" ], options : { diff --git a/src/main/webapp/assets/index.html b/src/main/webapp/assets/index.html index 61abd2f79..6a19f47fa 100644 --- a/src/main/webapp/assets/index.html +++ b/src/main/webapp/assets/index.html @@ -18,14 +18,7 @@ - - - - - - - - + diff --git a/src/main/webapp/assets/index.tpl.html b/src/main/webapp/assets/index.tpl.html index 6b22c81bf..7d5b7a327 100644 --- a/src/main/webapp/assets/index.tpl.html +++ b/src/main/webapp/assets/index.tpl.html @@ -18,14 +18,7 @@ - - - - - - - - + From 45dd08d3b684c0e265c96af2f4c5720710a41e4b Mon Sep 17 00:00:00 2001 From: Phuong H Date: Mon, 29 Sep 2014 22:25:20 +0700 Subject: [PATCH 04/48] * Config Angular to support transaltion multiple language * Fix error 404 "...company.img...not found" --- src/main/webapp/assets/Gruntfile.js | 2 +- src/main/webapp/assets/bower.json | 8 ++- src/main/webapp/assets/index.html | 59 ------------------- src/main/webapp/assets/index.tpl.html | 1 + src/main/webapp/assets/modules/app.js | 32 ++++++---- .../assets/modules/footer/footer.tpl.html | 2 +- .../modules/translation/messages_en-US.json | 3 + .../modules/translation/messages_vi.json | 3 + 8 files changed, 36 insertions(+), 74 deletions(-) delete mode 100644 src/main/webapp/assets/index.html create mode 100644 src/main/webapp/assets/modules/translation/messages_en-US.json create mode 100644 src/main/webapp/assets/modules/translation/messages_vi.json diff --git a/src/main/webapp/assets/Gruntfile.js b/src/main/webapp/assets/Gruntfile.js index 75853274c..fdcc46e0a 100644 --- a/src/main/webapp/assets/Gruntfile.js +++ b/src/main/webapp/assets/Gruntfile.js @@ -24,7 +24,7 @@ module.exports = function(grunt) { watch : { scripts : { - files : [ "*.js" ], + files : [ "*.js", "*.json" ], options : { livereload : true } diff --git a/src/main/webapp/assets/bower.json b/src/main/webapp/assets/bower.json index c3e044fff..549d808e3 100644 --- a/src/main/webapp/assets/bower.json +++ b/src/main/webapp/assets/bower.json @@ -9,9 +9,13 @@ "angular-route" : "latest", "sockjs": "latest", "stomp-websocket": "latest", - "angular-ui-router": "latest" + "angular-cookies": "latest", + "angular-translate": "latest", + "angular-translate-storage-local": "latest", + "angular-translate-storage-cookie": "latest", + "angular-translate-loader-static-files" : "latest" }, "overrides": { - "stomp-websocket": { "main": "lib/stomp.js" } + "stomp-websocket": { "main": "lib/stomp.min.js" } } } \ No newline at end of file diff --git a/src/main/webapp/assets/index.html b/src/main/webapp/assets/index.html deleted file mode 100644 index 6a19f47fa..000000000 --- a/src/main/webapp/assets/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - Techlooper | Career Analytics. Open Source. Awesome! - - - - - - - - - - - - - - - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/assets/index.tpl.html b/src/main/webapp/assets/index.tpl.html index 7d5b7a327..8fa703048 100644 --- a/src/main/webapp/assets/index.tpl.html +++ b/src/main/webapp/assets/index.tpl.html @@ -28,6 +28,7 @@

You are using an outdated browser. Please upgrade your browser to improve your experience.

+
diff --git a/src/main/webapp/assets/modules/app.js b/src/main/webapp/assets/modules/app.js index 8ba0abc8a..a483b289c 100644 --- a/src/main/webapp/assets/modules/app.js +++ b/src/main/webapp/assets/modules/app.js @@ -5,30 +5,40 @@ angular.module("Header", []); angular.module("Footer", []); angular.module("Chart", []); -var techlooper = angular.module("Techlooper", - [ "ngResource", "ngRoute", "Home", "Header", "Footer", "Common", "Chart" ]); +var techlooper = angular.module("Techlooper", [ "pascalprecht.translate", "ngResource", "ngCookies", "ngRoute", "Home", "Header", "Footer", "Common", "Chart" ]); -techlooper.config(function($routeProvider) { - // $urlRouterProvider.otherwise('/'); - $routeProvider.when('/', { +techlooper.config(function($routeProvider, $translateProvider, $locationProvider) { + $translateProvider.useStaticFilesLoader({ + prefix : "modules/translation/messages_", + suffix : ".json" + }); + + $translateProvider.registerAvailableLanguageKeys(['en-US', 'vi']); + $translateProvider.fallbackLanguage("en-US"); + $translateProvider.preferredLanguage("en-US"); + $translateProvider.useLocalStorage(); + $translateProvider.useCookieStorage(); + $translateProvider.use(window.navigator.userLanguage || window.navigator.language); + + $routeProvider.when("/", { templateUrl : "modules/home/home.tpl.html", controller : "homeController" }).otherwise({ - redirectTo : '/' + redirectTo : "/" }); - // $locationProvider.html5Mode(true); + $locationProvider.html5Mode(true); }); -techlooper.directive('header', function() { +techlooper.directive("header", function() { return { - restrict : 'A', // This mens that it will be used as an attribute and NOT as an element. + restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, templateUrl : "modules/header/header.tpl.html", controller : "headerController" } -}).directive('footer', function() { +}).directive("footer", function() { return { - restrict : 'A', // This mens that it will be used as an attribute and NOT as an element. + restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, templateUrl : "modules/footer/footer.tpl.html", controller : "footerController" diff --git a/src/main/webapp/assets/modules/footer/footer.tpl.html b/src/main/webapp/assets/modules/footer/footer.tpl.html index 36c87fae9..8cd18c32a 100644 --- a/src/main/webapp/assets/modules/footer/footer.tpl.html +++ b/src/main/webapp/assets/modules/footer/footer.tpl.html @@ -6,7 +6,7 @@

Companies

diff --git a/src/main/webapp/assets/modules/translation/messages_en-US.json b/src/main/webapp/assets/modules/translation/messages_en-US.json new file mode 100644 index 000000000..eeae48281 --- /dev/null +++ b/src/main/webapp/assets/modules/translation/messages_en-US.json @@ -0,0 +1,3 @@ +{ + "techlooper.slogan" : "Career Analytics. Open Source. Awesome!" +} \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/messages_vi.json b/src/main/webapp/assets/modules/translation/messages_vi.json new file mode 100644 index 000000000..c4e697154 --- /dev/null +++ b/src/main/webapp/assets/modules/translation/messages_vi.json @@ -0,0 +1,3 @@ +{ + "techlooper.slogan" : "Techlooper | Career Analytics. Mã nguồn mở. Awesome!" +} \ No newline at end of file From 48df8a6e9b4a6b82d1c65c2471aef16338c0d066 Mon Sep 17 00:00:00 2001 From: Phuong H Date: Tue, 30 Sep 2014 13:29:31 +0700 Subject: [PATCH 05/48] * Translation configuration * Add "index.html" to the .gitignore file --- .gitignore | 3 ++- src/main/webapp/assets/modules/app.js | 2 +- .../webapp/assets/modules/translation/messages_en-US.json | 4 +++- .../webapp/assets/modules/translation/messages_vi.json | 8 ++++++-- .../webapp/assets/modules/translation/translation.ctrl.js | 5 +++++ .../assets/modules/translation/translation.tpl.html | 2 ++ 6 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 src/main/webapp/assets/modules/translation/translation.ctrl.js create mode 100644 src/main/webapp/assets/modules/translation/translation.tpl.html diff --git a/.gitignore b/.gitignore index 01fa23e10..fcf1e1215 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ target/ .classpath target/ static/ -.log \ No newline at end of file +.log +index.html \ No newline at end of file diff --git a/src/main/webapp/assets/modules/app.js b/src/main/webapp/assets/modules/app.js index a483b289c..e0ff6e9e7 100644 --- a/src/main/webapp/assets/modules/app.js +++ b/src/main/webapp/assets/modules/app.js @@ -17,7 +17,7 @@ techlooper.config(function($routeProvider, $translateProvider, $locationProvider $translateProvider.fallbackLanguage("en-US"); $translateProvider.preferredLanguage("en-US"); $translateProvider.useLocalStorage(); - $translateProvider.useCookieStorage(); +// $translateProvider.useCookieStorage(); $translateProvider.use(window.navigator.userLanguage || window.navigator.language); $routeProvider.when("/", { diff --git a/src/main/webapp/assets/modules/translation/messages_en-US.json b/src/main/webapp/assets/modules/translation/messages_en-US.json index eeae48281..29319e22b 100644 --- a/src/main/webapp/assets/modules/translation/messages_en-US.json +++ b/src/main/webapp/assets/modules/translation/messages_en-US.json @@ -1,3 +1,5 @@ { - "techlooper.slogan" : "Career Analytics. Open Source. Awesome!" + "techlooper" : { + "slogan" : "Career Analytics. Open Source. Awesome!" + } } \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/messages_vi.json b/src/main/webapp/assets/modules/translation/messages_vi.json index c4e697154..3d0c22184 100644 --- a/src/main/webapp/assets/modules/translation/messages_vi.json +++ b/src/main/webapp/assets/modules/translation/messages_vi.json @@ -1,3 +1,7 @@ { - "techlooper.slogan" : "Techlooper | Career Analytics. Mã nguồn mở. Awesome!" -} \ No newline at end of file + "techlooper" : { + "slogan" : "Techlooper | Career Analytics. Mã nguồn mở. Awesome!" + } +} + + diff --git a/src/main/webapp/assets/modules/translation/translation.ctrl.js b/src/main/webapp/assets/modules/translation/translation.ctrl.js new file mode 100644 index 000000000..2068322de --- /dev/null +++ b/src/main/webapp/assets/modules/translation/translation.ctrl.js @@ -0,0 +1,5 @@ +angular.module('Common').controller('translationController', function($scope, $translate) { + $scope.setLang = function(langKey) { + $translate.use(langKey); + }; +}); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/translation.tpl.html b/src/main/webapp/assets/modules/translation/translation.tpl.html new file mode 100644 index 000000000..f342daa7a --- /dev/null +++ b/src/main/webapp/assets/modules/translation/translation.tpl.html @@ -0,0 +1,2 @@ + + \ No newline at end of file From 0fbed5e7a3662481b4221872950549679b1b64ee Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Tue, 30 Sep 2014 16:17:42 +0700 Subject: [PATCH 06/48] remove footer, keyboard shortcuts and add language icon on the setting bar --- src/main/webapp/assets/css/main.css | 65 ++++++++---------- src/main/webapp/assets/css/main.sass | 45 ++++++++++++ .../webapp/assets/images/ic-find-jobs.png | Bin 0 -> 1004 bytes src/main/webapp/assets/modules/app.js | 63 ++++++++--------- .../webapp/assets/modules/common/json.ftr.js | 13 ++++ .../assets/modules/footer/footer.tpl.html | 20 +----- .../assets/modules/header/header.ctrl.js | 30 ++++---- .../assets/modules/header/header.mod.js | 8 +++ .../assets/modules/header/header.tpl.html | 10 +-- .../webapp/assets/modules/home/home.ctrl.js | 2 +- .../webapp/assets/modules/home/home.mod.js | 7 +- .../modules/job/findJobs.button.tpl.html | 13 ++-- .../assets/modules/job/findJobs.ctrl.js | 3 + .../modules/translation/messages_en-US.json | 5 +- .../modules/translation/messages_vi.json | 5 +- .../modules/translation/translation.ctrl.js | 7 +- .../modules/translation/translation.tpl.html | 3 +- 17 files changed, 164 insertions(+), 135 deletions(-) create mode 100644 src/main/webapp/assets/css/main.sass create mode 100644 src/main/webapp/assets/images/ic-find-jobs.png create mode 100644 src/main/webapp/assets/modules/header/header.mod.js create mode 100644 src/main/webapp/assets/modules/job/findJobs.ctrl.js diff --git a/src/main/webapp/assets/css/main.css b/src/main/webapp/assets/css/main.css index f98286542..0c45b617e 100755 --- a/src/main/webapp/assets/css/main.css +++ b/src/main/webapp/assets/css/main.css @@ -11,14 +11,14 @@ body { ul{ list-style: none; } +a:hover{ + text-decoration: none; +} .container{ width: 100%; padding: 0; } /* -- style for header -- */ -.setting-label{ - -} .fa-bubble-chart{ background: url(../images/ic-small.png) left 3px no-repeat; height: 20px; @@ -28,7 +28,6 @@ ul{ background:url(../images/line-header.png) #2e272a center bottom no-repeat; border: 0; } -.tagline{} .setting-content{ background-color: #323232; border: 1px solid #3d373a; @@ -56,6 +55,11 @@ ul.setting-items{ float: left; padding-left: 10px; } +.langKey{ + width: 25px; + height: 25px; + cursor: pointer; +} .keyboard-shortcuts-items{ background: #000000; padding: 10px; @@ -83,6 +87,9 @@ ul.setting-items{ .keyboard-shortcuts-items li span{ float: left; } + +.logo-block{} +.logo-block h1{margin: 0; padding: 0;} /* --- Style for bubble chart --- */ .bubble-chart-block{ display: block; @@ -98,45 +105,34 @@ ul.setting-items{ margin: auto; } -.analystic-find-jobs-block{ +.find-jobs-block{ float: left; clear: both; width: 100%; text-align: center; } -.button-management{ +.find-jobs-container{ width: 600px; - background-color: #282225; - border: 1px solid #3a3537; - border-radius: 5px; margin: auto; + position: relative; text-align: center; - display: inline-block; -} -.career-analystics{ - width: 50%; - float: left; - border-right: 1px solid #3a3537; } -.find-jobs{ - width: 50%; - float: left; - height: 40px; +.find-jobs-button { + margin: auto; + text-align: center; } -.button-management a{ +.find-jobs-button a{ + background: url(../images/ic-find-jobs.png) center 20px no-repeat; + width:150px; display: block; - width: 100%; - vertical-align: middle; - height: 40px; - font-size: 16px; - text-transform: capitalize; - line-height: 40px; - color: #999999; -} -.button-management a:hover{ - background-color: #3a3537; - text-decoration: none; - color: #ebebeb; + height:48px; + color: #727272; + margin: auto; +} +.find-jobs-button a:hover{ + background-position: center 22px; + color: #afafaf; + padding-top: 2px; } /* --- Style for footer --- */ footer{ @@ -203,8 +199,6 @@ footer{ zoom:1; -webkit-filter: grayscale(0%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ } - - .discussion-board-block{ position: absolute; right: 10px; top: -13px; @@ -212,4 +206,5 @@ footer{ } .discussion-board-block i{ font-size: 30px; -} \ No newline at end of file +} + diff --git a/src/main/webapp/assets/css/main.sass b/src/main/webapp/assets/css/main.sass new file mode 100644 index 000000000..47e176fcc --- /dev/null +++ b/src/main/webapp/assets/css/main.sass @@ -0,0 +1,45 @@ +/* -- Variables -- */ +$font-stack: 'roboto',arial +$primary-color: #727272 +$border: 1px solid #3d373a +$bground: #323232 +$bRadius: 5px + +/* -- global --*/ +html, +body + margin:0 + padding:0 + font: $font-stack + color: $primary-color + +ul + list-style: none + +a:hover + text-decoration: none + +.container + padding:0 + width:100%; + +/* -- style for header -- */ +.navbar-inverse + border: 0 + background: url(../images/line-header.png) #2e272a center bottom no-repeat + +.fa-bubble-chart + background: url(../images/ic-small.png) left 3px no-repeat + padding:20px + width:20px + +.setting-content + background-color: $bground + border: $border + padding: 4px; + border-radius: $bRadius + max-height: 30px; + height: 30px; + width: 28px; + position: relative; + i \ No newline at end of file diff --git a/src/main/webapp/assets/images/ic-find-jobs.png b/src/main/webapp/assets/images/ic-find-jobs.png new file mode 100644 index 0000000000000000000000000000000000000000..878d258973fef0428247b2b8a2af9c4bdfac7a64 GIT binary patch literal 1004 zcmaJ=&ui0A91nEJ9Biivb6y^qr~{icZIiWOacueFBBtBA>WbhnOy)U27=lk>BUo2c69vUB_C~8=r zSBhjEBj1_96Xak0yl|Z?r?Fbb%czPQW&o*K8&x3CU2_ck~FbP0vKWX{|#HDsav5B>MZC_cU;9iC*E2l;O*;=FGPOxZEm~tk$}f zx9OQnU^)_sfD5q+B6q_J#Ym#tx+2-fW|jtR2ws=yqoB&hB9Ku40ncQTR*K_*ATV5( z7X-S{6uu~>dFg7xMmSa+J zN?o8~{2%JNJ#>hR@HpOo3Wuep57{CNQ9ZCol4ok44f@!YXNdWJ89AB9}C}Cufw(b$0GFQvLqNb zZtY*K?wZK_#M|EBl0$Fwp-1LDAcHNwdUrrB#j38%mZHP2k7tJ{FgU<(KVA6wWb4ae zWpMmkbMxA6rEy+))_PFg9k{*p@*pvGbLr#BgTw$oqRRVwqxwz;--y)xAHNz83ypk -
-
-

Companies

-
- -
-
-
- -
-
- \ No newline at end of file +
\ No newline at end of file diff --git a/src/main/webapp/assets/modules/header/header.ctrl.js b/src/main/webapp/assets/modules/header/header.ctrl.js index 147c7adc3..1a4395933 100644 --- a/src/main/webapp/assets/modules/header/header.ctrl.js +++ b/src/main/webapp/assets/modules/header/header.ctrl.js @@ -1,24 +1,24 @@ -angular.module("Header").controller("headerController", function($scope, $http, jsonFactory) { +angular.module("Header").controller("headerController", function($scope, $http, $translate, jsonFactory) { - $scope.keyList = jsonFactory.shortcuts; + // TODO: refactor later - var key = $(".keyboard"); - key.on("click", function() { - if ($(".keyboard-shortcuts-items:first").is(":hidden")) { - $(".keyboard-shortcuts-items").slideDown("slow"); - } else { - $(".keyboard-shortcuts-items").hide(); - } - }); - + //$scope.keyList = jsonFactory.shortcuts; + // var key = $(".keyboard"); + // key.on("click", function() { + // if ($(".keyboard-shortcuts-items:first").is(":hidden")) { + // $(".keyboard-shortcuts-items").slideDown("slow"); + // } else { + // $(".keyboard-shortcuts-items").hide(); + // } + // }); $scope.settingStyle = function() { var set = $(".setting-content"); set.on("click", function() { set.find("ul.setting-items").css("display", "block"); set.stop().animate({ - width : "125" + width : "125" // 125 }); }).mouseleave(function() { set.find("ul.setting-items").css("display", "none"); @@ -28,10 +28,6 @@ angular.module("Header").controller("headerController", function($scope, $http, $(".keyboard-shortcuts-items").hide(); }); } + $scope.langKeys = jsonFactory.availableLanguageKeys; - // $http.get("data/keyboardshortcuts.json").success(function(data, status, headers, config) { - // $scope.keyList = data; - // }).error(function(data, status, headers, config) { - // // log error - // }); }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/header/header.mod.js b/src/main/webapp/assets/modules/header/header.mod.js new file mode 100644 index 000000000..99de0b4de --- /dev/null +++ b/src/main/webapp/assets/modules/header/header.mod.js @@ -0,0 +1,8 @@ +angular.module("Header").directive("translation", function() { + return { + restrict : "A", // This mens that it will be used as an attribute and NOT as an element. + replace : false, + templateUrl : "modules/translation/translation.tpl.html", + controller : "translationController" + } +}); diff --git a/src/main/webapp/assets/modules/header/header.tpl.html b/src/main/webapp/assets/modules/header/header.tpl.html index d562ea91e..95a87ea03 100644 --- a/src/main/webapp/assets/modules/header/header.tpl.html +++ b/src/main/webapp/assets/modules/header/header.tpl.html @@ -12,15 +12,7 @@
  • -
  • -
    -
      -
    • - {{key.name}}{{key.keyShort}} -
    • -
    -
    -
  • +
  • diff --git a/src/main/webapp/assets/modules/home/home.ctrl.js b/src/main/webapp/assets/modules/home/home.ctrl.js index a31b6df42..46304f825 100644 --- a/src/main/webapp/assets/modules/home/home.ctrl.js +++ b/src/main/webapp/assets/modules/home/home.ctrl.js @@ -1,3 +1,3 @@ angular.module('Home').controller('homeController', function($scope) { - $scope.tagline = 'Career Analytics. Open Source. Awesome!'; + }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/home/home.mod.js b/src/main/webapp/assets/modules/home/home.mod.js index a150f5a01..ae77619e2 100644 --- a/src/main/webapp/assets/modules/home/home.mod.js +++ b/src/main/webapp/assets/modules/home/home.mod.js @@ -2,13 +2,14 @@ angular.module("Home").directive("chart", function() { return { restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, - templateUrl : "modules/collection/chart.tpl.html", - controller : "chartController" + templateUrl : "modules/collection/chart.tpl.html" + //controller : "chartController" } }).directive("findjobs", function() { return { restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, - templateUrl : "modules/job/findJobs.button.tpl.html" + templateUrl : "modules/job/findJobs.button.tpl.html", + controller: 'findJobsController' } }); diff --git a/src/main/webapp/assets/modules/job/findJobs.button.tpl.html b/src/main/webapp/assets/modules/job/findJobs.button.tpl.html index e869b633e..8c13fa465 100644 --- a/src/main/webapp/assets/modules/job/findJobs.button.tpl.html +++ b/src/main/webapp/assets/modules/job/findJobs.button.tpl.html @@ -1,10 +1,5 @@ -
    -
    - -
    - Find Jobs -
    -
    +
    +
    + findjobs +
    \ No newline at end of file diff --git a/src/main/webapp/assets/modules/job/findJobs.ctrl.js b/src/main/webapp/assets/modules/job/findJobs.ctrl.js new file mode 100644 index 000000000..bbe80e47a --- /dev/null +++ b/src/main/webapp/assets/modules/job/findJobs.ctrl.js @@ -0,0 +1,3 @@ +angular.module('Jobs').controller('findJobsController', function($scope) { + //alert('abc') +}); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/messages_en-US.json b/src/main/webapp/assets/modules/translation/messages_en-US.json index 29319e22b..d68f6adef 100644 --- a/src/main/webapp/assets/modules/translation/messages_en-US.json +++ b/src/main/webapp/assets/modules/translation/messages_en-US.json @@ -1,5 +1,4 @@ { - "techlooper" : { - "slogan" : "Career Analytics. Open Source. Awesome!" - } + "language" : "EN", + "findjobs" : "Find Jobs" } \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/messages_vi.json b/src/main/webapp/assets/modules/translation/messages_vi.json index 3d0c22184..60357620b 100644 --- a/src/main/webapp/assets/modules/translation/messages_vi.json +++ b/src/main/webapp/assets/modules/translation/messages_vi.json @@ -1,7 +1,6 @@ { - "techlooper" : { - "slogan" : "Techlooper | Career Analytics. Mã nguồn mở. Awesome!" - } + "language" : "VI", + "findjobs" : "Tìm việc" } diff --git a/src/main/webapp/assets/modules/translation/translation.ctrl.js b/src/main/webapp/assets/modules/translation/translation.ctrl.js index 2068322de..c12173f88 100644 --- a/src/main/webapp/assets/modules/translation/translation.ctrl.js +++ b/src/main/webapp/assets/modules/translation/translation.ctrl.js @@ -1,5 +1,6 @@ angular.module('Common').controller('translationController', function($scope, $translate) { - $scope.setLang = function(langKey) { - $translate.use(langKey); - }; + $(".langKey").on('click', function() { + var lang = $translate.use(); + $translate.use(lang == "vi" ? "en-US":"vi"); + }); }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/translation.tpl.html b/src/main/webapp/assets/modules/translation/translation.tpl.html index f342daa7a..9449df338 100644 --- a/src/main/webapp/assets/modules/translation/translation.tpl.html +++ b/src/main/webapp/assets/modules/translation/translation.tpl.html @@ -1,2 +1 @@ - - \ No newline at end of file +
    language
    From e17dbb45d14f6001c966ef3ccf44940455992288 Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Tue, 30 Sep 2014 16:33:58 +0700 Subject: [PATCH 07/48] add language to setting bar on the header --- src/main/webapp/assets/modules/home/home.mod.js | 4 ++-- .../webapp/assets/modules/translation/translation.ctrl.js | 4 ++-- .../webapp/assets/modules/translation/translation.tpl.html | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/assets/modules/home/home.mod.js b/src/main/webapp/assets/modules/home/home.mod.js index ae77619e2..84d415a84 100644 --- a/src/main/webapp/assets/modules/home/home.mod.js +++ b/src/main/webapp/assets/modules/home/home.mod.js @@ -2,8 +2,8 @@ angular.module("Home").directive("chart", function() { return { restrict : "A", // This mens that it will be used as an attribute and NOT as an element. replace : true, - templateUrl : "modules/collection/chart.tpl.html" - //controller : "chartController" + templateUrl : "modules/collection/chart.tpl.html", + controller : "chartController" } }).directive("findjobs", function() { return { diff --git a/src/main/webapp/assets/modules/translation/translation.ctrl.js b/src/main/webapp/assets/modules/translation/translation.ctrl.js index c12173f88..3b2b303b4 100644 --- a/src/main/webapp/assets/modules/translation/translation.ctrl.js +++ b/src/main/webapp/assets/modules/translation/translation.ctrl.js @@ -1,6 +1,6 @@ angular.module('Common').controller('translationController', function($scope, $translate) { - $(".langKey").on('click', function() { + $scope.setLang = function() { var lang = $translate.use(); $translate.use(lang == "vi" ? "en-US":"vi"); - }); + }; }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/translation.tpl.html b/src/main/webapp/assets/modules/translation/translation.tpl.html index 9449df338..1a70adfd1 100644 --- a/src/main/webapp/assets/modules/translation/translation.tpl.html +++ b/src/main/webapp/assets/modules/translation/translation.tpl.html @@ -1 +1 @@ -
    language
    +
    language
    From 5cd3ee04295e7e1228d39087edc8d9cd354db60b Mon Sep 17 00:00:00 2001 From: "hamedshayan@gmail.com" Date: Tue, 30 Sep 2014 17:11:02 +0700 Subject: [PATCH 08/48] refactored and organized it. --- .gitignore | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index fcf1e1215..affe0bf7f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,26 @@ # Created by .gitignore support plugin (hsz.mobi) -.idea + +# nodejs bower_components/ node_modules/ + +# IntelliJ files *.iml -target/ +.idea + +# eclipse files .settings/ .project .classpath + +# maven build target/ + +# files to be excluded from source code +index.html + +# other custom rules static/ -.log -index.html \ No newline at end of file +*.log + + From f125a0b2b64d3e5f6f6ccfc6052a485b641b2fef Mon Sep 17 00:00:00 2001 From: Phuong H Date: Tue, 30 Sep 2014 17:29:14 +0700 Subject: [PATCH 09/48] * Translate FindJob button * Fix HTML5 issue --- src/main/webapp/assets/modules/app.js | 5 +++-- .../webapp/assets/modules/job/findJobs.button.tpl.html | 2 +- .../assets/modules/translation/translation.ctrl.js | 10 +++++----- .../assets/modules/translation/translation.tpl.html | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/webapp/assets/modules/app.js b/src/main/webapp/assets/modules/app.js index 6027b5c34..42ee24cb4 100644 --- a/src/main/webapp/assets/modules/app.js +++ b/src/main/webapp/assets/modules/app.js @@ -19,7 +19,8 @@ techlooper.config(function($routeProvider, $translateProvider, $locationProvider $translateProvider.preferredLanguage("en-US"); $translateProvider.useLocalStorage(); // $translateProvider.useCookieStorage(); - $translateProvider.use(window.navigator.userLanguage || window.navigator.language); + var browerLang = window.navigator.userLanguage || window.navigator.language; + $translateProvider.use(browerLang.search("vi") === 0 ? "vi" : "en-US"); $routeProvider.when("/", { templateUrl: "modules/home/home.tpl.html", @@ -27,7 +28,7 @@ techlooper.config(function($routeProvider, $translateProvider, $locationProvider }).otherwise({ redirectTo: "/" }); - $locationProvider.html5Mode(true); +// $locationProvider.html5Mode(true); }); techlooper.directive("header", function() { diff --git a/src/main/webapp/assets/modules/job/findJobs.button.tpl.html b/src/main/webapp/assets/modules/job/findJobs.button.tpl.html index 8c13fa465..a57dfe09d 100644 --- a/src/main/webapp/assets/modules/job/findJobs.button.tpl.html +++ b/src/main/webapp/assets/modules/job/findJobs.button.tpl.html @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/translation.ctrl.js b/src/main/webapp/assets/modules/translation/translation.ctrl.js index 3b2b303b4..2dd8798ac 100644 --- a/src/main/webapp/assets/modules/translation/translation.ctrl.js +++ b/src/main/webapp/assets/modules/translation/translation.ctrl.js @@ -1,6 +1,6 @@ -angular.module('Common').controller('translationController', function($scope, $translate) { - $scope.setLang = function() { - var lang = $translate.use(); - $translate.use(lang == "vi" ? "en-US":"vi"); - }; +angular.module('Common').controller('translationController', function($scope, $translate, $element) { + $element.click(function() { + $translate.use($translate.use() == "vi" ? "en-US" : "vi"); + $scope.$apply(); + }); }); \ No newline at end of file diff --git a/src/main/webapp/assets/modules/translation/translation.tpl.html b/src/main/webapp/assets/modules/translation/translation.tpl.html index 1a70adfd1..9ac38fc03 100644 --- a/src/main/webapp/assets/modules/translation/translation.tpl.html +++ b/src/main/webapp/assets/modules/translation/translation.tpl.html @@ -1 +1 @@ -
    language
    +
    {{ "language" | translate }}
    From 7b757c0f46919a9679b334f6d0bce08331fd7591 Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Tue, 30 Sep 2014 17:32:52 +0700 Subject: [PATCH 10/48] add ico icon --- src/main/webapp/assets/images/icon.ico | Bin 0 -> 99678 bytes src/main/webapp/assets/images/next.png | Bin 873 -> 0 bytes src/main/webapp/assets/images/prev.png | Bin 887 -> 0 bytes src/main/webapp/assets/index.tpl.html | 1 + 4 files changed, 1 insertion(+) create mode 100644 src/main/webapp/assets/images/icon.ico delete mode 100644 src/main/webapp/assets/images/next.png delete mode 100644 src/main/webapp/assets/images/prev.png diff --git a/src/main/webapp/assets/images/icon.ico b/src/main/webapp/assets/images/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3262d12afae63a4363816ae8ea34f941380841a0 GIT binary patch literal 99678 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 diff --git a/src/main/webapp/assets/images/prev.png b/src/main/webapp/assets/images/prev.png deleted file mode 100644 index 7c74571586905e280de5cc7eaf8046875609f71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmV--1Bm>IP)O0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#8A(JzRCwC#-Mx*%Fcb%HClU<>io^mp z0xR4mP|+UaP{9bd!L7g=6d)=JP|*2FoCF+BoW%C~vZaU=N%K=2Ao2S@W0a2ddR?_0 zQ!0k}v7eia^9E)-9?wRj(Yy($)CyBom6=YbrU|If3iCH^x0^W}4(58jZkNmDLLH6^ zrVXgj4$}lwWEeM4kzt-kUDsy6-^1>z%rMVa&hdDJ-JRXGMTYq|r2yvBPODRqVcx@t zx*>;#5rY#0Mg&eQ81^_ZVOZnDhGC170){0{Dj0S+DPdUQq=sRGg8{<=2MdNg4kip~ z9Bde}I22$=;!uGhheHX56b>~QGB^}rNZ?R~LC2vCgNj2P1`US;3SIFew3;z)xDh9eOs2#!>k!8np(2H{AD z>5ZcSrWcMDn9ewwU^?MwgYm}E2;+sL6{ZzOGfX3nb{Hp4hH>Cz7za*6{vMgtl$)wYXm&*lUV0R@E=5bnWAn*c$FD#Vz$>;Ogob0$?IXjU!8OZOe zJOj1-2+Tk&e;+bX%O6kmKy8mKR0H`u>{1Kl`VUewno$MR=cS$+puVqz zRR9fHNFW|)=n@psKp_?{i3JL^>`f$4$OV()fI=^|6$KPyk+vA1Sj+oG0L3f}VGk6$ zq=+?8iefajK&i?YSpuajfMo}ix^$Wq5Ju5G8z8K>1{Oe=K_BFSup?qf15pSUA`3(% zmWm`0r9d-sK-8k}NC8m{Q6vLIHGY!>5ar-jbRg=Hzo$B1(MMGD;kiLwsBE_BsCli4kWErWl$iAO-_RW ziR>L53P^He<-tIuR2*oj4Xw4I_8n^AeTM}FOenDb5R20X2Techlooper | Career Analytics. Open Source. Awesome! + From a388ecaf2f01dffb942e0940ea7a09d0922371aa Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Tue, 30 Sep 2014 17:58:02 +0700 Subject: [PATCH 11/48] update app.js remove "$locationProvider.html5Mode(true);" --- src/main/webapp/assets/modules/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/webapp/assets/modules/app.js b/src/main/webapp/assets/modules/app.js index 6027b5c34..939b82ed7 100644 --- a/src/main/webapp/assets/modules/app.js +++ b/src/main/webapp/assets/modules/app.js @@ -27,7 +27,6 @@ techlooper.config(function($routeProvider, $translateProvider, $locationProvider }).otherwise({ redirectTo: "/" }); - $locationProvider.html5Mode(true); }); techlooper.directive("header", function() { From e92cdb386134221a8082fb10afc251d3a1919fcd Mon Sep 17 00:00:00 2001 From: "hamedshayan@gmail.com" Date: Tue, 30 Sep 2014 18:07:17 +0700 Subject: [PATCH 12/48] refactored and organized it. --- src/main/webapp/assets/Gruntfile.js | 11 +++++++++-- src/main/webapp/assets/package.json | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/assets/Gruntfile.js b/src/main/webapp/assets/Gruntfile.js index fdcc46e0a..4dbf64931 100644 --- a/src/main/webapp/assets/Gruntfile.js +++ b/src/main/webapp/assets/Gruntfile.js @@ -3,6 +3,12 @@ module.exports = function(grunt) { grunt.initConfig({ pkg : grunt.file.readJSON("package.json"), + bower : { + install : { + + } + }, + wiredep : { target : { src : [ "index.html" ] @@ -56,8 +62,9 @@ module.exports = function(grunt) { grunt.loadNpmTasks("grunt-contrib-watch"); grunt.loadNpmTasks("grunt-contrib-connect"); grunt.loadNpmTasks("grunt-include-source"); - grunt.loadNpmTasks("grunt-wiredep") + grunt.loadNpmTasks("grunt-wiredep"); + grunt.loadNpmTasks("grunt-bower-task"); - grunt.registerTask("build", [ "includeSource:target", "wiredep:target" ]); + grunt.registerTask("build", [ "bower:install", "includeSource:target", "wiredep:target" ]); grunt.registerTask("run", [ "connect", "watch" ]); }; \ No newline at end of file diff --git a/src/main/webapp/assets/package.json b/src/main/webapp/assets/package.json index ba35911ca..c20212839 100644 --- a/src/main/webapp/assets/package.json +++ b/src/main/webapp/assets/package.json @@ -1,10 +1,12 @@ { "name": "techlooper", + "description" : "This is VietnamWorks Open Source project. TechLooper is an aggregator which will detects the market demands and trends for IT jobs.", "devDependencies": { "grunt": "latest", "grunt-contrib-connect": "latest", "grunt-contrib-watch": "latest", "grunt-include-source": "latest", - "grunt-wiredep": "latest" + "grunt-wiredep": "latest", + "grunt-bower-task" : "latest" } } \ No newline at end of file From c2ba48c1ebaca42be6237bb6bf17b7ce294eb30b Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Wed, 1 Oct 2014 09:59:08 +0700 Subject: [PATCH 13/48] add sass file for css --- .../main.sassc | Bin 0 -> 11570 bytes src/main/webapp/assets/css/main.css | 246 +++--------------- src/main/webapp/assets/css/main.css.map | 7 + src/main/webapp/assets/css/main_bk.css | 210 +++++++++++++++ .../webapp/assets/{css => sass}/main.sass | 38 +-- src/main/webapp/css | 23 ++ 6 files changed, 303 insertions(+), 221 deletions(-) create mode 100644 .sass-cache/e670a5c672801a5d6006663f0684942c6204ede2/main.sassc mode change 100755 => 100644 src/main/webapp/assets/css/main.css create mode 100644 src/main/webapp/assets/css/main.css.map create mode 100755 src/main/webapp/assets/css/main_bk.css rename src/main/webapp/assets/{css => sass}/main.sass (60%) create mode 100644 src/main/webapp/css diff --git a/.sass-cache/e670a5c672801a5d6006663f0684942c6204ede2/main.sassc b/.sass-cache/e670a5c672801a5d6006663f0684942c6204ede2/main.sassc new file mode 100644 index 0000000000000000000000000000000000000000..bdc680028effccf1a61e7a7f63f6b41b203af894 GIT binary patch literal 11570 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"); /* Firefox 10+, Firefox on Android */ - filter: grayscale(100%); - -moz-filter: grayscale(100%); - -ms-filter: grayscale(100%); - -o-filter: grayscale(100%); - filter: gray; /* IE6-9 */ - -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ -} -.companies-list a:hover img{ - filter: url("data:image/svg+xml;utf8,#grayscale"); - filter: grayscale(0%); - -moz-filter: grayscale(0%); - -ms-filter: grayscale(0%); - -o-filter: grayscale(0%); - filter: none ; /* IE6-9 */ - zoom:1; - -webkit-filter: grayscale(0%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ -} -.discussion-board-block{ - position: absolute; - right: 10px; top: -13px; - cursor: pointer; -} -.discussion-board-block i{ - font-size: 30px; -} +.setting-label { + width: 20px; + float: left; } +/*# sourceMappingURL=main.css.map */ diff --git a/src/main/webapp/assets/css/main.css.map b/src/main/webapp/assets/css/main.css.map new file mode 100644 index 000000000..e5d603c4c --- /dev/null +++ b/src/main/webapp/assets/css/main.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";;AAQA;IAAK;EAEJ,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,IAAI,EAXQ,eAAQ;EAYpB,KAAK,EAXU,OAAO;;AAavB,EAAE;EACD,UAAU,EAAE,IAAI;;AAEjB,OAAO;EACN,eAAe,EAAE,IAAI;;AAEtB,UAAU;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;;;AAGZ,eAAe;EACd,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,8DAA8D;;AAE3E,gBAAgB;EACf,UAAU,EAAE,8CAA8C;EAC1D,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;;AACZ,gBAAgB;EACf,OAAO,EAAE,GAAG;EACZ,gBAAgB,EAhCP,OAAO;EAiChB,MAAM,EAlCE,iBAAiB;EAmCzB,aAAa,EAjCJ,GAAG;EAkCZ,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,QAAQ;EAClB,kBAAC;IACA,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,OAAO;;AACjB,cAAc;EACb,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI", +"sources": ["../sass/main.sass"], +"names": [], +"file": "main.css" +} \ No newline at end of file diff --git a/src/main/webapp/assets/css/main_bk.css b/src/main/webapp/assets/css/main_bk.css new file mode 100755 index 000000000..0c45b617e --- /dev/null +++ b/src/main/webapp/assets/css/main_bk.css @@ -0,0 +1,210 @@ +html, body { + height: 100%; +} + +body { + background-color: #2e272a; + color: #727272; + font-family: 'roboto',arial; + font-weight: 300; +} +ul{ + list-style: none; +} +a:hover{ + text-decoration: none; +} +.container{ + width: 100%; + padding: 0; +} +/* -- style for header -- */ +.fa-bubble-chart{ + background: url(../images/ic-small.png) left 3px no-repeat; + height: 20px; + width: 20px; +} +.navbar-inverse{ + background:url(../images/line-header.png) #2e272a center bottom no-repeat; + border: 0; +} +.setting-content{ + background-color: #323232; + border: 1px solid #3d373a; + padding: 4px; + border-radius: 5px; + max-height: 30px; + height: 30px; + width: 28px; + position: relative; +} +.setting-content i{ + font-size:20px; + cursor: pointer; +} +.setting-label{ + width:20px; + float: left; + cursor: pointer; +} +.setting-content ul{margin: 0; padding: 0;} +ul.setting-items{ + display: none; +} +.setting-content li{ + float: left; + padding-left: 10px; +} +.langKey{ + width: 25px; + height: 25px; + cursor: pointer; +} +.keyboard-shortcuts-items{ + background: #000000; + padding: 10px; + width: 240px; + height: auto; + display: none; + position: absolute; + left: -1px; + top: 28px; + border: 1px solid #3d373a; + border-radius: 5px; +} +.keyboard-shortcuts-items li{ + display: block; + clear: both; + border-top: 1px solid #2d2d2d; + padding: 5px 0; + width: 100%; + text-align: right; +} +.keyboard-shortcuts-items li:first-child{ + border-top: 0; + padding-top: 0; +} +.keyboard-shortcuts-items li span{ + float: left; +} + +.logo-block{} +.logo-block h1{margin: 0; padding: 0;} +/* --- Style for bubble chart --- */ +.bubble-chart-block{ + display: block; + clear: both; + /*padding-top:50px;*/ + width: 100%; + float: left; + height: 500px; + text-align: center; +} +.bubble-chart-container{ + width: 400px; + margin: auto; +} + +.find-jobs-block{ + float: left; + clear: both; + width: 100%; + text-align: center; +} +.find-jobs-container{ + width: 600px; + margin: auto; + position: relative; + text-align: center; +} +.find-jobs-button { + margin: auto; + text-align: center; +} +.find-jobs-button a{ + background: url(../images/ic-find-jobs.png) center 20px no-repeat; + width:150px; + display: block; + height:48px; + color: #727272; + margin: auto; +} +.find-jobs-button a:hover{ + background-position: center 22px; + color: #afafaf; + padding-top: 2px; +} +/* --- Style for footer --- */ +footer{ + position: fixed; + bottom: 0; + width: 100%; + z-index: 22; +} +.companies-block{ + +} +.companies-block h2{ + font-size: 16px; + text-transform: uppercase; + font-weight: 300; + background-color: #000000; + border-radius: 5px 5px 0 0; + width: auto; + padding: 5px 10px; + display: inline; + cursor: pointer; + z-index: 99; +} +.companies-list{ + background-color: #000000; + width: 100%; + height:0; + padding:5px 10px; + clear: both; + position: relative; + bottom: 0; +} +.companies-list ul{ + padding: 0; + margin: 0; + text-align: center; +} +.companies-list li{ + display: inline-block; + padding: 0 5px; +} +.companies-list a{ + width: 180px; + height: 100px; + cursor: pointer; + display: block; +} +.companies-list img{ + filter: url("data:image/svg+xml;utf8,#grayscale"); /* Firefox 10+, Firefox on Android */ + filter: grayscale(100%); + -moz-filter: grayscale(100%); + -ms-filter: grayscale(100%); + -o-filter: grayscale(100%); + filter: gray; /* IE6-9 */ + -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ +} +.companies-list a:hover img{ + filter: url("data:image/svg+xml;utf8,#grayscale"); + filter: grayscale(0%); + -moz-filter: grayscale(0%); + -ms-filter: grayscale(0%); + -o-filter: grayscale(0%); + filter: none ; /* IE6-9 */ + zoom:1; + -webkit-filter: grayscale(0%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ +} +.discussion-board-block{ + position: absolute; + right: 10px; top: -13px; + cursor: pointer; +} +.discussion-board-block i{ + font-size: 30px; +} + diff --git a/src/main/webapp/assets/css/main.sass b/src/main/webapp/assets/sass/main.sass similarity index 60% rename from src/main/webapp/assets/css/main.sass rename to src/main/webapp/assets/sass/main.sass index 47e176fcc..88d26b641 100644 --- a/src/main/webapp/assets/css/main.sass +++ b/src/main/webapp/assets/sass/main.sass @@ -8,8 +8,8 @@ $bRadius: 5px /* -- global --*/ html, body - margin:0 - padding:0 + margin: 0 + padding: 0 font: $font-stack color: $primary-color @@ -20,8 +20,8 @@ a:hover text-decoration: none .container - padding:0 - width:100%; + padding: 0 + width: 100% /* -- style for header -- */ .navbar-inverse @@ -30,16 +30,22 @@ a:hover .fa-bubble-chart background: url(../images/ic-small.png) left 3px no-repeat - padding:20px - width:20px - + padding: 20px + width: 20px .setting-content - background-color: $bground - border: $border - padding: 4px; - border-radius: $bRadius - max-height: 30px; - height: 30px; - width: 28px; - position: relative; - i \ No newline at end of file + padding: 4px + background-color: $bground + border: $border + border-radius: $bRadius + width: 28px + max-height: 30px + position: relative + i + font-size: 12px + cursor: pointer + ul + margin: 0 +.setting-label + width: 20px + float: left + cursor: pointer diff --git a/src/main/webapp/css b/src/main/webapp/css new file mode 100644 index 000000000..1fba8b34b --- /dev/null +++ b/src/main/webapp/css @@ -0,0 +1,23 @@ +/* +Errno::ENOENT: No such file or directory - src/main/webapp/sass + +Backtrace: +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:481:in `read' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:481:in `update_stylesheet' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:209:in `each' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:209:in `update_stylesheets' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin/compiler.rb:293:in `watch' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/plugin.rb:108:in `method_missing' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/exec/sass_scss.rb:370:in `watch_or_update' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/exec/sass_scss.rb:50:in `process_result' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/exec/base.rb:52:in `parse' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/lib/sass/exec/base.rb:19:in `parse!' +/Library/Ruby/Gems/2.0.0/gems/sass-3.4.5/bin/sass:13:in `' +/usr/bin/sass:23:in `load' +/usr/bin/sass:23:in `
    ' +*/ +body:before { + white-space: pre; + font-family: monospace; + content: "Errno::ENOENT: No such file or directory - src/main/webapp/sass"; } From 00fc8934a5200b7a1251242cf801e58538759f33 Mon Sep 17 00:00:00 2001 From: Phuong H Date: Wed, 1 Oct 2014 10:14:54 +0700 Subject: [PATCH 14/48] Revert .gitignore to r 5cd3ee0 (from chris) --- .gitignore | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index fcf1e1215..affe0bf7f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,26 @@ # Created by .gitignore support plugin (hsz.mobi) -.idea + +# nodejs bower_components/ node_modules/ + +# IntelliJ files *.iml -target/ +.idea + +# eclipse files .settings/ .project .classpath + +# maven build target/ + +# files to be excluded from source code +index.html + +# other custom rules static/ -.log -index.html \ No newline at end of file +*.log + + From 50b3a4ee8544b47cd70d0eb96d0928801e7b1e99 Mon Sep 17 00:00:00 2001 From: Phuong H Date: Wed, 1 Oct 2014 15:46:37 +0700 Subject: [PATCH 15/48] Converted main.css => main.sass ; responsive.css => responsive.sass ; bubble.css => bubble.sass --- .gitignore | 4 + src/main/webapp/assets/css/bubble.css | 366 ++++++++++---------- src/main/webapp/assets/css/main.css | 194 ++++++++++- src/main/webapp/assets/css/main.css.map | 7 - src/main/webapp/assets/css/main_bk.css | 210 ----------- src/main/webapp/assets/css/responsive.css | 214 ++++++------ src/main/webapp/assets/sass/bubble.sass | 175 ++++++++++ src/main/webapp/assets/sass/main.sass | 232 ++++++++++--- src/main/webapp/assets/sass/responsive.sass | 109 ++++++ 9 files changed, 936 insertions(+), 575 deletions(-) delete mode 100644 src/main/webapp/assets/css/main.css.map delete mode 100755 src/main/webapp/assets/css/main_bk.css create mode 100644 src/main/webapp/assets/sass/bubble.sass create mode 100644 src/main/webapp/assets/sass/responsive.sass diff --git a/.gitignore b/.gitignore index affe0bf7f..bd817ca3d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,10 @@ bower_components/ node_modules/ +# sass +.sass-cache/ +*.map + # IntelliJ files *.iml .idea diff --git a/src/main/webapp/assets/css/bubble.css b/src/main/webapp/assets/css/bubble.css index a0bc958c7..c5eab50de 100644 --- a/src/main/webapp/assets/css/bubble.css +++ b/src/main/webapp/assets/css/bubble.css @@ -1,192 +1,174 @@ - #left { - float:left; - width:555px; - margin-top: 50px; -} -#right { - float:right; - width:415px; - margin-top: 50px; -} -#right a, #right a:visited { - display:block; - color:#FF5800; - font-size: 12px; - text-transform: uppercase; - margin-top: 10px; -} -#right a:hover, #right a.active { - text-decoration:none; - color:#003359; -} -#right p { - color:#19337F; - margin-top: 35px; - font-size: 20px; -} -#box { - position:relative; - left:120px; -} -#box .circle { - cursor:pointer; - text-align:center; - width: 1000px; - height: 1000px; - position: absolute;; -} -#box .active { - width:340px; - height:340px; - cursor:pointer; - z-index: 0 !important; -} -#box .circle span { - width:125px; - font-size:18px; - position:relative; - top:-70%; - color:#ffffff; - text-transform: capitalize; -} -#box .circle strong{ - display: block; - clear: both; - font-size: 24px; - font-weight: 400; -} -#box #pmTech span { - top:-68%; -} -#box .circle .circle-content { - background: #f00; - width: 1000px; - height: 1000px; - border-radius: 50%; - width:150px; - height:150px; -} -#box .circle .redColor{ - background: #f00; -} -#box .circle .blueColor{ - background: #106da4; -} -#box .circle .yellowColor{ - background: #d7c500; -} -#box .circle .pinkColor{ - background: #cc21a0; -} -#box .circle .greenColor{ - background: #11a06c; -} -#box .circle .orangeColor{ - background: #d26e03; -} -#box .circle .lightSalmonColor{ - background: #ffa07a; -} -#box .circle .indigoColor{ - background: #4B0082; -} -#box .circle .oliveColor{ - background: #808000; -} -#box .circle .saddleBrownColor{ - background: #8B4513; -} -#box .textSize1, -#box .textSize1 .circle-content{ - width:50px; - height:50px; -} -#box .textSize1 span{ - font-size: 10px; - line-height:5px; - top:25px !important; - width: 50px; -} -#box .textSize1 strong{ - font-size: 12px; -} -#box .textSize2, -#box .textSize2 .circle-content{ - width:75px; - height:75px; -} -#box .textSize2 span{ - font-size: 15px; - line-height: 16px; - top: 30px !important; - width: 75px; -} -#box .textSize2 strong{ - font-size: 20px; -} -#box .textSize3, -#box .textSize3 .circle-content{ - width:100px; - height:100px; -} -#box .textSize3 span{ - font-size: 18px; - line-height:22px; - top: 18px !important; - width: 100px; -} -#box .textSize3 strong{ - font-size: 25px; -} -#box .textSize4, -#box .textSize4 .circle-content{ - width:125px; - height:125px; -} -#box .textSize4 span{ - top: -90px !important; - width: 125px; -} -#box .textSize5, -#box .textSize5 .circle-content{ - width:175px; - height:175px; -} -#box .textSize5 span{ - top: -90px !important; - width: 175px; -} -#box .textSize6, -#box .textSize6 .circle-content{ - width:200px; - height:200px; -} -#box .intro { - display:none; - width:250px; - color:#ffffff; - position:absolute; - bottom:100px; - left:35px; - line-height:15px; -} - -#box .active span{ - font-size:35px; - line-height:40px; - top: 120px !important; - text-align: center; - width:320px; -} -#box .active strong{ - font-size: 45px; -} -.bubble-chart-error{ - display: none; - width: 300px; - color: red; - margin: auto; -} -.small{ - z-index: 5 !important; -} \ No newline at end of file +#left { + float: left; + width: 555px; + margin-top: 50px; } + +#right { + float: right; + width: 415px; + margin-top: 50px; } + #right a { + display: block; + color: #FF5800; + font-size: 12px; + text-transform: uppercase; + margin-top: 10px; } + #right a:visited { + display: block; + color: #FF5800; + font-size: 12px; + text-transform: uppercase; + margin-top: 10px; } + #right a:hover, #right a.active { + text-decoration: none; + color: #003359; } + #right p { + color: #19337F; + margin-top: 35px; + font-size: 20px; } + +#box { + position: relative; + left: 120px; } + #box .circle { + cursor: pointer; + text-align: center; + width: 1000px; + height: 1000px; + position: absolute; } + #box .active { + width: 340px; + height: 340px; + cursor: pointer; + z-index: 0 !important; } + #box .circle span { + width: 125px; + font-size: 18px; + position: relative; + top: -70%; + color: #ffffff; + text-transform: capitalize; } + #box .circle strong { + display: block; + clear: both; + font-size: 24px; + font-weight: 400; } + #box #pmTech span { + top: -68%; } + #box .circle .circle-content { + background: #f00; + width: 1000px; + height: 1000px; + border-radius: 50%; + width: 150px; + height: 150px; } + #box .circle .redColor { + background: #f00; } + #box .circle .blueColor { + background: #106da4; } + #box .circle .yellowColor { + background: #d7c500; } + #box .circle .pinkColor { + background: #cc21a0; } + #box .circle .greenColor { + background: #11a06c; } + #box .circle .orangeColor { + background: #d26e03; } + #box .circle .lightSalmonColor { + background: #ffa07a; } + #box .circle .indigoColor { + background: #4B0082; } + #box .circle .oliveColor { + background: #808000; } + #box .circle .saddleBrownColor { + background: #8B4513; } + #box .textSize1 { + width: 50px; + height: 50px; } + #box .textSize1 .circle-content { + width: 50px; + height: 50px; } + #box .textSize1 span { + font-size: 10px; + line-height: 5px; + top: 25px !important; + width: 50px; } + #box .textSize1 strong { + font-size: 12px; } + #box .textSize2 { + width: 75px; + height: 75px; } + #box .textSize2 .circle-content { + width: 75px; + height: 75px; } + #box .textSize2 span { + font-size: 15px; + line-height: 16px; + top: 30px !important; + width: 75px; } + #box .textSize2 strong { + font-size: 20px; } + #box .textSize3 { + width: 100px; + height: 100px; } + #box .textSize3 .circle-content { + width: 100px; + height: 100px; } + #box .textSize3 span { + font-size: 18px; + line-height: 22px; + top: 18px !important; + width: 100px; } + #box .textSize3 strong { + font-size: 25px; } + #box .textSize4 { + width: 125px; + height: 125px; } + #box .textSize4 .circle-content { + width: 125px; + height: 125px; } + #box .textSize4 span { + top: -90px !important; + width: 125px; } + #box .textSize5 { + width: 175px; + height: 175px; } + #box .textSize5 .circle-content { + width: 175px; + height: 175px; } + #box .textSize5 span { + top: -90px !important; + width: 175px; } + #box .textSize6 { + width: 200px; + height: 200px; } + #box .textSize6 .circle-content { + width: 200px; + height: 200px; } + #box .intro { + display: none; + width: 250px; + color: #ffffff; + position: absolute; + bottom: 100px; + left: 35px; + line-height: 15px; } + #box .active span { + font-size: 35px; + line-height: 40px; + top: 120px !important; + text-align: center; + width: 320px; } + #box .active strong { + font-size: 45px; } + +.bubble-chart-error { + display: none; + width: 300px; + color: red; + margin: auto; } + +.small { + z-index: 5 !important; } + +/*# sourceMappingURL=bubble.css.map */ diff --git a/src/main/webapp/assets/css/main.css b/src/main/webapp/assets/css/main.css index 0337f5012..f3d434786 100644 --- a/src/main/webapp/assets/css/main.css +++ b/src/main/webapp/assets/css/main.css @@ -1,11 +1,12 @@ -/* -- Variables -- */ -/* -- global -- */ -html, +html { + height: 100%; } + body { - margin: 0; - padding: 0; - font: "roboto", arial; - color: #727272; } + height: 100%; + background-color: #2e272a; + color: #727272; + font-family: "roboto", arial; + font-weight: 300; } ul { list-style: none; } @@ -14,33 +15,190 @@ a:hover { text-decoration: none; } .container { - padding: 0; - width: 100%; } + width: 100%; + padding: 0; } /* -- style for header -- */ -.navbar-inverse { - border: 0; - background: url(../images/line-header.png) #2e272a center bottom no-repeat; } - .fa-bubble-chart { background: url(../images/ic-small.png) left 3px no-repeat; - padding: 20px; + height: 20px; width: 20px; } +.navbar-inverse { + background: url(../images/line-header.png) #2e272a center bottom no-repeat; + border: 0; } + .setting-content { - padding: 4px; background-color: #323232; border: 1px solid #3d373a; + padding: 4px; border-radius: 5px; - width: 28px; max-height: 30px; + height: 30px; + width: 28px; position: relative; } .setting-content i { - font-size: 12px; + font-size: 20px; cursor: pointer; } .setting-label { width: 20px; - float: left; } + float: left; + cursor: pointer; } + +.setting-content ul { + margin: 0; + padding: 0; } + +ul.setting-items { + display: none; } + +.setting-content li { + float: left; + padding-left: 10px; } + +.langKey { + width: 25px; + height: 25px; + cursor: pointer; } + +.keyboard-shortcuts-items { + background: #000000; + padding: 10px; + width: 240px; + height: auto; + display: none; + position: absolute; + left: -1px; + top: 28px; + border: 1px solid #3d373a; + border-radius: 5px; } + .keyboard-shortcuts-items li { + display: block; + clear: both; + border-top: 1px solid #2d2d2d; + padding: 5px 0; + width: 100%; + text-align: right; } + .keyboard-shortcuts-items li:first-child { + border-top: 0; + padding-top: 0; } + .keyboard-shortcuts-items li span { + float: left; } + +.logo-block h1 { + margin: 0; + padding: 0; } + +/* --- Style for bubble chart --- */ +.bubble-chart-block { + display: block; + clear: both; + /*padding-top:50px; */ + width: 100%; + float: left; + height: 500px; + text-align: center; } + +.bubble-chart-container { + width: 400px; + margin: auto; } + +.find-jobs-block { + float: left; + clear: both; + width: 100%; + text-align: center; } + +.find-jobs-container { + width: 600px; + margin: auto; + position: relative; + text-align: center; } + +.find-jobs-button { + margin: auto; + text-align: center; } + .find-jobs-button a { + background: url(../images/ic-find-jobs.png) center 20px no-repeat; + width: 150px; + display: block; + height: 48px; + color: #727272; + margin: auto; } + .find-jobs-button a:hover { + background-position: center 22px; + color: #afafaf; + padding-top: 2px; } + +/* --- Style for footer --- */ +footer { + position: fixed; + bottom: 0; + width: 100%; + z-index: 22; } + +.companies-block h2 { + font-size: 16px; + text-transform: uppercase; + font-weight: 300; + background-color: #000000; + border-radius: 5px 5px 0 0; + width: auto; + padding: 5px 10px; + display: inline; + cursor: pointer; + z-index: 99; } + +.companies-list { + background-color: #000000; + width: 100%; + height: 0; + padding: 5px 10px; + clear: both; + position: relative; + bottom: 0; } + .companies-list ul { + padding: 0; + margin: 0; + text-align: center; } + .companies-list li { + display: inline-block; + padding: 0 5px; } + .companies-list a { + width: 180px; + height: 100px; + cursor: pointer; + display: block; } + .companies-list img { + filter: url("data:image/svg+xml;utf8,#grayscale"); + /* Firefox 10+, Firefox on Android */ + filter: grayscale(100%); + -moz-filter: grayscale(100%); + -ms-filter: grayscale(100%); + -o-filter: grayscale(100%); + filter: gray; + /* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+, Safari 6+, Safari 6+ iOS */ } + .companies-list a:hover img { + filter: url("data:image/svg+xml;utf8,#grayscale"); + filter: grayscale(0%); + -moz-filter: grayscale(0%); + -ms-filter: grayscale(0%); + -o-filter: grayscale(0%); + filter: none; + /* IE6-9 */ + zoom: 1; + -webkit-filter: grayscale(0%); + /* Chrome 19+, Safari 6+, Safari 6+ iOS */ } + +.discussion-board-block { + position: absolute; + right: 10px; + top: -13px; + cursor: pointer; } + .discussion-board-block i { + font-size: 30px; } /*# sourceMappingURL=main.css.map */ diff --git a/src/main/webapp/assets/css/main.css.map b/src/main/webapp/assets/css/main.css.map deleted file mode 100644 index e5d603c4c..000000000 --- a/src/main/webapp/assets/css/main.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": ";;AAQA;IAAK;EAEJ,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,IAAI,EAXQ,eAAQ;EAYpB,KAAK,EAXU,OAAO;;AAavB,EAAE;EACD,UAAU,EAAE,IAAI;;AAEjB,OAAO;EACN,eAAe,EAAE,IAAI;;AAEtB,UAAU;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;;;AAGZ,eAAe;EACd,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,8DAA8D;;AAE3E,gBAAgB;EACf,UAAU,EAAE,8CAA8C;EAC1D,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;;AACZ,gBAAgB;EACf,OAAO,EAAE,GAAG;EACZ,gBAAgB,EAhCP,OAAO;EAiChB,MAAM,EAlCE,iBAAiB;EAmCzB,aAAa,EAjCJ,GAAG;EAkCZ,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,QAAQ;EAClB,kBAAC;IACA,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,OAAO;;AACjB,cAAc;EACb,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI", -"sources": ["../sass/main.sass"], -"names": [], -"file": "main.css" -} \ No newline at end of file diff --git a/src/main/webapp/assets/css/main_bk.css b/src/main/webapp/assets/css/main_bk.css deleted file mode 100755 index 0c45b617e..000000000 --- a/src/main/webapp/assets/css/main_bk.css +++ /dev/null @@ -1,210 +0,0 @@ -html, body { - height: 100%; -} - -body { - background-color: #2e272a; - color: #727272; - font-family: 'roboto',arial; - font-weight: 300; -} -ul{ - list-style: none; -} -a:hover{ - text-decoration: none; -} -.container{ - width: 100%; - padding: 0; -} -/* -- style for header -- */ -.fa-bubble-chart{ - background: url(../images/ic-small.png) left 3px no-repeat; - height: 20px; - width: 20px; -} -.navbar-inverse{ - background:url(../images/line-header.png) #2e272a center bottom no-repeat; - border: 0; -} -.setting-content{ - background-color: #323232; - border: 1px solid #3d373a; - padding: 4px; - border-radius: 5px; - max-height: 30px; - height: 30px; - width: 28px; - position: relative; -} -.setting-content i{ - font-size:20px; - cursor: pointer; -} -.setting-label{ - width:20px; - float: left; - cursor: pointer; -} -.setting-content ul{margin: 0; padding: 0;} -ul.setting-items{ - display: none; -} -.setting-content li{ - float: left; - padding-left: 10px; -} -.langKey{ - width: 25px; - height: 25px; - cursor: pointer; -} -.keyboard-shortcuts-items{ - background: #000000; - padding: 10px; - width: 240px; - height: auto; - display: none; - position: absolute; - left: -1px; - top: 28px; - border: 1px solid #3d373a; - border-radius: 5px; -} -.keyboard-shortcuts-items li{ - display: block; - clear: both; - border-top: 1px solid #2d2d2d; - padding: 5px 0; - width: 100%; - text-align: right; -} -.keyboard-shortcuts-items li:first-child{ - border-top: 0; - padding-top: 0; -} -.keyboard-shortcuts-items li span{ - float: left; -} - -.logo-block{} -.logo-block h1{margin: 0; padding: 0;} -/* --- Style for bubble chart --- */ -.bubble-chart-block{ - display: block; - clear: both; - /*padding-top:50px;*/ - width: 100%; - float: left; - height: 500px; - text-align: center; -} -.bubble-chart-container{ - width: 400px; - margin: auto; -} - -.find-jobs-block{ - float: left; - clear: both; - width: 100%; - text-align: center; -} -.find-jobs-container{ - width: 600px; - margin: auto; - position: relative; - text-align: center; -} -.find-jobs-button { - margin: auto; - text-align: center; -} -.find-jobs-button a{ - background: url(../images/ic-find-jobs.png) center 20px no-repeat; - width:150px; - display: block; - height:48px; - color: #727272; - margin: auto; -} -.find-jobs-button a:hover{ - background-position: center 22px; - color: #afafaf; - padding-top: 2px; -} -/* --- Style for footer --- */ -footer{ - position: fixed; - bottom: 0; - width: 100%; - z-index: 22; -} -.companies-block{ - -} -.companies-block h2{ - font-size: 16px; - text-transform: uppercase; - font-weight: 300; - background-color: #000000; - border-radius: 5px 5px 0 0; - width: auto; - padding: 5px 10px; - display: inline; - cursor: pointer; - z-index: 99; -} -.companies-list{ - background-color: #000000; - width: 100%; - height:0; - padding:5px 10px; - clear: both; - position: relative; - bottom: 0; -} -.companies-list ul{ - padding: 0; - margin: 0; - text-align: center; -} -.companies-list li{ - display: inline-block; - padding: 0 5px; -} -.companies-list a{ - width: 180px; - height: 100px; - cursor: pointer; - display: block; -} -.companies-list img{ - filter: url("data:image/svg+xml;utf8,#grayscale"); /* Firefox 10+, Firefox on Android */ - filter: grayscale(100%); - -moz-filter: grayscale(100%); - -ms-filter: grayscale(100%); - -o-filter: grayscale(100%); - filter: gray; /* IE6-9 */ - -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ -} -.companies-list a:hover img{ - filter: url("data:image/svg+xml;utf8,#grayscale"); - filter: grayscale(0%); - -moz-filter: grayscale(0%); - -ms-filter: grayscale(0%); - -o-filter: grayscale(0%); - filter: none ; /* IE6-9 */ - zoom:1; - -webkit-filter: grayscale(0%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ -} -.discussion-board-block{ - position: absolute; - right: 10px; top: -13px; - cursor: pointer; -} -.discussion-board-block i{ - font-size: 30px; -} - diff --git a/src/main/webapp/assets/css/responsive.css b/src/main/webapp/assets/css/responsive.css index 4e6af5a93..069cccf6e 100755 --- a/src/main/webapp/assets/css/responsive.css +++ b/src/main/webapp/assets/css/responsive.css @@ -1,119 +1,115 @@ @media (min-width: 320px) and (max-width: 767px) { - .fa-cog { - display: none; - } - .fa-bars { - display: block; - } - .setting-block { - width: 60px; - float: left; - padding-top: 10px; - } - .setting-content { - width: 100%; - height: 100%; - } - .fa-bars { - display: block; - } - .logo-block { - width: 240px; - float: left; - } - .logo { - width: 100%; - padding: 5px 5px 5px 0; - } + .fa-cog { + display: none; } + + .fa-bars { + display: block; } + + .setting-block { + width: 60px; + float: left; + padding-top: 10px; } + + .setting-content { + width: 100%; + height: 100%; } + + .fa-bars { + display: block; } + + .logo-block { + width: 240px; + float: left; } + + .logo { + width: 100%; + padding: 5px 5px 5px 0; } .logo img { - width: 100%; - max-width: 259px; - } + width: 100%; + max-width: 259px; } .logo h1 { - line-height: 0; - margin: 0; - padding: 0; - } - .bubble-chart-container { - width: 320px; - } - #box .textSize1 span { - font-size: 10px; - line-height: 5px; - top: 15px !important; - width: 50px; - } - #box .textSize1 strong { - font-size: 12px; - } - #box .textSize2, #box .textSize2 .circle-content { - width: 75px; - height: 75px; - } + line-height: 0; + margin: 0; + padding: 0; } + + .bubble-chart-container { + width: 320px; } + + #box .textSize1 span { + font-size: 10px; + line-height: 5px; + top: 15px !important; + width: 50px; } + #box .textSize1 strong { + font-size: 12px; } + #box .textSize2 { + width: 75px; + height: 75px; } + #box .textSize2 .circle-content { + width: 75px; + height: 75px; } #box .textSize2 span { - font-size: 15px; - line-height: 16px; - top: 15px !important; - width: 75px; - } + font-size: 15px; + line-height: 16px; + top: 15px !important; + width: 75px; } #box .textSize2 strong { - font-size: 20px; - } - #box .textSize3, #box .textSize3 .circle-content { - width: 100px; - height: 100px; - } + font-size: 20px; } + #box .textSize3 { + width: 100px; + height: 100px; } + #box .textSize3 .circle-content { + width: 100px; + height: 100px; } #box .textSize3 span { - font-size: 18px; - line-height: 22px; - top: 18px !important; - width: 100px; - } + font-size: 18px; + line-height: 22px; + top: 18px !important; + width: 100px; } #box .textSize3 strong { - font-size: 25px; - } - #box .textSize4, #box .textSize4 .circle-content { - width: 125px; - height: 125px; - } + font-size: 25px; } + #box .textSize4 { + width: 125px; + height: 125px; } + #box .textSize4 .circle-content { + width: 125px; + height: 125px; } #box .textSize4 span { - top: -90px !important; - width: 125px; - } - #box .textSize5, #box .textSize5 .circle-content { - width: 175px; - height: 175px; - } + top: -90px !important; + width: 125px; } + #box .textSize5 { + width: 175px; + height: 175px; } + #box .textSize5 .circle-content { + width: 175px; + height: 175px; } #box .textSize5 span { - top: -90px !important; - width: 175px; - } - #box .textSize6, #box .textSize6 .circle-content { - width: 200px; - height: 200px; - } - #box .intro { - display: none; - width: 250px; - color: #ffffff; - position: absolute; - bottom: 100px; - left: 35px; - line-height: 15px; - } - #box .active span { - font-size: 35px; - line-height: 40px; - top: 45px !important; - text-align: center; - width: 220px; - } - #box .active strong { - font-size: 45px; - } -} + top: -90px !important; + width: 175px; } + #box .textSize6 { + width: 200px; + height: 200px; } + #box .textSize6 .circle-content { + width: 200px; + height: 200px; } + #box .intro { + display: none; + width: 250px; + color: #ffffff; + position: absolute; + bottom: 100px; + left: 35px; + line-height: 15px; } + #box .active span { + font-size: 35px; + line-height: 40px; + top: 45px !important; + text-align: center; + width: 220px; } + #box .active strong { + font-size: 45px; } } @media (min-width: 778px) { - .fa-bars { - display: none; - } -} \ No newline at end of file + .fa-bars { + display: none; } } + +/*# sourceMappingURL=responsive.css.map */ diff --git a/src/main/webapp/assets/sass/bubble.sass b/src/main/webapp/assets/sass/bubble.sass new file mode 100644 index 000000000..e10f75b59 --- /dev/null +++ b/src/main/webapp/assets/sass/bubble.sass @@ -0,0 +1,175 @@ +#left + float: left + width: 555px + margin-top: 50px + +#right + float: right + width: 415px + margin-top: 50px + a + display: block + color: #FF5800 + font-size: 12px + text-transform: uppercase + margin-top: 10px + &:visited + display: block + color: #FF5800 + font-size: 12px + text-transform: uppercase + margin-top: 10px + &:hover, &.active + text-decoration: none + color: #003359 + p + color: #19337F + margin-top: 35px + font-size: 20px + +#box + position: relative + left: 120px + .circle + cursor: pointer + text-align: center + width: 1000px + height: 1000px + position: absolute + .active + width: 340px + height: 340px + cursor: pointer + z-index: 0 !important + .circle + span + width: 125px + font-size: 18px + position: relative + top: -70% + color: #ffffff + text-transform: capitalize + strong + display: block + clear: both + font-size: 24px + font-weight: 400 + #pmTech span + top: -68% + .circle + .circle-content + background: #f00 + width: 1000px + height: 1000px + border-radius: 50% + width: 150px + height: 150px + .redColor + background: #f00 + .blueColor + background: #106da4 + .yellowColor + background: #d7c500 + .pinkColor + background: #cc21a0 + .greenColor + background: #11a06c + .orangeColor + background: #d26e03 + .lightSalmonColor + background: #ffa07a + .indigoColor + background: #4B0082 + .oliveColor + background: #808000 + .saddleBrownColor + background: #8B4513 + .textSize1 + width: 50px + height: 50px + .circle-content + width: 50px + height: 50px + span + font-size: 10px + line-height: 5px + top: 25px !important + width: 50px + strong + font-size: 12px + .textSize2 + width: 75px + height: 75px + .circle-content + width: 75px + height: 75px + span + font-size: 15px + line-height: 16px + top: 30px !important + width: 75px + strong + font-size: 20px + .textSize3 + width: 100px + height: 100px + .circle-content + width: 100px + height: 100px + span + font-size: 18px + line-height: 22px + top: 18px !important + width: 100px + strong + font-size: 25px + .textSize4 + width: 125px + height: 125px + .circle-content + width: 125px + height: 125px + span + top: -90px !important + width: 125px + .textSize5 + width: 175px + height: 175px + .circle-content + width: 175px + height: 175px + span + top: -90px !important + width: 175px + .textSize6 + width: 200px + height: 200px + .circle-content + width: 200px + height: 200px + .intro + display: none + width: 250px + color: #ffffff + position: absolute + bottom: 100px + left: 35px + line-height: 15px + .active + span + font-size: 35px + line-height: 40px + top: 120px !important + text-align: center + width: 320px + strong + font-size: 45px + +.bubble-chart-error + display: none + width: 300px + color: red + margin: auto + +.small + z-index: 5 !important \ No newline at end of file diff --git a/src/main/webapp/assets/sass/main.sass b/src/main/webapp/assets/sass/main.sass index 88d26b641..aeb1bec0f 100644 --- a/src/main/webapp/assets/sass/main.sass +++ b/src/main/webapp/assets/sass/main.sass @@ -1,51 +1,205 @@ -/* -- Variables -- */ -$font-stack: 'roboto',arial -$primary-color: #727272 -$border: 1px solid #3d373a -$bground: #323232 -$bRadius: 5px - -/* -- global --*/ -html, +html + height: 100% + body - margin: 0 - padding: 0 - font: $font-stack - color: $primary-color + height: 100% + background-color: #2e272a + color: #727272 + font-family: 'roboto', arial + font-weight: 300 ul - list-style: none + list-style: none a:hover - text-decoration: none + text-decoration: none .container - padding: 0 - width: 100% + width: 100% + padding: 0 -/* -- style for header -- */ -.navbar-inverse - border: 0 - background: url(../images/line-header.png) #2e272a center bottom no-repeat +/* -- style for header --*/ .fa-bubble-chart - background: url(../images/ic-small.png) left 3px no-repeat - padding: 20px - width: 20px + background: url(../images/ic-small.png) left 3px no-repeat + height: 20px + width: 20px + +.navbar-inverse + background: url(../images/line-header.png) #2e272a center bottom no-repeat + border: 0 + .setting-content - padding: 4px - background-color: $bground - border: $border - border-radius: $bRadius - width: 28px - max-height: 30px - position: relative - i - font-size: 12px - cursor: pointer - ul - margin: 0 + background-color: #323232 + border: 1px solid #3d373a + padding: 4px + border-radius: 5px + max-height: 30px + height: 30px + width: 28px + position: relative + i + font-size: 20px + cursor: pointer + .setting-label - width: 20px - float: left - cursor: pointer + width: 20px + float: left + cursor: pointer + +.setting-content ul + margin: 0 + padding: 0 + +ul.setting-items + display: none + +.setting-content li + float: left + padding-left: 10px + +.langKey + width: 25px + height: 25px + cursor: pointer + +.keyboard-shortcuts-items + background: #000000 + padding: 10px + width: 240px + height: auto + display: none + position: absolute + left: -1px + top: 28px + border: 1px solid #3d373a + border-radius: 5px + li + display: block + clear: both + border-top: 1px solid #2d2d2d + padding: 5px 0 + width: 100% + text-align: right + &:first-child + border-top: 0 + padding-top: 0 + span + float: left + +.logo-block h1 + margin: 0 + padding: 0 + +/* --- Style for bubble chart ---*/ + +.bubble-chart-block + display: block + clear: both + /*padding-top:50px;*/ + width: 100% + float: left + height: 500px + text-align: center + +.bubble-chart-container + width: 400px + margin: auto + +.find-jobs-block + float: left + clear: both + width: 100% + text-align: center + +.find-jobs-container + width: 600px + margin: auto + position: relative + text-align: center + +.find-jobs-button + margin: auto + text-align: center + a + background: url(../images/ic-find-jobs.png) center 20px no-repeat + width: 150px + display: block + height: 48px + color: #727272 + margin: auto + &:hover + background-position: center 22px + color: #afafaf + padding-top: 2px + +/* --- Style for footer ---*/ + +footer + position: fixed + bottom: 0 + width: 100% + z-index: 22 + +.companies-block h2 + font-size: 16px + text-transform: uppercase + font-weight: 300 + background-color: #000000 + border-radius: 5px 5px 0 0 + width: auto + padding: 5px 10px + display: inline + cursor: pointer + z-index: 99 + +.companies-list + background-color: #000000 + width: 100% + height: 0 + padding: 5px 10px + clear: both + position: relative + bottom: 0 + ul + padding: 0 + margin: 0 + text-align: center + li + display: inline-block + padding: 0 5px + a + width: 180px + height: 100px + cursor: pointer + display: block + img + filter: url("data:image/svg+xml;utf8,#grayscale") + /* Firefox 10+, Firefox on Android*/ + filter: grayscale(100%) + -moz-filter: grayscale(100%) + -ms-filter: grayscale(100%) + -o-filter: grayscale(100%) + filter: gray + /* IE6-9*/ + -webkit-filter: grayscale(100%) + /* Chrome 19+, Safari 6+, Safari 6+ iOS*/ + a:hover img + filter: url("data:image/svg+xml;utf8,#grayscale") + filter: grayscale(0%) + -moz-filter: grayscale(0%) + -ms-filter: grayscale(0%) + -o-filter: grayscale(0%) + filter: none + /* IE6-9*/ + zoom: 1 + -webkit-filter: grayscale(0%) + /* Chrome 19+, Safari 6+, Safari 6+ iOS*/ + +.discussion-board-block + position: absolute + right: 10px + top: -13px + cursor: pointer + i + font-size: 30px \ No newline at end of file diff --git a/src/main/webapp/assets/sass/responsive.sass b/src/main/webapp/assets/sass/responsive.sass new file mode 100644 index 000000000..6c25be5f0 --- /dev/null +++ b/src/main/webapp/assets/sass/responsive.sass @@ -0,0 +1,109 @@ +@media (min-width: 320px) and (max-width: 767px) + .fa-cog + display: none + .fa-bars + display: block + .setting-block + width: 60px + float: left + padding-top: 10px + .setting-content + width: 100% + height: 100% + .fa-bars + display: block + .logo-block + width: 240px + float: left + .logo + width: 100% + padding: 5px 5px 5px 0 + img + width: 100% + max-width: 259px + h1 + line-height: 0 + margin: 0 + padding: 0 + .bubble-chart-container + width: 320px + #box + .textSize1 + span + font-size: 10px + line-height: 5px + top: 15px !important + width: 50px + strong + font-size: 12px + .textSize2 + width: 75px + height: 75px + .circle-content + width: 75px + height: 75px + span + font-size: 15px + line-height: 16px + top: 15px !important + width: 75px + strong + font-size: 20px + .textSize3 + width: 100px + height: 100px + .circle-content + width: 100px + height: 100px + span + font-size: 18px + line-height: 22px + top: 18px !important + width: 100px + strong + font-size: 25px + .textSize4 + width: 125px + height: 125px + .circle-content + width: 125px + height: 125px + span + top: -90px !important + width: 125px + .textSize5 + width: 175px + height: 175px + .circle-content + width: 175px + height: 175px + span + top: -90px !important + width: 175px + .textSize6 + width: 200px + height: 200px + .circle-content + width: 200px + height: 200px + .intro + display: none + width: 250px + color: #ffffff + position: absolute + bottom: 100px + left: 35px + line-height: 15px + .active + span + font-size: 35px + line-height: 40px + top: 45px !important + text-align: center + width: 220px + strong + font-size: 45px + +@media (min-width: 778px) + .fa-bars + display: none \ No newline at end of file From 50b906272bc38ce351d16e4fe35c0a6de060406a Mon Sep 17 00:00:00 2001 From: johnsonpham Date: Wed, 1 Oct 2014 15:56:34 +0700 Subject: [PATCH 16/48] add landing page with static page --- src/main/webapp/landingpage/Gruntfile.js | 40 + .../webapp/landingpage/css/landingpage.css | 191 + src/main/webapp/landingpage/images/bg.png | Bin 0 -> 50700 bytes .../webapp/landingpage/images/ic-github.png | Bin 0 -> 1793 bytes .../webapp/landingpage/images/logo-terms.png | Bin 0 -> 109770 bytes src/main/webapp/landingpage/images/logo.png | Bin 0 -> 8298 bytes src/main/webapp/landingpage/js/jquery.js | 9190 +++++++++++++++++ src/main/webapp/landingpage/js/landingpage.js | 0 src/main/webapp/landingpage/package.json | 8 + .../webapp/landingpage/sass/landingpage.sass | 192 + 10 files changed, 9621 insertions(+) create mode 100644 src/main/webapp/landingpage/Gruntfile.js create mode 100644 src/main/webapp/landingpage/css/landingpage.css create mode 100644 src/main/webapp/landingpage/images/bg.png create mode 100644 src/main/webapp/landingpage/images/ic-github.png create mode 100644 src/main/webapp/landingpage/images/logo-terms.png create mode 100644 src/main/webapp/landingpage/images/logo.png create mode 100644 src/main/webapp/landingpage/js/jquery.js create mode 100644 src/main/webapp/landingpage/js/landingpage.js create mode 100644 src/main/webapp/landingpage/package.json create mode 100644 src/main/webapp/landingpage/sass/landingpage.sass diff --git a/src/main/webapp/landingpage/Gruntfile.js b/src/main/webapp/landingpage/Gruntfile.js new file mode 100644 index 000000000..392dfb071 --- /dev/null +++ b/src/main/webapp/landingpage/Gruntfile.js @@ -0,0 +1,40 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + pkg : grunt.file.readJSON("package.json"), + + watch : { + scripts : { + files : [ "*.js", "*.json" ], + options : { + livereload : true + } + }, + markup : { + files : [ "*.html" ], + options : { + livereload : true + } + }, + stylesheets : { + files : [ "*.css" ], + options : { + livereload : true + } + } + }, + connect : { + server : { + options : { + port : 8081, + base : ".", + keepalive : true + } + } + } + }); + + grunt.loadNpmTasks("grunt-contrib-watch"); + grunt.loadNpmTasks("grunt-contrib-connect"); + grunt.registerTask("run", [ "connect", "watch" ]); +}; \ No newline at end of file diff --git a/src/main/webapp/landingpage/css/landingpage.css b/src/main/webapp/landingpage/css/landingpage.css new file mode 100644 index 000000000..3254b2ee0 --- /dev/null +++ b/src/main/webapp/landingpage/css/landingpage.css @@ -0,0 +1,191 @@ +body { + background: #2e272a url(../images/bg.png) center top no-repeat; + font-size: 12px; + font-family: Roboto; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +.landingpage-webapp { + width: 100%; + text-align: center; } + +.landingpage-main { + width: 300px; + margin: auto; + padding-top: 50px; + position: relative; } + +.bubble-logo { + border-radius: 50%; + background: #2f2c2f; + width: 300px; + height: 300px; + text-align: center; + vertical-align: middle; + position: relative; + -webkit-box-shadow: 0px 0px 59px 15px rgba(0, 123, 220, 0.2); + -moz-box-shadow: 0px 0px 59px 15px rgba(0, 123, 220, 0.2); + box-shadow: 0px 0px 59px 15px rgba(0, 123, 220, 0.2); } + .bubble-logo img { + width: 80%; + margin: auto; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; } + +.join-us { + width: 300px; + height: 44px; + position: absolute; + bottom: 0; } + .join-us a { + width: 100%; + display: block; + height: 44px; + border: 1px solid #007cdc; + border-radius: 10px; + color: #fff; + line-height: 44px; + text-decoration: none; + text-transform: uppercase; + font-size: 22px; + font-weight: 300; + text-align: center; } + .join-us a:hover { + background-color: #007cdc; } + .join-us span.ic-github { + background: url(../images/ic-github.png) right 7px no-repeat; + width: 90px; + display: block; + margin: auto; + padding-right: 45px; } + +.landingpage-terms { + width: 100%; + clear: both; + display: block; + position: fixed; + bottom: 0; } + .landingpage-terms .term { + border-radius: 50%; + width: 100px; + height: 100px; + background: #ccc url(../images/logo-terms.png) left top no-repeat; + position: absolute; + opacity: 0.8; } + .landingpage-terms .term.java { + background-color: #332e32; + bottom: 10px; + width: 80px; + height: 80px; + background-position: center top; + left: 0; + z-index: 99; } + .landingpage-terms .term.php { + background-color: #4c494e; + background-position: center -98px; + bottom: 0; + left: 28%; } + .landingpage-terms .term.dotnet { + background-color: #231f20; + background-position: center -170px; + width: 180px; + height: 180px; + bottom: 20px; + left: 34%; } + .landingpage-terms .term.python { + background-color: #585657; + background-position: center -340px; + bottom: -30px; + width: 150px; + height: 150px; + left: 53%; } + .landingpage-terms .term.jenkins { + background-color: #403a3f; + background-position: center -510px; + bottom: -15px; + width: 180px; + height: 180px; + left: 70%; } + .landingpage-terms .term.html { + background-color: #262324; + background-position: center -730px; + bottom: 40px; + width: 70px; + height: 70px; + left: 94%; } + .landingpage-terms .term.css { + background-color: #4c494e; + background-position: center -860px; + bottom: 120px; + width: 60px; + height: 60px; + left: 55%; } + .landingpage-terms .term.angularjs { + background-color: #454143; + background-position: center -960px; + bottom: -50px; + width: 160px; + height: 160px; + left: 85%; } + .landingpage-terms .term.backbonejs { + background-color: #454143; + background-position: center -1198px; + bottom: 20px; + width: 110px; + height: 110px; + left: 80%; } + .landingpage-terms .term.grunt { + background-color: #231f20; + background-position: center -1390px; + bottom: -20px; + width: 200px; + height: 200px; + left: 3%; } + .landingpage-terms .term.github { + background-color: #464247; + background-position: center -1643px; + bottom: 120px; + width: 60px; + height: 60px; + left: 15%; } + .landingpage-terms .term.cplusplus { + background-color: #464247; + background-position: center -2230px; + bottom: 100px; + width: 120px; + height: 120px; + left: 65%; } + .landingpage-terms .term.js { + background-color: #262223; + background-position: center -1942px; + bottom: 80px; + width: 110px; + height: 110px; + left: 25%; } + .landingpage-terms .term.notejs { + background-color: #4c494e; + background-position: center -1750px; + bottom: -20px; + width: 160px; + height: 160px; + left: 17%; } + .landingpage-terms .term.bower { + background-color: #585657; + background-position: center -2092px; + bottom: 0; + width: 100px; + height: 100px; + left: 46%; } + .landingpage-terms .term.yeoman { + background-color: #464247; + background-position: center -2400px; + bottom: 0; + width: 110px; + height: 110px; + left: 63%; } + +/*# sourceMappingURL=landingpage.css.map */ diff --git a/src/main/webapp/landingpage/images/bg.png b/src/main/webapp/landingpage/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f69262c4bc7640725a33a55b932de11b8f8f9343 GIT binary patch literal 50700 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%0AQdwP`fG-xW{-siOpo)<5jeib!3MF}X4m#En( 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/landingpage/images/ic-github.png b/src/main/webapp/landingpage/images/ic-github.png new file mode 100644 index 0000000000000000000000000000000000000000..70b8d9f47a5a78d8598367a709e290733d4877bf GIT binary patch literal 1793 zcmaJ?X;c$e6dpwhAfznf3J;s> z;xxet000+Z2v35oKG*{}*kf-3yn76`j7Ry=Xe6RUQ)D_A;3$wd7!;~y@vsDzDORtn zg#!V=&PyeYMx(_dmK;$NWi}t8L9NBm01!Capq0rJVHAvm<5e0q^vrS&0#yn&w9rpX z7Hhe1f+{3c2S=ucN#&`Da;5^B9Rvm%SQvpCMrEKuoutvT3~cBlFALk-%p?f>=z=D) zp--Zs#o-_q(ZQe}kxG!0DHM=SCsJsBbUI}g=u4*flE~OiCs1fCKRV0T9~`(KESgTC zWJ!2}fmqmy4JDwcmPI0^q@)m2s6<2;PoglHOdE%;!NCGcmx z!xHPItFPe7b={3}885#F8*EBwK6$)9OJJHb1uQ(BNW+q0xsm*u3ko!6sdPI1&3^^g6a}zlyR}>NNdh-rHF&Z0^{T*E){So4b~n_PQypq^E@4D)Ms8Uf&qw zai0w=u80WVQ5AinLil{-6aVH~m27nL96~eK>Q)Y{F&ptBI}O<>$oK|y$~FnC@CRJ% zANlwz0J80um}xb*bhrMqCWm)NZn=1*mtL>@LV^JjF;iGF(&e;`O%)_ds2 zx-k>(c%(10*NHOwT+0fjdn5L4cv{o4u5fJ@G;@_R`ojhLev;|XX84%pbf~Y|#$NiFpkzc=2rj$-5&b+^43 z80&Y`wF#OJCa;&z&XUL&-|YPqyaQFPNvZ;eRu zXM7b}5pWHE+7PluYY9A<*+2D42W9uxQnX1|a8&7xk9cJ~9ls#f?hZAZ=SO+Bq!L%h zk;UcJaYmu~-91-Jyd+B|Ce@o?GV0Hk=h)r1JN0LOYCboDTx_}hvkPv62c7|Ro9LJF z!pIIrtLroN$SKdqyA?e)=Zx){5|!gxwUppjSLxNYKgM}x^6yzE8Kir!a;wi|iV{84}8hp>cD)73|{@dJ|IR|J=6%f!E zR2L7;X2-g>2{O(q3zEaS{WY>eZWn-^xlCCFkg87 UV}H+4X!|J%`C+`H!Li1F0gmmx)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/webapp/landingpage/images/logo-terms.png b/src/main/webapp/landingpage/images/logo-terms.png new file mode 100644 index 0000000000000000000000000000000000000000..c74cf889eb700266f18600097aea60ebe499befe GIT binary patch literal 109770 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 Ef*T6p$p8QV literal 0 HcmV?d00001 diff --git a/src/main/webapp/landingpage/images/logo.png b/src/main/webapp/landingpage/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..54233e92e9b1897445db1cbc4b119f94e70fa138 GIT binary patch literal 8298 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 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android < 4.0, iOS < 6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v1.10.19 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-04-18 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== strundefined && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", function() { + setDocument(); + }, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", function() { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { + div.innerHTML = "
    "; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowclip^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; + }, + + sibling: function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; +}; + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + +function Data() { + // Support: Android < 4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); + + this.expando = jQuery.expando + Math.random(); +} + +Data.uid = 1; +Data.accepts = jQuery.acceptData; + +Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } + + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; + + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; + + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); + + // Support: Android < 4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } + + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; + } + + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + if ( key === undefined ) { + this.cache[ unlock ] = {}; + + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } + } +}; +var data_priv = new Data(); + +var data_user = new Data(); + + + +/* + Implementation Summary + + 1. Enforce API surface and semantic compatibility with 1.9.x branch + 2. Improve the module's maintainability by reducing the storage + paths to a single mechanism. + 3. Use the same single mechanism to support "private" and "user" data. + 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) + 5. Avoid exposing implementation details on user objects (eg. expando properties) + 6. Provide a clear path for implementation upgrade to WeakMap in 2014 +*/ +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + data_user.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = data_user.get( elem ); + + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + data_priv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + data_user.set( this, key ); + }); + } + + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + data_user.remove( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = data_priv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return data_priv.get( elem, key ) || data_priv.access( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + data_priv.remove( elem, [ type + "queue", key ] ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // #11217 - WebKit loses check when the name is after the checked attribute + // Support: Windows Web Apps (WWA) + // `name` and `type` need .setAttribute for WWA + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE9-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +})(); +var strundefined = typeof undefined; + + + +support.focusinBubbles = "onfocusin" in window; + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome < 28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// Create "bubbling" focus and blur events +// Support: Firefox, Chrome, Safari +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE 9 + option: [ 1, "" ], + + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] + }; + +// Support: IE 9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Support: IE >= 9 +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Support: IE >= 9 + // Fix Cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Fixes #12346 + // Support: Webkit, IE + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "