├── .gitignore
├── .gitmodules
├── .sizecache.json
├── Gruntfile.js
├── LICENSE.txt
├── README.md
├── apple-touch-icon-precomposed.png
├── demo.css
├── index.html
├── index.min.html
├── package.json
├── ptr.coffee
├── ptr.css
├── ptr.js
├── ptr.min.css
├── ptr.min.js
├── qr.png
└── random
├── hashes.php
├── html.php
└── numbers.php
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SimonWaldherr/PullToRefresh/0b9e913474662736a527831e13a670b5c86249bb/.gitmodules
--------------------------------------------------------------------------------
/.sizecache.json:
--------------------------------------------------------------------------------
1 | {"":{"version":0.4,"tips":{"master":"3575af9787e58ada497cf882c37e6bff279a9780"}}," last run":{"ptr.js":{"":10878,"gz":2130},"ptr.min.js":{"":7011,"gz":1685},"ptr.css":{"":10727,"gz":7479},"ptr.min.css":{"":10396,"gz":7415}},"master":{"ptr.js":{"":10878,"gz":2130},"ptr.min.js":{"":7011,"gz":1685},"ptr.css":{"":10727,"gz":7479},"ptr.min.css":{"":10396,"gz":7415}}}
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | module.exports = function(grunt) {
2 | gzip = require("gzip-js");
3 | grunt.initConfig({
4 | pkg: grunt.file.readJSON('package.json'),
5 | compare_size: {
6 | files: [ "ptr.js", "ptr.min.js", "ptr.css", "ptr.min.css" ],
7 | options: {
8 | compress: {
9 | gz: function( contents ) {
10 | return gzip.zip( contents, {} ).length;
11 | }
12 | },
13 | cache: ".sizecache.json"
14 | }
15 | },
16 | uglify: {
17 | options: {
18 | banner: '/* * * * * * * * *\n' +
19 | ' * PullToRefresh *\n' +
20 | ' * Version <%= pkg.version %> *\n' +
21 | ' * License: MIT *\n' +
22 | ' * SimonWaldherr *\n' +
23 | ' * * * * * * * * */\n\n',
24 | footer: '\n\n\n\n /* foo */'
25 | },
26 | dist: {
27 | files: {
28 | './ptr.min.js': ['./ptr.js']
29 | }
30 | }
31 | },
32 | cssmin: {
33 | add_banner: {
34 | options: {
35 | banner: '/* * * * * * * * *\n' +
36 | ' * PullToRefresh *\n' +
37 | ' * Version <%= pkg.version %> *\n' +
38 | ' * License: MIT *\n' +
39 | ' * SimonWaldherr *\n' +
40 | ' * * * * * * * * */\n\n'
41 | },
42 | files: {
43 | './ptr.min.css': ['./ptr.css']
44 | }
45 | }
46 | },
47 | compress: {
48 | main: {
49 | options: {
50 | mode: 'gzip'
51 | },
52 | files: [
53 | {expand: true, src: 'ptr.min.js', dest: '/', ext: '.gz.js'}
54 | ]
55 | }
56 | }
57 | });
58 | grunt.loadNpmTasks("grunt-compare-size");
59 | grunt.loadNpmTasks('grunt-contrib-uglify');
60 | grunt.loadNpmTasks('grunt-contrib-cssmin');
61 | grunt.registerTask('default', ['uglify', 'cssmin', 'compare_size']);
62 | };
63 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014 Simon Waldherr
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PullToRefresh
2 |
3 |
4 |
5 | a JavaScript implementation of PullToRefresh **without jQuery or other Frameworks** and under the **MIT-License**
6 |
7 | ## about
8 |
9 | License: MIT
10 | Version: 0.1.2
11 | Date: 11.2014
12 |
13 | ## howto
14 |
15 | take a look at the index.html file and use it as a reference on how to integrate PullToRefresh into your project.
16 |
17 | ## demo
18 |
19 | scan this QR-Code with your iPhone to open the PullToRefresh example
20 |
21 |
22 | ## contact
23 |
24 | Feel free to contact me via [eMail](mailto:contact@simonwaldherr.de) or on [Twitter](http://twitter.com/simonwaldherr). This software will be continually developed. Suggestions and tips are always welcome.
25 |
--------------------------------------------------------------------------------
/apple-touch-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SimonWaldherr/PullToRefresh/0b9e913474662736a527831e13a670b5c86249bb/apple-touch-icon-precomposed.png
--------------------------------------------------------------------------------
/demo.css:
--------------------------------------------------------------------------------
1 | body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;}header,footer{text-align:center}header{position:fixed;right:0;left:0;z-index:10;height:44px;padding:5px;box-sizing:border-box;top:0;display:block;background-color:#1eb0e9;background-image:-webkit-linear-gradient(top,#1eb0e9 0,#109adc 100%);background-image:linear-gradient(to bottom,#1eb0e9 0,#109adc 100%);border-bottom:1px solid #0e5895;box-shadow:inset 0 1px 1px -1px rgba(255,255,255,.8);-webkit-box-orient:horizontal;box-orient:horizontal;}h1{position:absolute;top:0;left:0;display:block;width:100%;font-size:30px;font-weight:bold;line-height:0px;color:#fff;text-align:center;text-shadow:0 -1px rgba(0,0,0,.5);white-space:nowrap;font-family:"Helvetica Neue",sans-serif;}.notouch header p{padding:0.5em 3em}.touch{padding-bottom:30px}.touch .content > li.error,.touch .content > li.error{display:none}#demo-window{position:absolute;top:43px;left:0px;right:0px;bottom:50px;}footer{position:fixed;right:0;left:0;z-index:10;padding:5px;box-sizing:border-box;bottom:0;height:50px;padding:0;background-color:#393939;background-image:-webkit-linear-gradient(top,#393939 0,#2b2b2b 100%);background-image:linear-gradient(to bottom,#393939 0,#2b2b2b 100%);border-top:1px solid #000;border-bottom-width:0;box-shadow:inset 0 1px 1px -1px rgba(255,255,255,.6);}footer ul,footer ol{display:-webkit-box;display:box;list-style:none;-webkit-box-orient:horizontal;box-orient:horizontal;top:0px;bottom:0px;position:relative;height:300px;padding:0px;margin:0px;line-height:50px;}footer ul li,footer ol li{height:100%;text-align:center;box-sizing:border-box;-webkit-box-flex:1;box-flex:1;top:0px;bottom:0px;position:relative;}footer ul li a,footer ul li a:visited,footer ol li a,footer ol li a:visited{color:white;text-decoration:none;font-weight:bolder;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;}footer ul li:active,footer ol li:active,footer ul li.active,footer ol li.active{color:#3573ac;box-shadow:inset 0px 0px 13px 0px #000000;-webkit-box-shadow:inset 0px 0px 13px 0px #000000;}footer ul li.active a:visited,footer ol li.active a:visited,footer ul li.active a,footer ol li.active a{color:#2295ff}.content,.content{border-top:1px solid #0a0a0a;list-style-type:none;padding:0;margin:0;}.content > li,.content > li{border-bottom:1px solid #0a0a0a;color:#0A0A0A;font-size:80%;line-height:30px;padding:0 5px;}.content > li.error,.content > li.error{color:red;font-weight:bold;}.content > li,.content > li{border-bottom:initial;font-weight:bolder;line-height:40px;background:-moz-linear-gradient(top,#ffffff 0%,#f2f2f2 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ffffff),color-stop(100%,#f2f2f2));background:-webkit-linear-gradient(top,#ffffff 0%,#f2f2f2 100%);background:-o-linear-gradient(top,#ffffff 0%,#f2f2f2 100%);background:-ms-linear-gradient(top,#ffffff 0%,#f2f2f2 100%);background:linear-gradient(to bottom,#ffffff 0%,#f2f2f2 100%);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}.ptr_scrollable{position:absolute;top:0px;bottom:0px;height:auto;width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;}
2 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | PullToRefresh
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 |
116 |
124 |
125 |
126 |
156 |
157 |
158 |
--------------------------------------------------------------------------------
/index.min.html:
--------------------------------------------------------------------------------
1 | PullToRefresh
2 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pulltorefresh",
3 | "title": "PullToRefresh",
4 | "description": "a JavaScript implementation of PullToRefresh without jQuery or other Frameworks under MIT-License",
5 | "version": "0.1.2",
6 | "homepage": "https://github.com/SimonWaldherr/PullToRefresh",
7 | "author": {
8 | "name": "Simon Waldherr",
9 | "email": "contact@simonwaldherr.de",
10 | "url": "http://simon.waldherr.eu/"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/SimonWaldherr/PullToRefresh.git"
15 | },
16 | "bugs": {
17 | "url": "https://github.com/SimonWaldherr/PullToRefresh/issues"
18 | },
19 | "licenses": [
20 | {
21 | "type": "MIT",
22 | "url": "http://simon.waldherr.eu/license/mit/"
23 | }
24 | ],
25 | "dependencies": {},
26 | "devDependencies": {
27 | "grunt": ">= 0.4.1",
28 | "grunt-compare-size": ">= 0.0.0",
29 | "grunt-contrib-concat": ">= 0.3.0",
30 | "grunt-contrib-uglify": ">= 0.2.2",
31 | "grunt-contrib-cssmin": ">= 0.6.0",
32 | "gzip-js": ">= 0.3.1"
33 | },
34 | "keywords": [
35 | "webkit",
36 | "mobile",
37 | "scroll",
38 | "webapp",
39 | "css3",
40 | "html5"
41 | ]
42 | }
43 |
--------------------------------------------------------------------------------
/ptr.coffee:
--------------------------------------------------------------------------------
1 | # * * * * * * * *
2 | # * PullToRefresh *
3 | # * Version 0.1.2 *
4 | # * License: MIT *
5 | # * SimonWaldherr *
6 | # * * * * * * * *
7 |
8 | #jslint browser: true, indent: 2
9 |
10 | #global ActiveXObject
11 | ptr = []
12 | ptr_settings =
13 | mlang: "en"
14 | mode: "mail"
15 |
16 | ptr_messages =
17 | en:
18 | pulltorefresh: "Pull to refresh"
19 | loading: "Loading ..."
20 |
21 | de:
22 | pulltorefresh: "ziehen zum aktualisieren"
23 | loading: "laden ..."
24 |
25 | ptr_init = (language) ->
26 | "use strict"
27 | i = 0
28 | ptr_settings.mlang = language if language isnt `undefined`
29 | ptr.scrollable_parent = false
30 | ptr.scrollables = document.getElementsByClassName("ptr_scrollable")
31 | if (window.hasOwnProperty("ontouchstart")) or (window.navigator.msPointerEnabled)
32 | document.getElementsByTagName("body")[0].className += " touch"
33 | else
34 | document.getElementsByTagName("body")[0].className += " notouch"
35 | i = 0
36 | while i < ptr.scrollables.length
37 | if ptr.scrollables[i].hasAttribute("data-url") isnt false
38 | ptr.box = document.createElement("div")
39 | ptr.container = document.createElement("div")
40 | ptr.image = document.createElement("div")
41 | ptr.text = document.createElement("div")
42 | ptr.box.appendChild ptr.container
43 | ptr.container.appendChild ptr.image
44 | ptr.container.appendChild ptr.text
45 | ptr.text.innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh
46 | ptr.box.className = "ptr_box"
47 | ptr.box.style.right = "99%"
48 | ptr.container.className = "ptr_container"
49 | ptr.image.className = "ptr_image"
50 | ptr.text.className = "ptr_text"
51 | ptr.scrollables[i].firstElementChild.insertBefore ptr.box, ptr.scrollables[i].firstElementChild.firstChild
52 | i += 1
53 | document.addEventListener "touchstart", (e) ->
54 | parent = e.target
55 | return false if parent.className is `undefined`
56 | i = 0
57 | while i < 10
58 | if parent.className isnt `undefined`
59 | if parent.className.match("ptr_scrollable")
60 | ptr.scrollable_parent = i
61 | i = 10
62 | if parent.hasAttribute("data-url") isnt false
63 | if parent.getElementsByClassName("ptr_box")[0] is `undefined`
64 | ptr.box = document.createElement("div")
65 | ptr.container = document.createElement("div")
66 | ptr.image = document.createElement("div")
67 | ptr.text = document.createElement("div")
68 | ptr.box.appendChild ptr.container
69 | ptr.container.appendChild ptr.image
70 | ptr.container.appendChild ptr.text
71 | ptr.text.innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh
72 | ptr.box.className = "ptr_box"
73 | ptr.box.style.right = "99%"
74 | ptr.container.className = "ptr_container"
75 | ptr.image.className = "ptr_image"
76 | ptr.text.className = "ptr_text"
77 | parent.firstElementChild.insertBefore ptr.box, parent.firstElementChild.firstChild
78 | else
79 | parent.getElementsByClassName("ptr_box")[0].style.opacity = 1.0
80 | parent.getElementsByClassName("ptr_text")[0].innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh if parent.getElementsByClassName("ptr_text")[0].innerHTML isnt ptr_messages[ptr_settings.mlang].loading
81 | else parent.removeChild parent.getElementsByClassName("ptr_box")[0] if parent.getElementsByClassName("ptr_box")[0] isnt `undefined`
82 | if parent.scrollTop is 0
83 | parent.scrollTop = 1
84 | parent.getElementsByClassName("ptr_wrap")[0].style.top = "1px"
85 | else parent.scrollTop = parent.scrollTop - 1 if (parent.scrollTop + parent.offsetHeight) is parent.scrollHeight
86 | if parent.parentNode.tagName is `undefined`
87 | i = 10
88 | return false
89 | if (parent.parentNode.tagName is "BODY") or (parent.parentNode.tagName is "HTML")
90 | i = 10
91 | return false
92 | parent = parent.parentNode
93 | i += 1
94 | return
95 |
96 | document.addEventListener "touchmove", (e) ->
97 | parent = e.target
98 | scroll = false
99 | rotate = 90
100 | top = undefined
101 | time = undefined
102 | insert = undefined
103 | inserted = undefined
104 | ajax = undefined
105 | ajaxTimeout = undefined
106 | requrl = undefined
107 | if ptr.scrollable_parent is false
108 | e.preventDefault()
109 | return false
110 | i = 0
111 | while i < ptr.scrollable_parent
112 | parent = parent.parentNode
113 | i += 1
114 | if (ptr.scrollable_parent isnt false) and (parent.hasAttribute("data-url") isnt false)
115 | scroll = true
116 | ptr.element = parent
117 | ptr.wrapelement = ptr.element.getElementsByClassName("ptr_wrap")[0]
118 | top = ptr.element.scrollTop
119 | ptr.box = ptr.element.getElementsByClassName("ptr_box")[0]
120 | if (ptr.wrapelement.className.indexOf(" active") is -1) and (not ptr.wrapelement.getElementsByClassName("ptr_image")[0].className.match("ptr_loading")) and (ptr.element.scrollTop < 1)
121 | rotate = (if (top < -40) then -90 else 130 + parseInt(top * 12 + 270, 10)) if ptr.element.scrollTop < -25
122 | if ptr.element.scrollTop < 0
123 | ptr.box.style.right = "0px"
124 | ptr.wrapelement.getElementsByClassName("ptr_image")[0].style["-webkit-transform"] = "scale(1) rotate(" + rotate + "deg)"
125 | if ptr.element.scrollTop < -51
126 | if ptr.wrapelement.className.indexOf(" ptr_active") is -1
127 | ptr.box.style.right = "0px"
128 | ptr.wrapelement.className += " ptr_active"
129 | ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML = ptr_messages[ptr_settings.mlang].loading
130 | ptr.wrapelement.getElementsByClassName("ptr_image")[0].className += " ptr_loading"
131 | if parent.getAttribute("data-url") is "reload"
132 | window.location.reload true
133 | return false
134 | ptr.element = parent
135 | ptr.wrapelement = ptr.element.getElementsByClassName("ptr_wrap")[0]
136 | ptr.eleId = parent.id
137 | time = new Date()
138 | ajax = (if (window.ActiveXObject) then new ActiveXObject("Microsoft.XMLHTTP") else (XMLHttpRequest and new XMLHttpRequest()) or null)
139 | ajaxTimeout = window.setTimeout(->
140 | ajax.abort()
141 | ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML = ""
142 | ptr.wrapelement.className = ptr.wrapelement.className.replace(" ptr_active", "")
143 | ptr.wrapelement.style.top = "0px"
144 | ptr.box = document.getElementById(ptr.eleId).getElementsByClassName("ptr_box")[0]
145 | ptr.box.getElementsByClassName("ptr_image")[0].className = ptr.box.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading", "")
146 | return
147 | , 6000)
148 | ajax.onreadystatechange = ->
149 | if ajax.readyState is 4
150 | if ajax.status is 200
151 | clearTimeout ajaxTimeout
152 | if ajax.status isnt 200
153 | ptr.wrapelement.style.top = "0px"
154 | ptr.box.getElementsByClassName("ptr_image")[0].className = ptr.getElementsByClassName("ptr_image")[0].className.replace(" loading", "")
155 | ptr.wrapelement.className = ptr.wrapelement.className.replace(" ptr_active", "")
156 | else
157 | ptr.box = document.getElementById(ptr.eleId).getElementsByClassName("ptr_box")[0]
158 | insert = document.createElement("div")
159 | insert.innerHTML = ajax.responseText
160 | insert.className = "ptr_inserted"
161 | ptr.wrapelement.insertBefore insert, ptr.box.nextSibling
162 | ptr.wrapelement.style.top = "0px"
163 | ptr.box.getElementsByClassName("ptr_image")[0].className = ptr.box.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading", "")
164 | ptr.wrapelement.className = ptr.wrapelement.className.replace(" ptr_active", "")
165 | inserted = document.getElementsByClassName("ptr_inserted")[0]
166 | ptr.element.scrollTop = inserted.clientHeight - 51
167 | ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML = ""
168 | ptr.box.style.right = "99%"
169 | ptr.wrapelement.getElementsByClassName("ptr_image")[0].className = ptr.wrapelement.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading", "")
170 | ptr.scrollable_parent = false
171 | return
172 |
173 | requrl = parent.getAttribute("data-url") + "?rt=" + time.getTime()
174 | ajax.open "POST", requrl, true
175 | ajax.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
176 | ajax.send()
177 | else if ptr.element.scrollTop isnt 0
178 | if ptr.wrapelement.className.indexOf(" active") isnt -1
179 | ptr.wrapelement.className = ptr.wrapelement.className.replace(" ptr_active", "")
180 | ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh
181 | else scroll = true if ptr.scrollable_parent isnt false
182 | e.preventDefault() if scroll is false
183 | return
184 |
185 | document.addEventListener "touchend", (e) ->
186 | parent = e.target
187 | i = 0
188 | while i < ptr.scrollable_parent
189 | parent = parent.parentNode
190 | i += 1
191 | if (parent.hasAttribute("data-url") isnt false) and (ptr.scrollable_parent isnt false)
192 | if parent.hasAttribute("data-url") isnt false
193 | ptr.element = parent
194 | ptr.wrapelement = ptr.element.getElementsByClassName("ptr_wrap")[0]
195 | ptr.eleId = parent.id
196 | ptr.box = ptr.element.getElementsByClassName("ptr_box")[0]
197 | if ptr.wrapelement.getElementsByClassName("ptr_image")[0].className.match("ptr_loading")
198 | ptr.wrapelement.className = ptr.wrapelement.className.replace(" ptr_active", "")
199 | ptr.wrapelement.style.top = "51px"
200 | else
201 | ptr.box.style.right = "99%"
202 | ptr.scrollable_parent = false
203 | return
204 |
205 | return
--------------------------------------------------------------------------------
/ptr.css:
--------------------------------------------------------------------------------
1 | /*
2 | *
3 | * PullToRefresh
4 | * Version 0.1.2
5 | * License: MIT
6 | * SimonWaldherr
7 | *
8 | */
9 |
10 | .ptr_scrollable {
11 | overflow-y: auto;
12 | height: auto;
13 | -webkit-overflow-scrolling: touch;
14 | position: absolute;
15 | }
16 |
17 | .ptr_scrollable .ptr_wrap {
18 | min-height: 100%;
19 | padding-bottom: 1px;
20 | background: #f5f5f5;
21 | -webkit-transform: translateZ(0);
22 | -webkit-user-select: none;
23 | -moz-user-select: none;
24 | user-select: none;
25 | }
26 |
27 | .ptr_wrap {
28 | position: relative;
29 | }
30 |
31 | .ptr_box {
32 | position: absolute;
33 | top: -55px;
34 | line-height: 55px;
35 | display: block;
36 | text-align: center;
37 | height: 55px;
38 | left: 0px;
39 | right: 0px;
40 | overflow: hidden;
41 | }
42 |
43 | .ptr_container {
44 | position: relative;
45 | width: 230px;
46 | margin: auto;
47 | height: 40px;
48 | top: 10px;
49 | }
50 |
51 | .ptr_image {
52 | margin: 5px;
53 | margin-top: 20px;
54 | margin-left: 10px;
55 | margin-right: 10px;
56 | height: 30px;
57 | width: 40px;
58 | zoom: 0.5;
59 | background-image: url('data:image/png;base64,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');
60 | -webkit-background-size: 50% 100%;
61 | -moz-background-size: 50% 100%;
62 | background-size: 50% 100%;
63 | background-repeat: repeat-x;
64 | display: inline-block;
65 | background-position: left center;
66 | float: left;
67 | position: relative;
68 | bottom: 0px;
69 | -webkit-backface-visibility: hidden
70 | }
71 |
72 | .ptr_image.ptr_loading {
73 | margin-left: 15px;
74 | margin-right: 15px;
75 | height: 30px;
76 | width: 30px;
77 | background-image: url('data:image/png;base64,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');
78 | -webkit-background-size: 100% 100%;
79 | -moz-background-size: 100% 100%;
80 | background-size: 100% 100%;
81 | background-repeat: no-repeat;
82 | -webkit-animation-name: rotate;
83 | -webkit-animation-duration:0.5s;
84 | -webkit-animation-timing-function:linear;
85 | -webkit-animation-iteration-count:infinite;
86 | -webkit-animation-play-state:running;
87 | }
88 |
89 | .ptr_text {
90 | position: relative;
91 | top: -10px;
92 | left: 20px;
93 | float: left;
94 | font-size: 20px;
95 | }
96 |
97 | .ptr_inserted {
98 | border-top: 1px solid #0a0a0a;
99 | list-style-type: none;
100 | padding: 0;
101 | margin: 0;
102 | }
103 |
104 | .ptr_inserted ul {
105 | padding: 0px;
106 | margin: 0px;
107 | }
108 |
109 | @-webkit-keyframes rotate {
110 | from {
111 | -webkit-transform: rotate(0deg);
112 | }
113 | to {
114 | -webkit-transform: rotate(360deg);
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/ptr.js:
--------------------------------------------------------------------------------
1 | /* * * * * * * * *
2 | * PullToRefresh *
3 | * Version 0.1.2 *
4 | * License: MIT *
5 | * SimonWaldherr *
6 | * * * * * * * * */
7 |
8 | /*jslint browser: true, indent: 2 */
9 | /*global ActiveXObject */
10 |
11 | var ptr = [],
12 | ptr_settings = {mlang : 'en', mode : 'mail'},
13 | ptr_messages = {
14 | en : {pulltorefresh : 'Pull to refresh', 'loading' : 'Loading ...'},
15 | de : {pulltorefresh : 'ziehen zum aktualisieren', 'loading' : 'laden ...'}
16 | },
17 | ptr_init = function (language) {
18 | "use strict";
19 | var i = 0;
20 | if (language !== undefined) {
21 | ptr_settings.mlang = language;
22 | }
23 | ptr.scrollable_parent = false;
24 | ptr.scrollables = document.getElementsByClassName('ptr_scrollable');
25 | if ((window.hasOwnProperty('ontouchstart')) || (window.navigator.msPointerEnabled)) {
26 | document.getElementsByTagName('body')[0].className += ' touch';
27 | } else {
28 | document.getElementsByTagName('body')[0].className += ' notouch';
29 | }
30 |
31 | for (i = 0; i < ptr.scrollables.length; i += 1) {
32 | if (ptr.scrollables[i].hasAttribute('data-url') !== false) {
33 | ptr.box = document.createElement('div');
34 | ptr.container = document.createElement('div');
35 | ptr.image = document.createElement('div');
36 | ptr.text = document.createElement('div');
37 |
38 | ptr.box.appendChild(ptr.container);
39 | ptr.container.appendChild(ptr.image);
40 | ptr.container.appendChild(ptr.text);
41 | ptr.text.innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh;
42 |
43 | ptr.box.className = 'ptr_box';
44 | ptr.box.style.right = '99%';
45 | ptr.container.className = 'ptr_container';
46 | ptr.image.className = 'ptr_image';
47 | ptr.text.className = 'ptr_text';
48 |
49 | ptr.scrollables[i].firstElementChild.insertBefore(ptr.box, ptr.scrollables[i].firstElementChild.firstChild);
50 | }
51 | }
52 |
53 | document.addEventListener('touchstart', function (e) {
54 | var parent = e.target;
55 |
56 | if (parent.className === undefined) {
57 | return false;
58 | }
59 |
60 | for (i = 0; i < 10; i += 1) {
61 | if (parent.className !== undefined) {
62 |
63 | if (parent.className.match('ptr_scrollable')) {
64 |
65 | ptr.scrollable_parent = i;
66 | i = 10;
67 |
68 | if (parent.hasAttribute('data-url') !== false) {
69 | if (parent.getElementsByClassName('ptr_box')[0] === undefined) {
70 | ptr.box = document.createElement('div');
71 | ptr.container = document.createElement('div');
72 | ptr.image = document.createElement('div');
73 | ptr.text = document.createElement('div');
74 |
75 | ptr.box.appendChild(ptr.container);
76 | ptr.container.appendChild(ptr.image);
77 | ptr.container.appendChild(ptr.text);
78 | ptr.text.innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh;
79 |
80 | ptr.box.className = 'ptr_box';
81 | ptr.box.style.right = '99%';
82 | ptr.container.className = 'ptr_container';
83 | ptr.image.className = 'ptr_image';
84 | ptr.text.className = 'ptr_text';
85 |
86 | parent.firstElementChild.insertBefore(ptr.box, parent.firstElementChild.firstChild);
87 | } else {
88 | parent.getElementsByClassName('ptr_box')[0].style.opacity = 1.0;
89 | if (parent.getElementsByClassName('ptr_text')[0].innerHTML !== ptr_messages[ptr_settings.mlang].loading) {
90 | parent.getElementsByClassName('ptr_text')[0].innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh;
91 | }
92 | }
93 | } else if (parent.getElementsByClassName('ptr_box')[0] !== undefined) {
94 | parent.removeChild(parent.getElementsByClassName('ptr_box')[0]);
95 | }
96 |
97 | if (parent.scrollTop === 0) {
98 | parent.scrollTop = 1;
99 | parent.getElementsByClassName('ptr_wrap')[0].style.top = '1px';
100 | } else if ((parent.scrollTop + parent.offsetHeight) === parent.scrollHeight) {
101 | parent.scrollTop = parent.scrollTop - 1;
102 | }
103 | }
104 | }
105 |
106 | if ((parent.parentNode.tagName === undefined)) {
107 | i = 10;
108 | return false;
109 | }
110 | if ((parent.parentNode.tagName === 'BODY') || (parent.parentNode.tagName === 'HTML')) {
111 | i = 10;
112 | return false;
113 | }
114 |
115 | parent = parent.parentNode;
116 | }
117 | });
118 |
119 | document.addEventListener('touchmove', function (e) {
120 | var parent = e.target,
121 | scroll = false,
122 | rotate = 90,
123 | top,
124 | time,
125 | insert,
126 | inserted,
127 | ajax,
128 | ajaxTimeout,
129 | requrl;
130 |
131 | if (ptr.scrollable_parent === false) {
132 | e.preventDefault();
133 | return false;
134 | }
135 |
136 | for (i = 0; i < ptr.scrollable_parent; i += 1) {
137 | parent = parent.parentNode;
138 | }
139 |
140 | if ((ptr.scrollable_parent !== false) && (parent.hasAttribute('data-url') !== false)) {
141 | scroll = true;
142 | ptr.element = parent;
143 | ptr.wrapelement = ptr.element.getElementsByClassName('ptr_wrap')[0];
144 | top = ptr.element.scrollTop;
145 | ptr.box = ptr.element.getElementsByClassName('ptr_box')[0];
146 | if ((ptr.wrapelement.className.indexOf(' active') === -1) && (!ptr.wrapelement.getElementsByClassName('ptr_image')[0].className.match('ptr_loading')) && (ptr.element.scrollTop < 1)) {
147 | if (ptr.element.scrollTop < -25) {
148 | rotate = (top < -40) ? -90 : 130 + parseInt(top * 12 + 270, 10);
149 | }
150 |
151 | if (ptr.element.scrollTop < 0) {
152 | ptr.box.style.right = '0px';
153 | ptr.wrapelement.getElementsByClassName('ptr_image')[0].style['-webkit-transform'] = 'scale(1) rotate(' + rotate + 'deg)';
154 | }
155 |
156 | if (ptr.element.scrollTop < -51) {
157 | if (ptr.wrapelement.className.indexOf(' ptr_active') === -1) {
158 | ptr.box.style.right = '0px';
159 | ptr.wrapelement.className += ' ptr_active';
160 | ptr.wrapelement.getElementsByClassName('ptr_text')[0].innerHTML = ptr_messages[ptr_settings.mlang].loading;
161 | ptr.wrapelement.getElementsByClassName('ptr_image')[0].className += ' ptr_loading';
162 |
163 | if (parent.getAttribute('data-url') === 'reload') {
164 | window.location.reload(true);
165 | return false;
166 | }
167 |
168 | ptr.element = parent;
169 | ptr.wrapelement = ptr.element.getElementsByClassName('ptr_wrap')[0];
170 | ptr.eleId = parent.id;
171 | time = new Date();
172 |
173 | ajax = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : (XMLHttpRequest && new XMLHttpRequest()) || null;
174 | ajaxTimeout = window.setTimeout(function () {
175 | ajax.abort();
176 | ptr.wrapelement.getElementsByClassName('ptr_text')[0].innerHTML = '';
177 | ptr.wrapelement.className = ptr.wrapelement.className.replace(' ptr_active', '');
178 | ptr.wrapelement.style.top = '0px';
179 | ptr.box = document.getElementById(ptr.eleId).getElementsByClassName('ptr_box')[0];
180 | ptr.box.getElementsByClassName('ptr_image')[0].className = ptr.box.getElementsByClassName('ptr_image')[0].className.replace(' ptr_loading', '');
181 | }, 6000);
182 | ajax.onreadystatechange = function () {
183 |
184 | if (ajax.readyState === 4) {
185 | if (ajax.status === 200) {
186 | clearTimeout(ajaxTimeout);
187 | if (ajax.status !== 200) {
188 | ptr.wrapelement.style.top = '0px';
189 | ptr.box.getElementsByClassName('ptr_image')[0].className = ptr.getElementsByClassName('ptr_image')[0].className.replace(' loading', '');
190 | ptr.wrapelement.className = ptr.wrapelement.className.replace(' ptr_active', '');
191 | } else {
192 | ptr.box = document.getElementById(ptr.eleId).getElementsByClassName('ptr_box')[0];
193 | insert = document.createElement('div');
194 | insert.innerHTML = ajax.responseText;
195 | insert.className = 'ptr_inserted';
196 |
197 | ptr.wrapelement.insertBefore(insert, ptr.box.nextSibling);
198 | ptr.wrapelement.style.top = '0px';
199 | ptr.box.getElementsByClassName('ptr_image')[0].className = ptr.box.getElementsByClassName('ptr_image')[0].className.replace(' ptr_loading', '');
200 | ptr.wrapelement.className = ptr.wrapelement.className.replace(' ptr_active', '');
201 | inserted = document.getElementsByClassName('ptr_inserted')[0];
202 | ptr.element.scrollTop = inserted.clientHeight - 51;
203 | ptr.wrapelement.getElementsByClassName('ptr_text')[0].innerHTML = '';
204 | ptr.box.style.right = '99%';
205 |
206 | ptr.wrapelement.getElementsByClassName('ptr_image')[0].className = ptr.wrapelement.getElementsByClassName('ptr_image')[0].className.replace(' ptr_loading', '');
207 |
208 | ptr.scrollable_parent = false;
209 | }
210 | }
211 | }
212 | };
213 | requrl = parent.getAttribute('data-url') + '?rt=' + time.getTime();
214 | ajax.open("POST", requrl, true);
215 | ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
216 | ajax.send();
217 | }
218 | } else if (ptr.element.scrollTop !== 0) {
219 | if (ptr.wrapelement.className.indexOf(' active') !== -1) {
220 | ptr.wrapelement.className = ptr.wrapelement.className.replace(' ptr_active', '');
221 | ptr.wrapelement.getElementsByClassName('ptr_text')[0].innerHTML = ptr_messages[ptr_settings.mlang].pulltorefresh;
222 | }
223 | }
224 | }
225 | } else if ((ptr.scrollable_parent !== false)) {
226 | scroll = true;
227 | }
228 |
229 | if (scroll === false) {
230 | e.preventDefault();
231 | }
232 | });
233 |
234 | document.addEventListener('touchend', function (e) {
235 | var parent = e.target;
236 |
237 | for (i = 0; i < ptr.scrollable_parent; i += 1) {
238 | parent = parent.parentNode;
239 | }
240 |
241 | if ((parent.hasAttribute('data-url') !== false) && (ptr.scrollable_parent !== false)) {
242 | if ((parent.hasAttribute('data-url') !== false)) {
243 | ptr.element = parent;
244 | ptr.wrapelement = ptr.element.getElementsByClassName('ptr_wrap')[0];
245 | ptr.eleId = parent.id;
246 | ptr.box = ptr.element.getElementsByClassName('ptr_box')[0];
247 |
248 | if (ptr.wrapelement.getElementsByClassName('ptr_image')[0].className.match('ptr_loading')) {
249 | ptr.wrapelement.className = ptr.wrapelement.className.replace(' ptr_active', '');
250 | ptr.wrapelement.style.top = '51px';
251 | } else {
252 | ptr.box.style.right = '99%';
253 | }
254 | }
255 | }
256 |
257 | ptr.scrollable_parent = false;
258 | });
259 | };
260 |
--------------------------------------------------------------------------------
/ptr.min.css:
--------------------------------------------------------------------------------
1 | /* * * * * * * * *
2 | * PullToRefresh *
3 | * Version 0.1.2 *
4 | * License: MIT *
5 | * SimonWaldherr *
6 | * * * * * * * * */
7 |
8 |
9 | .ptr_scrollable{overflow-y:auto;height:auto;-webkit-overflow-scrolling:touch;position:absolute}.ptr_scrollable .ptr_wrap{min-height:100%;padding-bottom:1px;background:#f5f5f5;-webkit-transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.ptr_wrap{position:relative}.ptr_box{position:absolute;top:-55px;line-height:55px;display:block;text-align:center;height:55px;left:0;right:0;overflow:hidden}.ptr_container{position:relative;width:230px;margin:auto;height:40px;top:10px}.ptr_image{margin:5px;margin-top:20px;margin-left:10px;margin-right:10px;height:30px;width:40px;zoom:.5;background-image:url('data:image/png;base64,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');-webkit-background-size:50% 100%;-moz-background-size:50% 100%;background-size:50% 100%;background-repeat:repeat-x;display:inline-block;background-position:left center;float:left;position:relative;bottom:0;-webkit-backface-visibility:hidden}.ptr_image.ptr_loading{margin-left:15px;margin-right:15px;height:30px;width:30px;background-image:url('data:image/png;base64,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');-webkit-background-size:100% 100%;-moz-background-size:100% 100%;background-size:100% 100%;background-repeat:no-repeat;-webkit-animation-name:rotate;-webkit-animation-duration:.5s;-webkit-animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-webkit-animation-play-state:running}.ptr_text{position:relative;top:-10px;left:20px;float:left;font-size:20px}.ptr_inserted{border-top:1px solid #0a0a0a;list-style-type:none;padding:0;margin:0}.ptr_inserted ul{padding:0;margin:0}@-webkit-keyframes rotate{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}
--------------------------------------------------------------------------------
/ptr.min.js:
--------------------------------------------------------------------------------
1 | /* * * * * * * * *
2 | * PullToRefresh *
3 | * Version 0.1.2 *
4 | * License: MIT *
5 | * SimonWaldherr *
6 | * * * * * * * * */
7 |
8 | var ptr=[],ptr_settings={mlang:"en",mode:"mail"},ptr_messages={en:{pulltorefresh:"Pull to refresh",loading:"Loading ..."},de:{pulltorefresh:"ziehen zum aktualisieren",loading:"laden ..."}},ptr_init=function(a){"use strict";var b=0;for(void 0!==a&&(ptr_settings.mlang=a),ptr.scrollable_parent=!1,ptr.scrollables=document.getElementsByClassName("ptr_scrollable"),document.getElementsByTagName("body")[0].className+=window.hasOwnProperty("ontouchstart")||window.navigator.msPointerEnabled?" touch":" notouch",b=0;bb;b+=1){if(void 0!==c.className&&c.className.match("ptr_scrollable")&&(ptr.scrollable_parent=b,b=10,c.hasAttribute("data-url")!==!1?void 0===c.getElementsByClassName("ptr_box")[0]?(ptr.box=document.createElement("div"),ptr.container=document.createElement("div"),ptr.image=document.createElement("div"),ptr.text=document.createElement("div"),ptr.box.appendChild(ptr.container),ptr.container.appendChild(ptr.image),ptr.container.appendChild(ptr.text),ptr.text.innerHTML=ptr_messages[ptr_settings.mlang].pulltorefresh,ptr.box.className="ptr_box",ptr.box.style.right="99%",ptr.container.className="ptr_container",ptr.image.className="ptr_image",ptr.text.className="ptr_text",c.firstElementChild.insertBefore(ptr.box,c.firstElementChild.firstChild)):(c.getElementsByClassName("ptr_box")[0].style.opacity=1,c.getElementsByClassName("ptr_text")[0].innerHTML!==ptr_messages[ptr_settings.mlang].loading&&(c.getElementsByClassName("ptr_text")[0].innerHTML=ptr_messages[ptr_settings.mlang].pulltorefresh)):void 0!==c.getElementsByClassName("ptr_box")[0]&&c.removeChild(c.getElementsByClassName("ptr_box")[0]),0===c.scrollTop?(c.scrollTop=1,c.getElementsByClassName("ptr_wrap")[0].style.top="1px"):c.scrollTop+c.offsetHeight===c.scrollHeight&&(c.scrollTop=c.scrollTop-1)),void 0===c.parentNode.tagName)return b=10,!1;if("BODY"===c.parentNode.tagName||"HTML"===c.parentNode.tagName)return b=10,!1;c=c.parentNode}}),document.addEventListener("touchmove",function(a){var c,d,e,f,g,h,i,j=a.target,k=!1,l=90;if(ptr.scrollable_parent===!1)return a.preventDefault(),!1;for(b=0;bc?-90:130+parseInt(12*c+270,10)),ptr.element.scrollTop<0&&(ptr.box.style.right="0px",ptr.wrapelement.getElementsByClassName("ptr_image")[0].style["-webkit-transform"]="scale(1) rotate("+l+"deg)"),ptr.element.scrollTop<-51){if(-1===ptr.wrapelement.className.indexOf(" ptr_active")){if(ptr.box.style.right="0px",ptr.wrapelement.className+=" ptr_active",ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML=ptr_messages[ptr_settings.mlang].loading,ptr.wrapelement.getElementsByClassName("ptr_image")[0].className+=" ptr_loading","reload"===j.getAttribute("data-url"))return window.location.reload(!0),!1;ptr.element=j,ptr.wrapelement=ptr.element.getElementsByClassName("ptr_wrap")[0],ptr.eleId=j.id,d=new Date,g=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):XMLHttpRequest&&new XMLHttpRequest||null,h=window.setTimeout(function(){g.abort(),ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML="",ptr.wrapelement.className=ptr.wrapelement.className.replace(" ptr_active",""),ptr.wrapelement.style.top="0px",ptr.box=document.getElementById(ptr.eleId).getElementsByClassName("ptr_box")[0],ptr.box.getElementsByClassName("ptr_image")[0].className=ptr.box.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading","")},6e3),g.onreadystatechange=function(){4===g.readyState&&200===g.status&&(clearTimeout(h),200!==g.status?(ptr.wrapelement.style.top="0px",ptr.box.getElementsByClassName("ptr_image")[0].className=ptr.getElementsByClassName("ptr_image")[0].className.replace(" loading",""),ptr.wrapelement.className=ptr.wrapelement.className.replace(" ptr_active","")):(ptr.box=document.getElementById(ptr.eleId).getElementsByClassName("ptr_box")[0],e=document.createElement("div"),e.innerHTML=g.responseText,e.className="ptr_inserted",ptr.wrapelement.insertBefore(e,ptr.box.nextSibling),ptr.wrapelement.style.top="0px",ptr.box.getElementsByClassName("ptr_image")[0].className=ptr.box.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading",""),ptr.wrapelement.className=ptr.wrapelement.className.replace(" ptr_active",""),f=document.getElementsByClassName("ptr_inserted")[0],ptr.element.scrollTop=f.clientHeight-51,ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML="",ptr.box.style.right="99%",ptr.wrapelement.getElementsByClassName("ptr_image")[0].className=ptr.wrapelement.getElementsByClassName("ptr_image")[0].className.replace(" ptr_loading",""),ptr.scrollable_parent=!1))},i=j.getAttribute("data-url")+"?rt="+d.getTime(),g.open("POST",i,!0),g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.send()}}else 0!==ptr.element.scrollTop&&-1!==ptr.wrapelement.className.indexOf(" active")&&(ptr.wrapelement.className=ptr.wrapelement.className.replace(" ptr_active",""),ptr.wrapelement.getElementsByClassName("ptr_text")[0].innerHTML=ptr_messages[ptr_settings.mlang].pulltorefresh)}else ptr.scrollable_parent!==!1&&(k=!0);k===!1&&a.preventDefault()}),document.addEventListener("touchend",function(a){var c=a.target;for(b=0;b';
6 | while($i < $lines) {
7 | echo ''.md5(rand(111,99999).$i.$lines.$_GET['rt']).''."\n";
8 | time_nanosleep(0, 100000000);
9 | $i++;
10 | }
11 | echo '';
12 |
13 | ?>
--------------------------------------------------------------------------------
/random/html.php:
--------------------------------------------------------------------------------
1 | bold', 'code
', 'italic', 'div
', 'big', 'sup', 'sub', 'small', 'span', 'strong');
7 |
8 | echo '';
9 | while($i < $lines) {
10 | $htmlr = rand(0,9);
11 | echo '- '.$html[$htmlr].'
'."\n";
12 | time_nanosleep(0, 100000000);
13 | $i++;
14 | }
15 | echo '
';
16 |
17 | ?>
--------------------------------------------------------------------------------
/random/numbers.php:
--------------------------------------------------------------------------------
1 | ';
6 | while($i < $lines) {
7 | echo ''.rand(111,99999).$i.rand(111,99999).$lines.rand(111,99999).rand(111,99999).''."\n";
8 | time_nanosleep(0, 100000000);
9 | $i++;
10 | }
11 | echo '';
12 |
13 | ?>
--------------------------------------------------------------------------------