├── .gitignore ├── ErrorTracker.js ├── LICENSE ├── README.md ├── example ├── index.html ├── index.js ├── layout.css ├── libs │ ├── gesture.min.js │ ├── gesture.min.js.map │ ├── jquery-1.11.3.js │ ├── pointer.min.js │ └── pointer.min.js.map └── theme │ ├── css │ ├── font-awesome.css │ ├── main.css │ ├── theme.css │ └── topcoat-mobile-dark.css │ ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── sourcecodepro-regular-webfont.eot │ ├── sourcecodepro-regular-webfont.svg │ ├── sourcecodepro-regular-webfont.ttf │ ├── sourcecodepro-regular-webfont.woff │ ├── sourcesanspro-light-webfont.eot │ ├── sourcesanspro-light-webfont.svg │ ├── sourcesanspro-light-webfont.ttf │ ├── sourcesanspro-light-webfont.woff │ ├── sourcesanspro-regular-webfont.eot │ ├── sourcesanspro-regular-webfont.svg │ ├── sourcesanspro-regular-webfont.ttf │ ├── sourcesanspro-regular-webfont.woff │ ├── sourcesanspro-semibold-webfont.eot │ ├── sourcesanspro-semibold-webfont.svg │ ├── sourcesanspro-semibold-webfont.ttf │ └── sourcesanspro-semibold-webfont.woff │ └── img │ ├── hamburger_bw.svg │ ├── hamburger_dark.svg │ ├── hamburger_light.svg │ ├── search-bg.png │ ├── search-bg2x.png │ ├── search.svg │ ├── search_bw.svg │ ├── search_dark.svg │ └── search_light.svg ├── package.json ├── release ├── errortracker.min.js └── errortracker.min.js.map └── source └── ErrorTracker.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | nbproject/ 3 | .DS_Store 4 | .DS_STORE 5 | web.config 6 | /node_modules/ 7 | -------------------------------------------------------------------------------- /ErrorTracker.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | function ErrorTracker(){ 3 | var self = this; 4 | 5 | this.version = "1.0.0"; 6 | 7 | this.SENDERS = { 8 | window: "window", 9 | console: "console", 10 | xhr: "xhr", 11 | tracker: "tracker" 12 | }; 13 | 14 | 15 | this.EVENTS = { 16 | maxEventStackLength: 50, 17 | console: "console", 18 | xhr: "xhr", 19 | timer: "timer", 20 | listener: "custom EventListener", 21 | DOM: "DOM", 22 | DOMEventTypes: { 23 | _any:["load", "drop", "paste", "play", "pageshow", "hashchange"], 24 | button:["click", "dblclick"], 25 | input:["blur"], 26 | textarea:["blur"], 27 | form:["submit", "reset"] 28 | }, 29 | EventListenerEliminations: ["scroll", "wheel", "drag", "mousemove", "mouseover", "mouseout", "mouseleave", "mouseenter", 30 | "touchmove", "mousewheel", "input", "keydown", "keypress", "keyup"] 31 | }; 32 | 33 | this.eventStack = []; 34 | 35 | this.fault = function(error){ 36 | try { 37 | this.addError(this.SENDERS.tracker, error); 38 | } catch (e){} 39 | }; 40 | 41 | this.addError = function(sender, error){ 42 | error.sender = sender; 43 | error.timestamp = this.isoNow(); 44 | error.sessionID = this.sessionID; 45 | error.eventsStack = this.eventStack; 46 | if(window.performance && window.performance.memory){ 47 | error.memoryInfo = window.performance.memory; 48 | } 49 | this.onError(this.serializeError(error)); 50 | }; 51 | 52 | this.scheduleEvent = function(eventSender, info){ 53 | info.eventSender = eventSender; 54 | info.time = this.isoNow(); 55 | this.eventStack.push(info); 56 | if(this.eventStack.length > this.EVENTS.maxEventStackLength){ 57 | this.eventStack.shift(); 58 | } 59 | }; 60 | 61 | this.wrapGlobalErrors = function(){ 62 | window.onerror = function(errMsg, url, line, column, error){ 63 | try { 64 | error = error || {}; 65 | error.message = error.message || self.serialize(errMsg); 66 | error.file = error.file || self.serialize(url); 67 | error.line = error.line || (parseInt(line, 10) || null); 68 | error.column = error.column || (parseInt(column, 10) || null); 69 | self.addError(self.SENDERS.window, error); 70 | } catch (e) { 71 | self.fault(e); 72 | } 73 | }; 74 | }; 75 | 76 | this.wrapConsole = function(){ 77 | var i, level, logLevels = ["log", "debug", "info", "warn", "error"]; 78 | for(i = logLevels.length - 1; i >= 0; i--){ 79 | level = logLevels[i]; 80 | if(this.hasMethod(console, level)) { 81 | (function(level){ 82 | var original = console[level]; 83 | console[level] = function (txt) { 84 | try { 85 | original.apply(this, arguments); 86 | if (level === "error") { 87 | self.addError(self.SENDERS.console, new Error(arguments[0])); 88 | } else { 89 | self.scheduleEvent(self.EVENTS.console, {level:level, args:self.serialize(arguments)}); 90 | } 91 | } catch (e){ 92 | self.fault(e); 93 | } 94 | } 95 | })(level); 96 | } 97 | } 98 | }; 99 | 100 | this.wrapNetwork = function(){ 101 | var origSend = XMLHttpRequest.prototype.send, 102 | origOpen = XMLHttpRequest.prototype.open; 103 | 104 | function finalize(xhr) { 105 | if (xhr.errorTrackingInfo) { 106 | xhr.errorTrackingInfo.statusCode = xhr.status == 1223 ? 204 : xhr.status; 107 | xhr.errorTrackingInfo.statusText = xhr.status == 1223 ? "No Content" : xhr.statusText; 108 | self.scheduleEvent(self.EVENTS.xhr, xhr.errorTrackingInfo); 109 | } 110 | } 111 | 112 | function checkFault(xhr) { 113 | if (xhr.errorTrackingInfo && xhr.status >= 400 && xhr.status != 1223) { 114 | self.addError(self.SENDERS.xhr, {status: xhr.status, statusText: xhr.statusText, method: xhr.errorTrackingInfo.method, url: xhr.errorTrackingInfo.url}); 115 | } 116 | } 117 | 118 | function completionListener(xhr){ 119 | if (window.ProgressEvent) { 120 | if (xhr.addEventListener) { 121 | xhr.addEventListener("readystatechange", function() { 122 | if (xhr.readyState === 4) { 123 | finalize(xhr); 124 | } 125 | }, true); 126 | } 127 | } 128 | if (xhr.addEventListener) { 129 | xhr.addEventListener("load", function() { 130 | finalize(xhr); 131 | checkFault(xhr); 132 | }, true); 133 | } else { 134 | setTimeout(function() { 135 | try { 136 | var origOnLoad = xhr.onload, 137 | origOnError = xhr.onerror; 138 | 139 | xhr.onload = function() { 140 | finalize(xhr); 141 | checkFault(xhr); 142 | if (typeof origOnLoad === "function") { 143 | origOnLoad.apply(xhr, arguments); 144 | } 145 | }; 146 | 147 | xhr.onerror = function() { 148 | finalize(xhr); 149 | checkFault(xhr); 150 | if ("function" === typeof origOnError) { 151 | origOnError.apply(xhr, arguments); 152 | } 153 | }; 154 | } catch (e) { 155 | self.fault(e); 156 | } 157 | }, 0); 158 | } 159 | } 160 | 161 | XMLHttpRequest.prototype.open = function(method, url) { 162 | if (url.indexOf("localhost:0") < 0) { 163 | this.errorTrackingInfo = { 164 | method : method, 165 | url : url 166 | }; 167 | } 168 | return origOpen.apply(this, arguments); 169 | }; 170 | 171 | XMLHttpRequest.prototype.send = function() { 172 | if(this.errorTrackingInfo) { 173 | try { 174 | this.errorTrackingInfo.sendTime = self.isoNow(); 175 | completionListener(this); 176 | } catch (e) { 177 | self.fault(e); 178 | } 179 | } 180 | return origSend.apply(this, arguments); 181 | }; 182 | }; 183 | 184 | this.wrapTimers = function(){ 185 | function wrap(func){ 186 | var original = window[func]; 187 | window[func] = function(){ 188 | try{ 189 | self.scheduleEvent(self.EVENTS.timer, { 190 | type: func, 191 | params: self.serialize(Array.prototype.slice.call(arguments, 1)) 192 | }) 193 | } catch (e){ 194 | self.fault(e); 195 | } 196 | original.apply(this, arguments); 197 | }; 198 | 199 | } 200 | wrap("setTimeout"); 201 | wrap("setInterval"); 202 | }; 203 | 204 | this.wrapDOMEvents = function(){ 205 | var i, eventName, keys = Object.keys(this.EVENTS.DOMEventTypes), allEvents = []; 206 | 207 | for(i = 0; i < keys.length; i++){ 208 | allEvents = allEvents.concat(this.EVENTS.DOMEventTypes[keys[i]]); 209 | } 210 | allEvents = this.arrayUnique(allEvents); 211 | 212 | for(i = allEvents.length - 1; i >= 0; i--) { 213 | eventName = allEvents[i]; 214 | (function(eventName) { 215 | document.addEventListener(eventName, function (event) { 216 | var element, availableEvents; 217 | try { 218 | element = self.elementForEvent(event); 219 | if(element) { 220 | availableEvents = self.EVENTS.DOMEventTypes[element.tagName.toLowerCase()]; 221 | availableEvents = availableEvents.concat(self.EVENTS.DOMEventTypes._any); 222 | if (availableEvents && self.arrayContains(availableEvents, event.type)) { 223 | self.scheduleEvent(self.EVENTS.DOM, { 224 | target: self.serializeElement(element), 225 | type: event.type 226 | }); 227 | } 228 | } 229 | } catch (e){ 230 | self.fault(e); 231 | } 232 | }, true); 233 | })(eventName) 234 | } 235 | }; 236 | 237 | this.wrapCustomEventListeners = function(){ 238 | function wrap(object, funcName){ 239 | var original = object[funcName]; 240 | object[funcName] = function(){ 241 | var listener; 242 | try { 243 | if(arguments.length > 0 && !self.arrayContains(self.EVENTS.EventListenerEliminations, arguments[0])){ 244 | listener = arguments[1]; 245 | if (typeof listener === "function") { 246 | arguments[1] = function (event) { 247 | listener.apply(this, arguments); 248 | self.scheduleEvent(self.EVENTS.listener, { 249 | target: self.serializeElement(self.elementForEvent(event)), 250 | type: event.type 251 | }); 252 | } 253 | } 254 | } 255 | } catch (e) { 256 | self.fault(e); 257 | } 258 | original.apply(this, arguments); 259 | }; 260 | } 261 | 262 | wrap(Element.prototype, "addEventListener"); 263 | }; 264 | 265 | this.elementForEvent = function(event){ 266 | return event.target || document.elementFromPoint(event.clientX, event.clientY); 267 | }; 268 | 269 | this.serializeError = function(error){ 270 | var stack = error.stack || error.stacktrace; 271 | if(stack){ 272 | error._stack = stack; 273 | } 274 | return JSON.stringify(error, null, 4); 275 | }; 276 | 277 | this.serialize = function(obj) { 278 | var result = ""; 279 | if (typeof obj === "undefined") { 280 | return "undefined"; 281 | } 282 | try { 283 | result = String(obj); 284 | if(result === "[object Object]" || result === "[object Arguments]"){ 285 | result = JSON.stringify(obj); 286 | } 287 | } catch (e) {} 288 | return result; 289 | }; 290 | 291 | this.serializeElement = function(element){ 292 | var result; 293 | 294 | function getElementAttributes(el) { 295 | var i, attrs = {}; 296 | for (i = 0; i < el.attributes.length; i++) { 297 | if (el.attributes[i].name.toLowerCase() !== "value") { 298 | attrs[el.attributes[i].name] = el.attributes[i].value; 299 | } 300 | } 301 | return attrs; 302 | } 303 | 304 | function serializeValue(data) { 305 | if(typeof data === "string") { 306 | if (data == "") { 307 | return ""; 308 | } 309 | if (/^[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(data)) { 310 | return "email"; 311 | } 312 | if (/^(\d{4}[\/\-](0?[1-9]|1[012])[\/\-]0?[1-9]|[12][0-9]|3[01])$/.test(data)) { 313 | return "date"; 314 | } 315 | if (/^\s*$/.test(data)) { 316 | return "whitespace"; 317 | } 318 | if (/^\d*$/.test(data)) { 319 | return "numeric"; 320 | } 321 | if (/^[a-zA-Z]*$/.test(data)) { 322 | return "alpha"; 323 | } 324 | if (/^[a-zA-Z0-9]*$/.test(data)) { 325 | return "alphanumeric"; 326 | } 327 | return "characters"; 328 | } else { 329 | return self.serialize(data); 330 | } 331 | } 332 | 333 | function getSelectValue(element){ 334 | var i; 335 | if (element.multiple) { 336 | for (i = 0; i < element.options.length; i++) { 337 | if (element.options[i].selected) { 338 | return element.options[i].value; 339 | } 340 | } 341 | } else { 342 | if (element.selectedIndex >= 0) { 343 | if (element.options[element.selectedIndex]) { 344 | return element.options[element.selectedIndex].value; 345 | } 346 | } 347 | } 348 | return null 349 | } 350 | 351 | if(element){ 352 | result = { 353 | tag: element.tagName.toLowerCase(), 354 | attributes: getElementAttributes(element) 355 | }; 356 | if(result.tag === "select"){ 357 | result.value = getSelectValue(element); 358 | } else if(element.hasOwnProperty('value')){ 359 | result.value = serializeValue(element.value); 360 | } 361 | if(result.tag !== "input" && result.tag !== "textarea") { 362 | if (element.textContent) { 363 | result.text = element.textContent; 364 | } else if (element.innerText) { 365 | result.text = element.innerText; 366 | } 367 | } 368 | return result; 369 | } 370 | return null; 371 | }; 372 | 373 | this.createGUID = function() { 374 | function s4() { 375 | return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); 376 | } 377 | return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 378 | s4() + '-' + s4() + s4() + s4(); 379 | }; 380 | 381 | this.isoNow = function(){ 382 | function getISO(date){ 383 | function pad(number) { 384 | if (number < 10) { 385 | return '0' + number; 386 | } 387 | return number; 388 | } 389 | 390 | return date.getUTCFullYear() + 391 | '-' + pad(date.getUTCMonth() + 1) + 392 | '-' + pad(date.getUTCDate()) + 393 | 'T' + pad(date.getUTCHours()) + 394 | ':' + pad(date.getUTCMinutes()) + 395 | ':' + pad(date.getUTCSeconds()) + 396 | '.' + (date.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 397 | 'Z'; 398 | } 399 | 400 | var date = new Date; 401 | return date.toISOString ? date.toISOString() : getISO(date); 402 | }; 403 | 404 | this.hasMethod = function(obj, method) { 405 | try { 406 | return typeof obj[method] === "function" && !!obj[method]; 407 | } catch (e) { 408 | return false; 409 | } 410 | }; 411 | 412 | this.arrayUnique = function(array) { 413 | var a = array.concat(); 414 | for(var i=0; i 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |

Error Tracker Example

17 |
18 |
19 |
20 |
21 |
22 | Open console for view results 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 | 40 |
41 |
42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | var errorTracker = new ErrorTracker({ 2 | url: "https://httpbin.org/post", 3 | allowConsoleLogEvent: true, 4 | allowTimerLogEvent: false, 5 | onError: function(serializedError){ 6 | console.log(serializedError); 7 | } 8 | }); 9 | 10 | var blockText = document.getElementById("blockText"), 11 | main = document.getElementById("main"), 12 | eventMessage = document.getElementById("eventMessage"); 13 | var pointer = new PointerTracker(main), 14 | gesture = new GestureTracker(main); 15 | main.addEventListener(gesture.GESTURE_EVENTS.tap, 16 | function (event) { 17 | switch (event.target.id) { 18 | case 'customEventButton': 19 | errorTracker.addCustomEvent({message: eventMessage.value}); 20 | eventMessage.value = ""; 21 | break; 22 | case 'addBlockButton': 23 | errorTracker.createNewEventBlock(blockText.value); 24 | blockText.value = ""; 25 | break; 26 | case 'clearLogButton': 27 | errorTracker.clearLog(); 28 | break; 29 | case 'printButton': 30 | errorTracker.printLog(); 31 | break; 32 | case 'launchButton': 33 | setTimeout(function () { 34 | $.ajax({ 35 | url: 'index.html', 36 | success: function () { 37 | foo(); //call nonexistent function to raise exception 38 | } 39 | }); 40 | }); 41 | break; 42 | } 43 | } 44 | ); 45 | -------------------------------------------------------------------------------- /example/layout.css: -------------------------------------------------------------------------------- 1 | .topcoat-button{ 2 | min-width: 200px; 3 | } 4 | -------------------------------------------------------------------------------- /example/libs/gesture.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"function"==typeof define&&define.amd?define(function(){return t.GestureTracker=e()}):"object"==typeof module&&module.exports?module.exports=t.GestureTracker=e():t.GestureTracker=e()}(this,function(){function t(t){function e(){return"devicePixelRatio"in window?window.devicePixelRatio:1}function i(t){return t.addEventListener||t.attachEvent}function n(t){return t.removeEventListener||t.detachEvent}function r(t){var e=i(document),r=n(document),s=document.addEventListener?"DOMContentLoaded":"onreadystatechange";e.call(document,s,function(){r.call(document,s,arguments.callee,!1),t()},!1)}var s,o=!1,a=this;this._el=t,this.version="1.0.0",this.MOVE_LIMIT=10;for(s in this.TRACK_EVENTS)this._el.addEventListener(this.TRACK_EVENTS[s],this,!1),i(this._el).call(this._el,this.TRACK_EVENTS[s],this,!1);this.setDoubleGuardState=function(t){o=t},this.getDoubleGuardState=function(){return o},this.destroy=function(){for(s in this.TRACK_EVENTS)this.TRACK_EVENTS.hasOwnProperty(s)&&n(this._el).call(this._el,this.TRACK_EVENTS[s],this);this._el=null},r(function(){var t,i,n=document.createElement("div");n.style.position="absolute",n.style.height="1in",n.style.width="1in",n.style.top="-100%",n.style.left="-100%",document.body.appendChild(n),t=n.offsetHeight,document.body.removeChild(n),i=t*e()*screen.pixelDepth/24,a.MOVE_LIMIT=i/6})}return t.prototype={DOUBLE_TAP_TIMEOUT:300,HOLD_TIMEOUT:350,GESTURE_EVENTS:{hold:"hold",fling:"fling",longtap:"longtap",tap:"tap",doubletap:"doubletap"},TRACK_EVENTS:{up:"pointerup",down:"pointerdown",move:"pointermove",over:"pointerover",cancel:"pointercancel"},tracks:{},firstDownTime:0,handleEvent:function(t){switch(t.type){case this.TRACK_EVENTS.down:this._pointerDown(t);break;case this.TRACK_EVENTS.move:this._pointerMove(t);break;case this.TRACK_EVENTS.cancel:case this.TRACK_EVENTS.up:this._pointerUp(t)}},_pointerDown:function(t){var e=this;clearTimeout(this._holdID),this._holdID=setTimeout(function(){e._fireEvent(this.GESTURE_EVENTS.hold,t)}.bind(this),this.HOLD_TIMEOUT),this.tracks[t.pointerId]={start:{clientX:t.clientX,clientY:t.clientY,timeStamp:t.timeStamp},pre:{clientX:t.clientX,clientY:t.clientY,timeStamp:t.timeStamp},last:{clientX:t.clientX,clientY:t.clientY,timeStamp:t.timeStamp},end:{clientX:t.clientX,clientY:t.clientY,timeStamp:t.timeStamp}}},_pointerMove:function(t){var e,i;this.tracks&&this.tracks[t.pointerId]&&t.timeStamp-this.tracks[t.pointerId].last.timeStamp>10&&(e=this.tracks[t.pointerId].last.clientX-this.tracks[t.pointerId].pre.clientX>this.MOVE_LIMIT,i=this.tracks[t.pointerId].last.clientY-this.tracks[t.pointerId].pre.clientY>this.MOVE_LIMIT,(e||i)&&clearTimeout(this._holdID),this.tracks[t.pointerId].pre.clientX=this.tracks[t.pointerId].last.clientX,this.tracks[t.pointerId].pre.clientY=this.tracks[t.pointerId].last.clientY,this.tracks[t.pointerId].pre.timeStamp=this.tracks[t.pointerId].last.timeStamp,this.tracks[t.pointerId].last.clientX=t.clientX,this.tracks[t.pointerId].last.clientY=t.clientY,this.tracks[t.pointerId].last.timeStamp=t.timeStamp)},_pointerUp:function(t){clearTimeout(this._holdID),this.tracks&&this.tracks[t.pointerId]&&(this.tracks[t.pointerId].end.clientX=t.clientX,this.tracks[t.pointerId].end.clientY=t.clientY,this.tracks[t.pointerId].end.timeStamp=t.timeStamp,this._checkGesture(t),this.tracks[t.pointerId]=null)},_checkGesture:function(t){function e(t,e,i,n){return Math.pow((e-t)*(e-t)+(n-i)*(n-i),.5)}var i,n,r=t.pointerId,s=this.tracks[r];i=Math.abs(e(s.start.clientX,s.end.clientX,s.start.clientY,s.end.clientY))>20,n=Math.abs(e(s.end.clientX,s.pre.clientX,s.end.clientY,s.pre.clientY))>0&&s.end.timeStamp-s.start.timeStamp>50,n?this._fireEvent(this.GESTURE_EVENTS.fling,t,{start:s.start,end:s.end,speedX:(s.end.clientX-s.pre.clientX)/(s.end.timeStamp-s.pre.timeStamp),speedY:(s.end.clientY-s.pre.clientY)/(s.end.timeStamp-s.pre.timeStamp)}):i||(s.end.timeStamp-s.start.timeStamp>300?this._fireEvent(this.GESTURE_EVENTS.longtap,t):t.timeStamp-this.firstDownTime1)return!1;a=i.touches[0],this.touchID=i.touches[0].identifier}else{for(s=0,r=i.changedTouches.length;r>s&&(a=i.changedTouches[s],a.identifier!==this.touchID);s++);if(a.identifier!==this.touchID)return!1}else this.touchID=1;if(h=document.createEvent("MouseEvents"),h.initMouseEvent(e,n,o,window,1,a.screenX,a.screenY,a.clientX,a.clientY,i.ctrlKey,i.altKey,i.shiftKey,i.metaKey,i.button,i.relatedTarget),h.preventDefault=function(){void 0!==i.preventDefault&&i.preventDefault()},void 0!==h.stopPropagation){var v=h.stopPropagation;h.stopPropagation=function(){void 0!==i.stopPropagation&&i.stopPropagation(),v.call(this)}}return h.pointerId=this.touchID,h.pointerType=this.isTouched?"touch":"mouse",h.isPrimary=!0,h.__defineGetter__&&h.__defineGetter__("timeStamp",function(){return i.timeStamp}),i.target.dispatchEvent(h),!0}},"undefined"!=typeof exports&&(exports.module=e),e}); 2 | //# sourceMappingURL=pointer.min.js.map -------------------------------------------------------------------------------- /example/libs/pointer.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"pointer.min.js","sources":["source/pointer.js"],"names":["root","factory","define","amd","PointerTracker","module","exports","this","element","_moveHoverState","version","_el","isDown","chancelId","setMoveHoverState","moveHoverState","getMoveHoverState","window","navigator","msPointerEnabled","self","eventHandlerIE","e","handleEventIE","eventHandler","handleEvent","pointerEnabled","addEventListener","STRINGS","pointerDown","pointerMove","pointerUp","pointerOut","pointerLeave","pointerEnter","pointerOver","pointerCancel","isTouched","touchstart","touchend","touchmove","touchcancel","mousedown","mouseup","mousemove","mouseout","mouseover","mouseleave","mouseenter","destroy","removeEventListener","MSPointerEvent","PointerEvent","prototype","EVENTS","up","down","move","over","cancel","out","leave","enter","isPointerHoverEventReceived","isPrimary","type","stopImmediatePropagation","stopPropagation","preventDefault","clearTimeout","_fireEvent","pointerTracker","setTimeout","canBubble","canCelable","arguments","length","i","l","customEvent","touchEvent","touchID","pointerId","touches","identifier","changedTouches","document","createEvent","initMouseEvent","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","undefined","current","call","pointerType","__defineGetter__","timeStamp","target","dispatchEvent"],"mappings":"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"} -------------------------------------------------------------------------------- /example/theme/css/font-awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | /* FONT PATH 6 | * -------------------------- */ 7 | @font-face { 8 | font-family: 'FontAwesome'; 9 | src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); 10 | src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | .fa { 15 | display: inline-block; 16 | font-family: FontAwesome; 17 | font-style: normal; 18 | font-weight: normal; 19 | line-height: 1; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | } 23 | /* makes the font 33% larger relative to the icon container */ 24 | .fa-lg { 25 | font-size: 1.3333333333333333em; 26 | line-height: 0.75em; 27 | vertical-align: -15%; 28 | } 29 | .fa-2x { 30 | font-size: 2em; 31 | } 32 | .fa-3x { 33 | font-size: 3em; 34 | } 35 | .fa-4x { 36 | font-size: 4em; 37 | } 38 | .fa-5x { 39 | font-size: 5em; 40 | } 41 | .fa-fw { 42 | width: 1.2857142857142858em; 43 | text-align: center; 44 | } 45 | .fa-ul { 46 | padding-left: 0; 47 | margin-left: 2.142857142857143em; 48 | list-style-type: none; 49 | } 50 | .fa-ul > li { 51 | position: relative; 52 | } 53 | .fa-li { 54 | position: absolute; 55 | left: -2.142857142857143em; 56 | width: 2.142857142857143em; 57 | top: 0.14285714285714285em; 58 | text-align: center; 59 | } 60 | .fa-li.fa-lg { 61 | left: -1.8571428571428572em; 62 | } 63 | .fa-border { 64 | padding: .2em .25em .15em; 65 | border: solid 0.08em #eeeeee; 66 | border-radius: .1em; 67 | } 68 | .pull-right { 69 | float: right; 70 | } 71 | .pull-left { 72 | float: left; 73 | } 74 | .fa.pull-left { 75 | margin-right: .3em; 76 | } 77 | .fa.pull-right { 78 | margin-left: .3em; 79 | } 80 | .fa-spin { 81 | -webkit-animation: spin 2s infinite linear; 82 | -moz-animation: spin 2s infinite linear; 83 | -o-animation: spin 2s infinite linear; 84 | animation: spin 2s infinite linear; 85 | } 86 | @-moz-keyframes spin { 87 | 0% { 88 | -moz-transform: rotate(0deg); 89 | } 90 | 100% { 91 | -moz-transform: rotate(359deg); 92 | } 93 | } 94 | @-webkit-keyframes spin { 95 | 0% { 96 | -webkit-transform: rotate(0deg); 97 | } 98 | 100% { 99 | -webkit-transform: rotate(359deg); 100 | } 101 | } 102 | @-o-keyframes spin { 103 | 0% { 104 | -o-transform: rotate(0deg); 105 | } 106 | 100% { 107 | -o-transform: rotate(359deg); 108 | } 109 | } 110 | @-ms-keyframes spin { 111 | 0% { 112 | -ms-transform: rotate(0deg); 113 | } 114 | 100% { 115 | -ms-transform: rotate(359deg); 116 | } 117 | } 118 | @keyframes spin { 119 | 0% { 120 | transform: rotate(0deg); 121 | } 122 | 100% { 123 | transform: rotate(359deg); 124 | } 125 | } 126 | .fa-rotate-90 { 127 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 128 | -webkit-transform: rotate(90deg); 129 | -moz-transform: rotate(90deg); 130 | -ms-transform: rotate(90deg); 131 | -o-transform: rotate(90deg); 132 | transform: rotate(90deg); 133 | } 134 | .fa-rotate-180 { 135 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 136 | -webkit-transform: rotate(180deg); 137 | -moz-transform: rotate(180deg); 138 | -ms-transform: rotate(180deg); 139 | -o-transform: rotate(180deg); 140 | transform: rotate(180deg); 141 | } 142 | .fa-rotate-270 { 143 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 144 | -webkit-transform: rotate(270deg); 145 | -moz-transform: rotate(270deg); 146 | -ms-transform: rotate(270deg); 147 | -o-transform: rotate(270deg); 148 | transform: rotate(270deg); 149 | } 150 | .fa-flip-horizontal { 151 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); 152 | -webkit-transform: scale(-1, 1); 153 | -moz-transform: scale(-1, 1); 154 | -ms-transform: scale(-1, 1); 155 | -o-transform: scale(-1, 1); 156 | transform: scale(-1, 1); 157 | } 158 | .fa-flip-vertical { 159 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); 160 | -webkit-transform: scale(1, -1); 161 | -moz-transform: scale(1, -1); 162 | -ms-transform: scale(1, -1); 163 | -o-transform: scale(1, -1); 164 | transform: scale(1, -1); 165 | } 166 | .fa-stack { 167 | position: relative; 168 | display: inline-block; 169 | width: 2em; 170 | height: 2em; 171 | line-height: 2em; 172 | vertical-align: middle; 173 | } 174 | .fa-stack-1x, 175 | .fa-stack-2x { 176 | position: absolute; 177 | left: 0; 178 | width: 100%; 179 | text-align: center; 180 | } 181 | .fa-stack-1x { 182 | line-height: inherit; 183 | } 184 | .fa-stack-2x { 185 | font-size: 2em; 186 | } 187 | .fa-inverse { 188 | color: #ffffff; 189 | } 190 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 191 | readers do not read off random characters that represent icons */ 192 | .fa-glass:before { 193 | content: "\f000"; 194 | } 195 | .fa-music:before { 196 | content: "\f001"; 197 | } 198 | .fa-search:before { 199 | content: "\f002"; 200 | } 201 | .fa-envelope-o:before { 202 | content: "\f003"; 203 | } 204 | .fa-heart:before { 205 | content: "\f004"; 206 | } 207 | .fa-star:before { 208 | content: "\f005"; 209 | } 210 | .fa-star-o:before { 211 | content: "\f006"; 212 | } 213 | .fa-user:before { 214 | content: "\f007"; 215 | } 216 | .fa-film:before { 217 | content: "\f008"; 218 | } 219 | .fa-th-large:before { 220 | content: "\f009"; 221 | } 222 | .fa-th:before { 223 | content: "\f00a"; 224 | } 225 | .fa-th-list:before { 226 | content: "\f00b"; 227 | } 228 | .fa-check:before { 229 | content: "\f00c"; 230 | } 231 | .fa-times:before { 232 | content: "\f00d"; 233 | } 234 | .fa-search-plus:before { 235 | content: "\f00e"; 236 | } 237 | .fa-search-minus:before { 238 | content: "\f010"; 239 | } 240 | .fa-power-off:before { 241 | content: "\f011"; 242 | } 243 | .fa-signal:before { 244 | content: "\f012"; 245 | } 246 | .fa-gear:before, 247 | .fa-cog:before { 248 | content: "\f013"; 249 | } 250 | .fa-trash-o:before { 251 | content: "\f014"; 252 | } 253 | .fa-home:before { 254 | content: "\f015"; 255 | } 256 | .fa-file-o:before { 257 | content: "\f016"; 258 | } 259 | .fa-clock-o:before { 260 | content: "\f017"; 261 | } 262 | .fa-road:before { 263 | content: "\f018"; 264 | } 265 | .fa-download:before { 266 | content: "\f019"; 267 | } 268 | .fa-arrow-circle-o-down:before { 269 | content: "\f01a"; 270 | } 271 | .fa-arrow-circle-o-up:before { 272 | content: "\f01b"; 273 | } 274 | .fa-inbox:before { 275 | content: "\f01c"; 276 | } 277 | .fa-play-circle-o:before { 278 | content: "\f01d"; 279 | } 280 | .fa-rotate-right:before, 281 | .fa-repeat:before { 282 | content: "\f01e"; 283 | } 284 | .fa-refresh:before { 285 | content: "\f021"; 286 | } 287 | .fa-list-alt:before { 288 | content: "\f022"; 289 | } 290 | .fa-lock:before { 291 | content: "\f023"; 292 | } 293 | .fa-flag:before { 294 | content: "\f024"; 295 | } 296 | .fa-headphones:before { 297 | content: "\f025"; 298 | } 299 | .fa-volume-off:before { 300 | content: "\f026"; 301 | } 302 | .fa-volume-down:before { 303 | content: "\f027"; 304 | } 305 | .fa-volume-up:before { 306 | content: "\f028"; 307 | } 308 | .fa-qrcode:before { 309 | content: "\f029"; 310 | } 311 | .fa-barcode:before { 312 | content: "\f02a"; 313 | } 314 | .fa-tag:before { 315 | content: "\f02b"; 316 | } 317 | .fa-tags:before { 318 | content: "\f02c"; 319 | } 320 | .fa-book:before { 321 | content: "\f02d"; 322 | } 323 | .fa-bookmark:before { 324 | content: "\f02e"; 325 | } 326 | .fa-print:before { 327 | content: "\f02f"; 328 | } 329 | .fa-camera:before { 330 | content: "\f030"; 331 | } 332 | .fa-font:before { 333 | content: "\f031"; 334 | } 335 | .fa-bold:before { 336 | content: "\f032"; 337 | } 338 | .fa-italic:before { 339 | content: "\f033"; 340 | } 341 | .fa-text-height:before { 342 | content: "\f034"; 343 | } 344 | .fa-text-width:before { 345 | content: "\f035"; 346 | } 347 | .fa-align-left:before { 348 | content: "\f036"; 349 | } 350 | .fa-align-center:before { 351 | content: "\f037"; 352 | } 353 | .fa-align-right:before { 354 | content: "\f038"; 355 | } 356 | .fa-align-justify:before { 357 | content: "\f039"; 358 | } 359 | .fa-list:before { 360 | content: "\f03a"; 361 | } 362 | .fa-dedent:before, 363 | .fa-outdent:before { 364 | content: "\f03b"; 365 | } 366 | .fa-indent:before { 367 | content: "\f03c"; 368 | } 369 | .fa-video-camera:before { 370 | content: "\f03d"; 371 | } 372 | .fa-picture-o:before { 373 | content: "\f03e"; 374 | } 375 | .fa-pencil:before { 376 | content: "\f040"; 377 | } 378 | .fa-map-marker:before { 379 | content: "\f041"; 380 | } 381 | .fa-adjust:before { 382 | content: "\f042"; 383 | } 384 | .fa-tint:before { 385 | content: "\f043"; 386 | } 387 | .fa-edit:before, 388 | .fa-pencil-square-o:before { 389 | content: "\f044"; 390 | } 391 | .fa-share-square-o:before { 392 | content: "\f045"; 393 | } 394 | .fa-check-square-o:before { 395 | content: "\f046"; 396 | } 397 | .fa-arrows:before { 398 | content: "\f047"; 399 | } 400 | .fa-step-backward:before { 401 | content: "\f048"; 402 | } 403 | .fa-fast-backward:before { 404 | content: "\f049"; 405 | } 406 | .fa-backward:before { 407 | content: "\f04a"; 408 | } 409 | .fa-play:before { 410 | content: "\f04b"; 411 | } 412 | .fa-pause:before { 413 | content: "\f04c"; 414 | } 415 | .fa-stop:before { 416 | content: "\f04d"; 417 | } 418 | .fa-forward:before { 419 | content: "\f04e"; 420 | } 421 | .fa-fast-forward:before { 422 | content: "\f050"; 423 | } 424 | .fa-step-forward:before { 425 | content: "\f051"; 426 | } 427 | .fa-eject:before { 428 | content: "\f052"; 429 | } 430 | .fa-chevron-left:before { 431 | content: "\f053"; 432 | } 433 | .fa-chevron-right:before { 434 | content: "\f054"; 435 | } 436 | .fa-plus-circle:before { 437 | content: "\f055"; 438 | } 439 | .fa-minus-circle:before { 440 | content: "\f056"; 441 | } 442 | .fa-times-circle:before { 443 | content: "\f057"; 444 | } 445 | .fa-check-circle:before { 446 | content: "\f058"; 447 | } 448 | .fa-question-circle:before { 449 | content: "\f059"; 450 | } 451 | .fa-info-circle:before { 452 | content: "\f05a"; 453 | } 454 | .fa-crosshairs:before { 455 | content: "\f05b"; 456 | } 457 | .fa-times-circle-o:before { 458 | content: "\f05c"; 459 | } 460 | .fa-check-circle-o:before { 461 | content: "\f05d"; 462 | } 463 | .fa-ban:before { 464 | content: "\f05e"; 465 | } 466 | .fa-arrow-left:before { 467 | content: "\f060"; 468 | } 469 | .fa-arrow-right:before { 470 | content: "\f061"; 471 | } 472 | .fa-arrow-up:before { 473 | content: "\f062"; 474 | } 475 | .fa-arrow-down:before { 476 | content: "\f063"; 477 | } 478 | .fa-mail-forward:before, 479 | .fa-share:before { 480 | content: "\f064"; 481 | } 482 | .fa-expand:before { 483 | content: "\f065"; 484 | } 485 | .fa-compress:before { 486 | content: "\f066"; 487 | } 488 | .fa-plus:before { 489 | content: "\f067"; 490 | } 491 | .fa-minus:before { 492 | content: "\f068"; 493 | } 494 | .fa-asterisk:before { 495 | content: "\f069"; 496 | } 497 | .fa-exclamation-circle:before { 498 | content: "\f06a"; 499 | } 500 | .fa-gift:before { 501 | content: "\f06b"; 502 | } 503 | .fa-leaf:before { 504 | content: "\f06c"; 505 | } 506 | .fa-fire:before { 507 | content: "\f06d"; 508 | } 509 | .fa-eye:before { 510 | content: "\f06e"; 511 | } 512 | .fa-eye-slash:before { 513 | content: "\f070"; 514 | } 515 | .fa-warning:before, 516 | .fa-exclamation-triangle:before { 517 | content: "\f071"; 518 | } 519 | .fa-plane:before { 520 | content: "\f072"; 521 | } 522 | .fa-calendar:before { 523 | content: "\f073"; 524 | } 525 | .fa-random:before { 526 | content: "\f074"; 527 | } 528 | .fa-comment:before { 529 | content: "\f075"; 530 | } 531 | .fa-magnet:before { 532 | content: "\f076"; 533 | } 534 | .fa-chevron-up:before { 535 | content: "\f077"; 536 | } 537 | .fa-chevron-down:before { 538 | content: "\f078"; 539 | } 540 | .fa-retweet:before { 541 | content: "\f079"; 542 | } 543 | .fa-shopping-cart:before { 544 | content: "\f07a"; 545 | } 546 | .fa-folder:before { 547 | content: "\f07b"; 548 | } 549 | .fa-folder-open:before { 550 | content: "\f07c"; 551 | } 552 | .fa-arrows-v:before { 553 | content: "\f07d"; 554 | } 555 | .fa-arrows-h:before { 556 | content: "\f07e"; 557 | } 558 | .fa-bar-chart-o:before { 559 | content: "\f080"; 560 | } 561 | .fa-twitter-square:before { 562 | content: "\f081"; 563 | } 564 | .fa-facebook-square:before { 565 | content: "\f082"; 566 | } 567 | .fa-camera-retro:before { 568 | content: "\f083"; 569 | } 570 | .fa-key:before { 571 | content: "\f084"; 572 | } 573 | .fa-gears:before, 574 | .fa-cogs:before { 575 | content: "\f085"; 576 | } 577 | .fa-comments:before { 578 | content: "\f086"; 579 | } 580 | .fa-thumbs-o-up:before { 581 | content: "\f087"; 582 | } 583 | .fa-thumbs-o-down:before { 584 | content: "\f088"; 585 | } 586 | .fa-star-half:before { 587 | content: "\f089"; 588 | } 589 | .fa-heart-o:before { 590 | content: "\f08a"; 591 | } 592 | .fa-sign-out:before { 593 | content: "\f08b"; 594 | } 595 | .fa-linkedin-square:before { 596 | content: "\f08c"; 597 | } 598 | .fa-thumb-tack:before { 599 | content: "\f08d"; 600 | } 601 | .fa-external-link:before { 602 | content: "\f08e"; 603 | } 604 | .fa-sign-in:before { 605 | content: "\f090"; 606 | } 607 | .fa-trophy:before { 608 | content: "\f091"; 609 | } 610 | .fa-github-square:before { 611 | content: "\f092"; 612 | } 613 | .fa-upload:before { 614 | content: "\f093"; 615 | } 616 | .fa-lemon-o:before { 617 | content: "\f094"; 618 | } 619 | .fa-phone:before { 620 | content: "\f095"; 621 | } 622 | .fa-square-o:before { 623 | content: "\f096"; 624 | } 625 | .fa-bookmark-o:before { 626 | content: "\f097"; 627 | } 628 | .fa-phone-square:before { 629 | content: "\f098"; 630 | } 631 | .fa-twitter:before { 632 | content: "\f099"; 633 | } 634 | .fa-facebook:before { 635 | content: "\f09a"; 636 | } 637 | .fa-github:before { 638 | content: "\f09b"; 639 | } 640 | .fa-unlock:before { 641 | content: "\f09c"; 642 | } 643 | .fa-credit-card:before { 644 | content: "\f09d"; 645 | } 646 | .fa-rss:before { 647 | content: "\f09e"; 648 | } 649 | .fa-hdd-o:before { 650 | content: "\f0a0"; 651 | } 652 | .fa-bullhorn:before { 653 | content: "\f0a1"; 654 | } 655 | .fa-bell:before { 656 | content: "\f0f3"; 657 | } 658 | .fa-certificate:before { 659 | content: "\f0a3"; 660 | } 661 | .fa-hand-o-right:before { 662 | content: "\f0a4"; 663 | } 664 | .fa-hand-o-left:before { 665 | content: "\f0a5"; 666 | } 667 | .fa-hand-o-up:before { 668 | content: "\f0a6"; 669 | } 670 | .fa-hand-o-down:before { 671 | content: "\f0a7"; 672 | } 673 | .fa-arrow-circle-left:before { 674 | content: "\f0a8"; 675 | } 676 | .fa-arrow-circle-right:before { 677 | content: "\f0a9"; 678 | } 679 | .fa-arrow-circle-up:before { 680 | content: "\f0aa"; 681 | } 682 | .fa-arrow-circle-down:before { 683 | content: "\f0ab"; 684 | } 685 | .fa-globe:before { 686 | content: "\f0ac"; 687 | } 688 | .fa-wrench:before { 689 | content: "\f0ad"; 690 | } 691 | .fa-tasks:before { 692 | content: "\f0ae"; 693 | } 694 | .fa-filter:before { 695 | content: "\f0b0"; 696 | } 697 | .fa-briefcase:before { 698 | content: "\f0b1"; 699 | } 700 | .fa-arrows-alt:before { 701 | content: "\f0b2"; 702 | } 703 | .fa-group:before, 704 | .fa-users:before { 705 | content: "\f0c0"; 706 | } 707 | .fa-chain:before, 708 | .fa-link:before { 709 | content: "\f0c1"; 710 | } 711 | .fa-cloud:before { 712 | content: "\f0c2"; 713 | } 714 | .fa-flask:before { 715 | content: "\f0c3"; 716 | } 717 | .fa-cut:before, 718 | .fa-scissors:before { 719 | content: "\f0c4"; 720 | } 721 | .fa-copy:before, 722 | .fa-files-o:before { 723 | content: "\f0c5"; 724 | } 725 | .fa-paperclip:before { 726 | content: "\f0c6"; 727 | } 728 | .fa-save:before, 729 | .fa-floppy-o:before { 730 | content: "\f0c7"; 731 | } 732 | .fa-square:before { 733 | content: "\f0c8"; 734 | } 735 | .fa-bars:before { 736 | content: "\f0c9"; 737 | } 738 | .fa-list-ul:before { 739 | content: "\f0ca"; 740 | } 741 | .fa-list-ol:before { 742 | content: "\f0cb"; 743 | } 744 | .fa-strikethrough:before { 745 | content: "\f0cc"; 746 | } 747 | .fa-underline:before { 748 | content: "\f0cd"; 749 | } 750 | .fa-table:before { 751 | content: "\f0ce"; 752 | } 753 | .fa-magic:before { 754 | content: "\f0d0"; 755 | } 756 | .fa-truck:before { 757 | content: "\f0d1"; 758 | } 759 | .fa-pinterest:before { 760 | content: "\f0d2"; 761 | } 762 | .fa-pinterest-square:before { 763 | content: "\f0d3"; 764 | } 765 | .fa-google-plus-square:before { 766 | content: "\f0d4"; 767 | } 768 | .fa-google-plus:before { 769 | content: "\f0d5"; 770 | } 771 | .fa-money:before { 772 | content: "\f0d6"; 773 | } 774 | .fa-caret-down:before { 775 | content: "\f0d7"; 776 | } 777 | .fa-caret-up:before { 778 | content: "\f0d8"; 779 | } 780 | .fa-caret-left:before { 781 | content: "\f0d9"; 782 | } 783 | .fa-caret-right:before { 784 | content: "\f0da"; 785 | } 786 | .fa-columns:before { 787 | content: "\f0db"; 788 | } 789 | .fa-unsorted:before, 790 | .fa-sort:before { 791 | content: "\f0dc"; 792 | } 793 | .fa-sort-down:before, 794 | .fa-sort-asc:before { 795 | content: "\f0dd"; 796 | } 797 | .fa-sort-up:before, 798 | .fa-sort-desc:before { 799 | content: "\f0de"; 800 | } 801 | .fa-envelope:before { 802 | content: "\f0e0"; 803 | } 804 | .fa-linkedin:before { 805 | content: "\f0e1"; 806 | } 807 | .fa-rotate-left:before, 808 | .fa-undo:before { 809 | content: "\f0e2"; 810 | } 811 | .fa-legal:before, 812 | .fa-gavel:before { 813 | content: "\f0e3"; 814 | } 815 | .fa-dashboard:before, 816 | .fa-tachometer:before { 817 | content: "\f0e4"; 818 | } 819 | .fa-comment-o:before { 820 | content: "\f0e5"; 821 | } 822 | .fa-comments-o:before { 823 | content: "\f0e6"; 824 | } 825 | .fa-flash:before, 826 | .fa-bolt:before { 827 | content: "\f0e7"; 828 | } 829 | .fa-sitemap:before { 830 | content: "\f0e8"; 831 | } 832 | .fa-umbrella:before { 833 | content: "\f0e9"; 834 | } 835 | .fa-paste:before, 836 | .fa-clipboard:before { 837 | content: "\f0ea"; 838 | } 839 | .fa-lightbulb-o:before { 840 | content: "\f0eb"; 841 | } 842 | .fa-exchange:before { 843 | content: "\f0ec"; 844 | } 845 | .fa-cloud-download:before { 846 | content: "\f0ed"; 847 | } 848 | .fa-cloud-upload:before { 849 | content: "\f0ee"; 850 | } 851 | .fa-user-md:before { 852 | content: "\f0f0"; 853 | } 854 | .fa-stethoscope:before { 855 | content: "\f0f1"; 856 | } 857 | .fa-suitcase:before { 858 | content: "\f0f2"; 859 | } 860 | .fa-bell-o:before { 861 | content: "\f0a2"; 862 | } 863 | .fa-coffee:before { 864 | content: "\f0f4"; 865 | } 866 | .fa-cutlery:before { 867 | content: "\f0f5"; 868 | } 869 | .fa-file-text-o:before { 870 | content: "\f0f6"; 871 | } 872 | .fa-building-o:before { 873 | content: "\f0f7"; 874 | } 875 | .fa-hospital-o:before { 876 | content: "\f0f8"; 877 | } 878 | .fa-ambulance:before { 879 | content: "\f0f9"; 880 | } 881 | .fa-medkit:before { 882 | content: "\f0fa"; 883 | } 884 | .fa-fighter-jet:before { 885 | content: "\f0fb"; 886 | } 887 | .fa-beer:before { 888 | content: "\f0fc"; 889 | } 890 | .fa-h-square:before { 891 | content: "\f0fd"; 892 | } 893 | .fa-plus-square:before { 894 | content: "\f0fe"; 895 | } 896 | .fa-angle-double-left:before { 897 | content: "\f100"; 898 | } 899 | .fa-angle-double-right:before { 900 | content: "\f101"; 901 | } 902 | .fa-angle-double-up:before { 903 | content: "\f102"; 904 | } 905 | .fa-angle-double-down:before { 906 | content: "\f103"; 907 | } 908 | .fa-angle-left:before { 909 | content: "\f104"; 910 | } 911 | .fa-angle-right:before { 912 | content: "\f105"; 913 | } 914 | .fa-angle-up:before { 915 | content: "\f106"; 916 | } 917 | .fa-angle-down:before { 918 | content: "\f107"; 919 | } 920 | .fa-desktop:before { 921 | content: "\f108"; 922 | } 923 | .fa-laptop:before { 924 | content: "\f109"; 925 | } 926 | .fa-tablet:before { 927 | content: "\f10a"; 928 | } 929 | .fa-mobile-phone:before, 930 | .fa-mobile:before { 931 | content: "\f10b"; 932 | } 933 | .fa-circle-o:before { 934 | content: "\f10c"; 935 | } 936 | .fa-quote-left:before { 937 | content: "\f10d"; 938 | } 939 | .fa-quote-right:before { 940 | content: "\f10e"; 941 | } 942 | .fa-spinner:before { 943 | content: "\f110"; 944 | } 945 | .fa-circle:before { 946 | content: "\f111"; 947 | } 948 | .fa-mail-reply:before, 949 | .fa-reply:before { 950 | content: "\f112"; 951 | } 952 | .fa-github-alt:before { 953 | content: "\f113"; 954 | } 955 | .fa-folder-o:before { 956 | content: "\f114"; 957 | } 958 | .fa-folder-open-o:before { 959 | content: "\f115"; 960 | } 961 | .fa-smile-o:before { 962 | content: "\f118"; 963 | } 964 | .fa-frown-o:before { 965 | content: "\f119"; 966 | } 967 | .fa-meh-o:before { 968 | content: "\f11a"; 969 | } 970 | .fa-gamepad:before { 971 | content: "\f11b"; 972 | } 973 | .fa-keyboard-o:before { 974 | content: "\f11c"; 975 | } 976 | .fa-flag-o:before { 977 | content: "\f11d"; 978 | } 979 | .fa-flag-checkered:before { 980 | content: "\f11e"; 981 | } 982 | .fa-terminal:before { 983 | content: "\f120"; 984 | } 985 | .fa-code:before { 986 | content: "\f121"; 987 | } 988 | .fa-reply-all:before { 989 | content: "\f122"; 990 | } 991 | .fa-mail-reply-all:before { 992 | content: "\f122"; 993 | } 994 | .fa-star-half-empty:before, 995 | .fa-star-half-full:before, 996 | .fa-star-half-o:before { 997 | content: "\f123"; 998 | } 999 | .fa-location-arrow:before { 1000 | content: "\f124"; 1001 | } 1002 | .fa-crop:before { 1003 | content: "\f125"; 1004 | } 1005 | .fa-code-fork:before { 1006 | content: "\f126"; 1007 | } 1008 | .fa-unlink:before, 1009 | .fa-chain-broken:before { 1010 | content: "\f127"; 1011 | } 1012 | .fa-question:before { 1013 | content: "\f128"; 1014 | } 1015 | .fa-info:before { 1016 | content: "\f129"; 1017 | } 1018 | .fa-exclamation:before { 1019 | content: "\f12a"; 1020 | } 1021 | .fa-superscript:before { 1022 | content: "\f12b"; 1023 | } 1024 | .fa-subscript:before { 1025 | content: "\f12c"; 1026 | } 1027 | .fa-eraser:before { 1028 | content: "\f12d"; 1029 | } 1030 | .fa-puzzle-piece:before { 1031 | content: "\f12e"; 1032 | } 1033 | .fa-microphone:before { 1034 | content: "\f130"; 1035 | } 1036 | .fa-microphone-slash:before { 1037 | content: "\f131"; 1038 | } 1039 | .fa-shield:before { 1040 | content: "\f132"; 1041 | } 1042 | .fa-calendar-o:before { 1043 | content: "\f133"; 1044 | } 1045 | .fa-fire-extinguisher:before { 1046 | content: "\f134"; 1047 | } 1048 | .fa-rocket:before { 1049 | content: "\f135"; 1050 | } 1051 | .fa-maxcdn:before { 1052 | content: "\f136"; 1053 | } 1054 | .fa-chevron-circle-left:before { 1055 | content: "\f137"; 1056 | } 1057 | .fa-chevron-circle-right:before { 1058 | content: "\f138"; 1059 | } 1060 | .fa-chevron-circle-up:before { 1061 | content: "\f139"; 1062 | } 1063 | .fa-chevron-circle-down:before { 1064 | content: "\f13a"; 1065 | } 1066 | .fa-html5:before { 1067 | content: "\f13b"; 1068 | } 1069 | .fa-css3:before { 1070 | content: "\f13c"; 1071 | } 1072 | .fa-anchor:before { 1073 | content: "\f13d"; 1074 | } 1075 | .fa-unlock-alt:before { 1076 | content: "\f13e"; 1077 | } 1078 | .fa-bullseye:before { 1079 | content: "\f140"; 1080 | } 1081 | .fa-ellipsis-h:before { 1082 | content: "\f141"; 1083 | } 1084 | .fa-ellipsis-v:before { 1085 | content: "\f142"; 1086 | } 1087 | .fa-rss-square:before { 1088 | content: "\f143"; 1089 | } 1090 | .fa-play-circle:before { 1091 | content: "\f144"; 1092 | } 1093 | .fa-ticket:before { 1094 | content: "\f145"; 1095 | } 1096 | .fa-minus-square:before { 1097 | content: "\f146"; 1098 | } 1099 | .fa-minus-square-o:before { 1100 | content: "\f147"; 1101 | } 1102 | .fa-level-up:before { 1103 | content: "\f148"; 1104 | } 1105 | .fa-level-down:before { 1106 | content: "\f149"; 1107 | } 1108 | .fa-check-square:before { 1109 | content: "\f14a"; 1110 | } 1111 | .fa-pencil-square:before { 1112 | content: "\f14b"; 1113 | } 1114 | .fa-external-link-square:before { 1115 | content: "\f14c"; 1116 | } 1117 | .fa-share-square:before { 1118 | content: "\f14d"; 1119 | } 1120 | .fa-compass:before { 1121 | content: "\f14e"; 1122 | } 1123 | .fa-toggle-down:before, 1124 | .fa-caret-square-o-down:before { 1125 | content: "\f150"; 1126 | } 1127 | .fa-toggle-up:before, 1128 | .fa-caret-square-o-up:before { 1129 | content: "\f151"; 1130 | } 1131 | .fa-toggle-right:before, 1132 | .fa-caret-square-o-right:before { 1133 | content: "\f152"; 1134 | } 1135 | .fa-euro:before, 1136 | .fa-eur:before { 1137 | content: "\f153"; 1138 | } 1139 | .fa-gbp:before { 1140 | content: "\f154"; 1141 | } 1142 | .fa-dollar:before, 1143 | .fa-usd:before { 1144 | content: "\f155"; 1145 | } 1146 | .fa-rupee:before, 1147 | .fa-inr:before { 1148 | content: "\f156"; 1149 | } 1150 | .fa-cny:before, 1151 | .fa-rmb:before, 1152 | .fa-yen:before, 1153 | .fa-jpy:before { 1154 | content: "\f157"; 1155 | } 1156 | .fa-ruble:before, 1157 | .fa-rouble:before, 1158 | .fa-rub:before { 1159 | content: "\f158"; 1160 | } 1161 | .fa-won:before, 1162 | .fa-krw:before { 1163 | content: "\f159"; 1164 | } 1165 | .fa-bitcoin:before, 1166 | .fa-btc:before { 1167 | content: "\f15a"; 1168 | } 1169 | .fa-file:before { 1170 | content: "\f15b"; 1171 | } 1172 | .fa-file-text:before { 1173 | content: "\f15c"; 1174 | } 1175 | .fa-sort-alpha-asc:before { 1176 | content: "\f15d"; 1177 | } 1178 | .fa-sort-alpha-desc:before { 1179 | content: "\f15e"; 1180 | } 1181 | .fa-sort-amount-asc:before { 1182 | content: "\f160"; 1183 | } 1184 | .fa-sort-amount-desc:before { 1185 | content: "\f161"; 1186 | } 1187 | .fa-sort-numeric-asc:before { 1188 | content: "\f162"; 1189 | } 1190 | .fa-sort-numeric-desc:before { 1191 | content: "\f163"; 1192 | } 1193 | .fa-thumbs-up:before { 1194 | content: "\f164"; 1195 | } 1196 | .fa-thumbs-down:before { 1197 | content: "\f165"; 1198 | } 1199 | .fa-youtube-square:before { 1200 | content: "\f166"; 1201 | } 1202 | .fa-youtube:before { 1203 | content: "\f167"; 1204 | } 1205 | .fa-xing:before { 1206 | content: "\f168"; 1207 | } 1208 | .fa-xing-square:before { 1209 | content: "\f169"; 1210 | } 1211 | .fa-youtube-play:before { 1212 | content: "\f16a"; 1213 | } 1214 | .fa-dropbox:before { 1215 | content: "\f16b"; 1216 | } 1217 | .fa-stack-overflow:before { 1218 | content: "\f16c"; 1219 | } 1220 | .fa-instagram:before { 1221 | content: "\f16d"; 1222 | } 1223 | .fa-flickr:before { 1224 | content: "\f16e"; 1225 | } 1226 | .fa-adn:before { 1227 | content: "\f170"; 1228 | } 1229 | .fa-bitbucket:before { 1230 | content: "\f171"; 1231 | } 1232 | .fa-bitbucket-square:before { 1233 | content: "\f172"; 1234 | } 1235 | .fa-tumblr:before { 1236 | content: "\f173"; 1237 | } 1238 | .fa-tumblr-square:before { 1239 | content: "\f174"; 1240 | } 1241 | .fa-long-arrow-down:before { 1242 | content: "\f175"; 1243 | } 1244 | .fa-long-arrow-up:before { 1245 | content: "\f176"; 1246 | } 1247 | .fa-long-arrow-left:before { 1248 | content: "\f177"; 1249 | } 1250 | .fa-long-arrow-right:before { 1251 | content: "\f178"; 1252 | } 1253 | .fa-apple:before { 1254 | content: "\f179"; 1255 | } 1256 | .fa-windows:before { 1257 | content: "\f17a"; 1258 | } 1259 | .fa-android:before { 1260 | content: "\f17b"; 1261 | } 1262 | .fa-linux:before { 1263 | content: "\f17c"; 1264 | } 1265 | .fa-dribbble:before { 1266 | content: "\f17d"; 1267 | } 1268 | .fa-skype:before { 1269 | content: "\f17e"; 1270 | } 1271 | .fa-foursquare:before { 1272 | content: "\f180"; 1273 | } 1274 | .fa-trello:before { 1275 | content: "\f181"; 1276 | } 1277 | .fa-female:before { 1278 | content: "\f182"; 1279 | } 1280 | .fa-male:before { 1281 | content: "\f183"; 1282 | } 1283 | .fa-gittip:before { 1284 | content: "\f184"; 1285 | } 1286 | .fa-sun-o:before { 1287 | content: "\f185"; 1288 | } 1289 | .fa-moon-o:before { 1290 | content: "\f186"; 1291 | } 1292 | .fa-archive:before { 1293 | content: "\f187"; 1294 | } 1295 | .fa-bug:before { 1296 | content: "\f188"; 1297 | } 1298 | .fa-vk:before { 1299 | content: "\f189"; 1300 | } 1301 | .fa-weibo:before { 1302 | content: "\f18a"; 1303 | } 1304 | .fa-renren:before { 1305 | content: "\f18b"; 1306 | } 1307 | .fa-pagelines:before { 1308 | content: "\f18c"; 1309 | } 1310 | .fa-stack-exchange:before { 1311 | content: "\f18d"; 1312 | } 1313 | .fa-arrow-circle-o-right:before { 1314 | content: "\f18e"; 1315 | } 1316 | .fa-arrow-circle-o-left:before { 1317 | content: "\f190"; 1318 | } 1319 | .fa-toggle-left:before, 1320 | .fa-caret-square-o-left:before { 1321 | content: "\f191"; 1322 | } 1323 | .fa-dot-circle-o:before { 1324 | content: "\f192"; 1325 | } 1326 | .fa-wheelchair:before { 1327 | content: "\f193"; 1328 | } 1329 | .fa-vimeo-square:before { 1330 | content: "\f194"; 1331 | } 1332 | .fa-turkish-lira:before, 1333 | .fa-try:before { 1334 | content: "\f195"; 1335 | } 1336 | .fa-plus-square-o:before { 1337 | content: "\f196"; 1338 | } 1339 | -------------------------------------------------------------------------------- /example/theme/css/main.css: -------------------------------------------------------------------------------- 1 | @import url('font-awesome.css'); 2 | @import url('topcoat-mobile-dark.css'); 3 | @import url('theme.css'); 4 | -------------------------------------------------------------------------------- /example/theme/css/theme.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'source-sans-pro'; 3 | src: url('../fonts/sourcesanspro-light-webfont.eot'); 4 | src: url('../fonts/sourcesanspro-light-webfont.eot?#iefix') format('embedded-opentype'), 5 | url('../fonts/sourcesanspro-light-webfont.woff') format('woff'), 6 | url('../fonts/sourcesanspro-light-webfont.ttf') format('truetype'), 7 | url('../fonts/sourcesanspro-light-webfont.svg#source_sans_prolight') format('svg'); 8 | font-weight: 300; 9 | font-style: normal; 10 | 11 | } 12 | 13 | @font-face { 14 | font-family: 'source-sans-pro'; 15 | src: url('../fonts/sourcesanspro-regular-webfont.eot'); 16 | src: url('../fonts/sourcesanspro-regular-webfont.eot?#iefix') format('embedded-opentype'), 17 | url('../fonts/sourcesanspro-regular-webfont.woff') format('woff'), 18 | url('../fonts/sourcesanspro-regular-webfont.ttf') format('truetype'), 19 | url('../fonts/sourcesanspro-regular-webfont.svg#source_sans_proregular') format('svg'); 20 | font-weight: 400; 21 | font-style: normal; 22 | 23 | } 24 | 25 | @font-face { 26 | font-family: 'source-sans-pro'; 27 | src: url('../fonts/sourcesanspro-semibold-webfont.eot'); 28 | src: url('../fonts/sourcesanspro-semibold-webfont.eot?#iefix') format('embedded-opentype'), 29 | url('../fonts/sourcesanspro-semibold-webfont.woff') format('woff'), 30 | url('../fonts/sourcesanspro-semibold-webfont.ttf') format('truetype'), 31 | url('../fonts/sourcesanspro-semibold-webfont.svg#source_sans_prosemibold') format('svg'); 32 | font-weight: 600; 33 | font-style: normal; 34 | 35 | } 36 | 37 | @font-face { 38 | font-family: 'source-code-pro'; 39 | src: url('../fonts/sourcecodepro-regular-webfont.eot'); 40 | src: url('../fonts/sourcecodepro-regular-webfont.eot?#iefix') format('embedded-opentype'), 41 | url('../fonts/sourcecodepro-regular-webfont.woff') format('woff'), 42 | url('../fonts/sourcecodepro-regular-webfont.ttf') format('truetype'), 43 | url('../fonts/sourcecodepro-regular-webfont.svg#source_code_proregular') format('svg'); 44 | font-weight: normal; 45 | font-style: normal; 46 | 47 | } 48 | 49 | body { 50 | min-width: 300px; 51 | font: 16px/1.2em 'source-sans-pro', Arial, Helvetica Neue; 52 | color: #F0F1F1; 53 | background: #4A4D4E; 54 | -webkit-font-smoothing: antialiased; 55 | } 56 | /*-----------------------------------*/ 57 | 58 | div[data-role=view] { 59 | background-color: #4A4D4E; 60 | } 61 | .container div[data-role=view] { 62 | position: static; 63 | height: auto; 64 | } 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | /* Mainly styles*/ 74 | 75 | .main, 76 | .top-bar, 77 | .bottom-bar { 78 | position: absolute; 79 | } 80 | .top-bar { 81 | z-index: 10; 82 | top:0; 83 | left:0; 84 | height: 4.375rem; 85 | width: 100%; 86 | } 87 | .bottom-bar { 88 | z-index: 10; 89 | left:0; 90 | bottom: 0; 91 | width: 100%; 92 | height: 3rem; 93 | } 94 | .main { 95 | top:0; 96 | left:0; 97 | right:0; 98 | bottom:0; 99 | } 100 | .top-bar ~ .main { 101 | top: 4.375rem; 102 | } 103 | .bottom-bar ~ .main { 104 | bottom: 3rem; 105 | } 106 | .content { 107 | padding: 15px; 108 | } 109 | .container 110 | /*-----------------------------------*/ 111 | .topcoat-navigation-bar div[data-role=view] { 112 | background: transparent; 113 | } 114 | .form-options { 115 | margin: 0 0 15px; 116 | } 117 | .form-options .topcoat-radio-button { 118 | display: block; 119 | margin: -20px; 120 | padding: 20px; 121 | cursor: pointer; 122 | } 123 | 124 | /* Additional styles*/ 125 | .extra-margin { 126 | margin: 20px; 127 | } 128 | .extra-margin--top { 129 | margin-top:20px; 130 | } 131 | .extra-margin--bottom { 132 | margin-bottom:20px; 133 | } 134 | .extra-margin--top-bottom { 135 | margin: 20px 0; 136 | } 137 | .bottom-bar { 138 | width: 100%; 139 | } 140 | .bottom-bar .topcoat-tab-bar__item { 141 | border-right: 1px solid #333434; 142 | } 143 | .bottom-bar button{ 144 | display: block; 145 | width: 100%; 146 | } 147 | .bottom-bar .topcoat-tab-bar__item:last-child{ 148 | border-right: none; 149 | } 150 | 151 | .topcoat-list-margin{ 152 | margin-bottom: 20px; 153 | } 154 | .border-none{ 155 | border: none !important; 156 | } 157 | .only-bottom-border-radius{ 158 | border-radius: 0 0 8px 8px !important; 159 | } 160 | /*-----------------------------------*/ 161 | 162 | 163 | 164 | 165 | /* Article */ 166 | .section{ 167 | font-size: 0.9em; 168 | border-top: 1px solid #333434; 169 | } 170 | .section__header { 171 | margin: 0; 172 | padding: 4px 20px; 173 | font-size: 1em; 174 | font-weight: 400; 175 | background-color: #3f4041; 176 | color: #c6c8c8; 177 | text-shadow: 0 1px 0 rgba(255,255,255,0.1); 178 | border-top: 1px solid rgba(255,255,255,0.1); 179 | border-bottom: 1px solid rgba(255,255,255,0.05); 180 | } 181 | .section img{ 182 | width: 200px; 183 | height: 200px; 184 | float: left; 185 | margin: 0 15px 15px 0; 186 | } 187 | .section__content { 188 | padding: 10px 20px; 189 | border-top: 1px solid #333434; 190 | overflow: hidden; 191 | } 192 | .section__content p { 193 | margin: 0 0 10px; 194 | } 195 | 196 | /*-----------------------------------*/ 197 | .receiver { 198 | padding: 5px; 199 | margin: 5px 0; 200 | background: #454646; 201 | min-height: 24px; 202 | line-height: 24px; 203 | } 204 | .text-overflow { 205 | text-overflow: ellipsis !important; 206 | word-wrap: break-word; 207 | overflow: hidden !important; 208 | } 209 | /*-----------------------------------*/ 210 | 211 | 212 | 213 | 214 | /* Console */ 215 | #console{ 216 | position: relative; 217 | background: #595b5b; 218 | width: 100%; 219 | height: 69px; 220 | font-size: 12px; 221 | rows: 3; 222 | color: #F0F1F1; 223 | } 224 | #console div[data-role="view"] { 225 | background: #595b5b; 226 | } 227 | .console-wrapper{ 228 | padding: 5px 229 | } 230 | /*-----------------------------------*/ 231 | 232 | 233 | /* Popup-anchor */ 234 | .anchor { 235 | display: inline-block; 236 | padding: 0 1.25rem; 237 | font-size: 16px; 238 | line-height: 3rem; 239 | color: #c6c8c8; 240 | background-color: #595b5b; 241 | border: 1px solid #333434; 242 | border-radius: 6px; 243 | } 244 | /*-----------------------------------*/ 245 | 246 | 247 | 248 | .topcoat-checkbox__checkmark, 249 | .topcoat-radio-button__checkmark{ 250 | margin-right: 10px; 251 | } 252 | .topcoat-list__item, 253 | .topcoat-navigation-bar{ 254 | position: relative; 255 | } 256 | .topcoat-list__item .fa-angle-right{ 257 | position: absolute; 258 | right: 10px; 259 | font-size: 20px; 260 | } 261 | 262 | .topcoat-navigation-bar .topcoat-icon-button { 263 | vertical-align: middle; 264 | } 265 | .topcoat-navigation-bar .fa-angle-left, 266 | .topcoat-navigation-bar .fa-bars { 267 | display: block; 268 | width: 24px; 269 | height: 48px; 270 | line-height: 48px; 271 | font-size: 30px; 272 | } 273 | .topcoat-navigation-bar .fa-bars { 274 | font-size: 28px; 275 | line-height: 50px; 276 | } 277 | 278 | /* fix-forms for firefox */ 279 | .topcoat-text-input, 280 | .topcoat-text-input--large { 281 | height: 50px; 282 | box-sizing: border-box; 283 | -moz-box-sizing: border-box; 284 | } 285 | /*-----------------------------------*/ 286 | 287 | 288 | 289 | /* Modal views and PopUp */ 290 | .popup-view { 291 | position: absolute; 292 | z-index: 100; 293 | max-width: 250px; 294 | padding: 10px; 295 | color:#000; 296 | background: #e5e9e8; 297 | border-radius: 8px; 298 | -webkit-box-sizing: border-box; 299 | box-sizing: border-box; 300 | } 301 | .popup-view-holder { 302 | position: absolute; 303 | top:10px; 304 | left:10px; 305 | right: 10px; 306 | bottom:10px; 307 | } 308 | 309 | div.modal-view { 310 | width: 95%; 311 | min-width: 250px; 312 | max-width: 400px; 313 | color:#000; 314 | padding: 20px 10px; 315 | background: #e5e9e8; 316 | border-radius: 8px; 317 | -webkit-box-sizing: border-box; 318 | box-sizing: border-box; 319 | } 320 | .toast { 321 | text-align: center; 322 | } 323 | .toast__title { 324 | font-size: 1em; 325 | margin: 0 0 10px; 326 | padding: 0 0 5px; 327 | border-bottom: 1px solid #d3d7d7; 328 | } 329 | .toast__content { 330 | 331 | } 332 | .modal-view__header { 333 | margin: 0; 334 | padding: 0 0 20px; 335 | text-align: center; 336 | border-bottom: 1px solid #d3d7d7; 337 | } 338 | .modal-view__header h2 { 339 | margin: 0; 340 | font-size: 2rem; 341 | font-weight: 400; 342 | } 343 | .modal-view__content { 344 | 345 | } 346 | .switch-label { 347 | display: inline-block; 348 | vertical-align: middle; 349 | margin: 0 10px; 350 | } 351 | .topcoat-list .topcoat-switch { 352 | vertical-align: middle; 353 | } 354 | /* fix problem when placed inside iscroll */ 355 | .scroll-view .topcoat-switch { 356 | -webkit-perspective: 100; 357 | perspective: 100; 358 | } 359 | 360 | 361 | 362 | /* media screen */ 363 | @media screen and (max-width: 400px) { 364 | .section img { 365 | display: block; 366 | width:100%; 367 | height: auto; 368 | } 369 | .bar__title, 370 | .sub-title-block, 371 | .sub-title{ 372 | text-align: center; 373 | 374 | } 375 | .topcoat-button--cta{ 376 | display: block; 377 | width: 100%; 378 | } 379 | .responsive-width-full { 380 | width: 100%; 381 | } 382 | .topcoat-text-input + .topcoat-button--cta { 383 | margin: 10px 0; 384 | } 385 | }/*-----------------------------------*/ 386 | -------------------------------------------------------------------------------- /example/theme/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /example/theme/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /example/theme/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /example/theme/fonts/sourcecodepro-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcecodepro-regular-webfont.eot -------------------------------------------------------------------------------- /example/theme/fonts/sourcecodepro-regular-webfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /example/theme/fonts/sourcecodepro-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcecodepro-regular-webfont.ttf -------------------------------------------------------------------------------- /example/theme/fonts/sourcecodepro-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcecodepro-regular-webfont.woff -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-light-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-light-webfont.eot -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-light-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-light-webfont.ttf -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-light-webfont.woff -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-regular-webfont.eot -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-regular-webfont.ttf -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-regular-webfont.woff -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-semibold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-semibold-webfont.eot -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-semibold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-semibold-webfont.ttf -------------------------------------------------------------------------------- /example/theme/fonts/sourcesanspro-semibold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/fonts/sourcesanspro-semibold-webfont.woff -------------------------------------------------------------------------------- /example/theme/img/search-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/img/search-bg.png -------------------------------------------------------------------------------- /example/theme/img/search-bg2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rapid-Application-Development-JS/ErrorTracker/a21629879847072cb38e1639846c5a7fa9c55c94/example/theme/img/search-bg2x.png -------------------------------------------------------------------------------- /example/theme/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Slice 1 4 | Created with Sketch (http://www.bohemiancoding.com/sketch) 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /example/theme/img/search_bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /example/theme/img/search_dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | ]> 9 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /example/theme/img/search_light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Slice 1 4 | Created with Sketch (http://www.bohemiancoding.com/sketch) 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Yuriy Luchaninov (http://mobidev.biz/)", 3 | "bugs": { 4 | "url": "https://github.com/Rapid-Application-Development-JS/ErrorTracker/issues" 5 | }, 6 | "contributors": [ 7 | { 8 | "email": "a.trofimenko@mobidev.biz", 9 | "name": "Anton Trofimenko" 10 | }, 11 | { 12 | "email": "r.prokofeyv@mobidev.biz", 13 | "name": "Roman Prokofeyv" 14 | }, 15 | { 16 | "email": "y.luchaninov@mobidev.biz", 17 | "name": "Yuriy Luchaninov" 18 | } 19 | ], 20 | "dependencies": { 21 | }, 22 | "description": "Error tracker stores the chain of events occurring in the application such as user interface events, sending the requests to the server, launching the timers etc. It also provides information about the environment such as browser and operating system version, connected libraries and scripts, the network status (if it is supported by api used browser). With Error Tracker you can break the chain of events into some blocks, add custom events, write to the console or clear chain of errors. Also Error Tracker supports pointer and gesture events.", 23 | "devDependencies": { 24 | "uglifyjs": "*" 25 | }, 26 | "directories": { 27 | "example": "example", 28 | "lib": "source" 29 | }, 30 | "homepage": "https://github.com/Rapid-Application-Development-JS/Drawer", 31 | "keywords": [ 32 | "Error", 33 | "tracker", 34 | "log" 35 | ], 36 | "license": { 37 | "type": "MIT", 38 | "url": "https://github.com/Rapid-Application-Development-JS/ErrorTracker/blob/master/LICENSE.md" 39 | }, 40 | "main": [ 41 | "release/errortracker.min.js", 42 | "release/errortracker.min.js.map" 43 | ], 44 | "name": "radjs-errortracker", 45 | "private": false, 46 | "readmeFilename": "README.md", 47 | "repository": { 48 | "type": "git", 49 | "url": "git+https://github.com/Rapid-Application-Development-JS/ErrorTracker.git" 50 | }, 51 | "scripts": { 52 | "build-js": "uglifyjs source/ErrorTracker.js --compress --mangle --screw-ie8 --comments --lint --source-map release/errortracker.min.js.map --output release/errortracker.min.js", 53 | "test": "echo \"no test required\" && exit 1" 54 | }, 55 | "version": "1.0.1" 56 | } 57 | -------------------------------------------------------------------------------- /release/errortracker.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"function"==typeof define&&define.amd?define(function(){return t.ErrorTracker=e()}):"object"==typeof module&&module.exports?module.exports=t.ErrorTracker=e():t.ErrorTracker=e()}(this,function(){function t(t){function e(t,e){var n;for(n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function n(t){var e="onload"in new XMLHttpRequest?XMLHttpRequest:XDomainRequest,n=new e;n.open("POST",c.url,!0),n.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),n.onload=function(){200===n.status?(console.info("Error log has sended to service",a),s.clearLog()):console.error("Error: cant send log to service",a)},n.send(t)}function r(){var t,e,n=Object.keys(s.EVENTS.DOMEventTypes),r=[];for(t=0;t=0;t--)e=r[t],document.addEventListener(e,i,!0)}function o(){var t,e,n=Object.keys(s.EVENTS.DOMEventTypes),r=[];for(t=0;t=0;t--)e=r[t],document.removeEventListener(e,i,!0)}var i,s=this,a="_#_ignog_log_#_",u=[],l=[];this.version="1.0.0";var c=e({allowConsoleLogEvent:!0,allowTimerLogEvent:!0,url:void 0,onError:function(){}},t);this.SENDERS={window:"window",console:"console",xhr:"xhr",tracker:"tracker"},this.EVENTS={maxEventStackLength:50,console:"console",xhr:"xhr",timer:"timer",listener:"custom EventListener",DOM:"DOM",DOMEventTypes:{_any:["load","drop","paste","play","pageshow","hashchange","pointerup","pointerdown","pointercancel","touchstart","touchend","touchcancel"],button:["click","dblclick"],input:["blur"],textarea:["blur"],form:["submit","reset"]},EventListenerEliminations:["scroll","wheel","drag","mousemove","mouseover","mouseout","mouseleave","mouseenter","touchmove","mousewheel","input","keydown","keypress","keyup","hold","fling","longtap","tap","doubletap"]},this.eventStack={main:u},this.setOnErrorCallback=function(t){c.onError=t},this.isAllowConsoleLogEvent=function(){return c.allowConsoleLogEvent},this.setAllowConsoleLogEvent=function(t){c.allowConsoleLogEvent=t},this.isAllowTimerLogEvent=function(){return c.allowTimerLogEvent},this.setAllowTimerLogEvent=function(t){c.allowTimerLogEvent=t},this.getIgnoredCustomEventsArray=function(){return s.EVENTS.EventListenerEliminations},this.setIgnoredCustomEventsArray=function(t){s.EVENTS.EventListenerEliminations=t},this.getDOMEvents=function(){for(var t={},e=Object.keys(s.EVENTS.DOMEventTypes),n=0;nthis.EVENTS.maxEventStackLength&&u.shift(),e},this.wrapGlobalErrors=function(){window.onerror=function(t,e,n,r,o){try{o=o||{},o.message=o.message||s.serialize(t),o.file=o.file||s.serialize(e),o.line=o.line||parseInt(n,10)||null,o.column=o.column||parseInt(r,10)||null,s.addError(s.SENDERS.window,o)}catch(t){s.fault(t)}}},this.wrapConsole=function(){var t,e,n=["log","debug","info","warn","error"];for(t=n.length-1;t>=0;t--)e=n[t],this.hasMethod(console,e)&&!function(t){var e=console[t];console[t]=function(){if(c.allowConsoleLogEvent)try{if(arguments.length>1||arguments[1]===a)return arguments.length=1,void e.apply(this,arguments);e.apply(this,arguments),"error"===t?s.addError(s.SENDERS.console,new Error(arguments[0])):s.scheduleEvent(s.EVENTS.console,{level:t,args:s.serialize(arguments)})}catch(t){s.fault(t)}else e.apply(this,arguments)}}(e)},this.wrapNetwork=function(){function t(t){t.errorTrackingInfo&&(t.errorTrackingInfo.statusCode=1223==t.status?204:t.status,t.errorTrackingInfo.statusText=1223==t.status?"No Content":t.statusText,s.scheduleEvent(s.EVENTS.xhr,t.errorTrackingInfo))}function e(t){var e;e=0===t.status?"Not connect. Verify Network.":404==t.status?"Requested page not found. [404]":500==t.status?"Internal Server Error [500].":"Uncaught Error.\n"+t.responseText,s.addError(s.SENDERS.xhr,{status:t.status,statusText:t.statusText||e,errorInfo:t.errorTrackingInfo})}function n(n){window.ProgressEvent&&n.addEventListener&&n.addEventListener("readystatechange",function(){4===n.readyState&&t(n)},!0),n.addEventListener?(n.addEventListener("load",function(){t(n)},!0),n.addEventListener("error",function(){t(n),e(n)},!0),n.addEventListener("abort",function(){t(n),e(n)},!0)):setTimeout(function(){try{var r=n.onload,o=n.onabort,i=n.onerror;n.onload=function(){t(n),e(n),"function"==typeof r&&r.apply(n,arguments)},n.onerror=function(){t(n),e(n),"function"==typeof i&&i.apply(n,arguments)},n.onabort=function(){t(n),e(n),"function"==typeof o&&o.apply(n,arguments)}}catch(t){s.fault(t)}},0)}var r=XMLHttpRequest.prototype.send,o=(XMLHttpRequest.prototype.error,XMLHttpRequest.prototype.open);XMLHttpRequest.prototype.open=function(t,e){return e.indexOf("localhost:0")<0&&(this.errorTrackingInfo={method:t,url:e}),o.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){if(this.errorTrackingInfo)try{this.errorTrackingInfo.sendTime=s.isoNow(),n(this)}catch(t){s.fault(t)}return r.apply(this,arguments)}},this.wrapTimers=function(){function t(t){var e=window[t];window[t]=function(){if(c.allowTimerLogEvent)try{s.scheduleEvent(s.EVENTS.timer,{type:t,params:s.serialize(Array.prototype.slice.call(arguments,1))})}catch(t){s.fault(t)}e.apply(this,arguments)}}t("setTimeout"),t("setInterval")},this.removeListener=function(){o()},this.wrapCustomEventListeners=function(){function t(t,e){var n=t[e];t[e]=function(){var t;try{arguments.length>0&&!s.arrayContains(s.EVENTS.EventListenerEliminations,arguments[0])&&(t=arguments[1],"function"==typeof t&&(arguments[1]=function(e){t.apply(this,arguments),s.scheduleEvent(s.EVENTS.listener,{target:s.serializeElement(s.elementForEvent(e)),type:e.type})}))}catch(t){s.fault(t)}n.apply(this,arguments)}}t(Element.prototype,"addEventListener")},this.elementForEvent=function(t){return t.target||document.elementFromPoint(t.clientX,t.clientY)},this.serializeError=function(t){var e=t.stack||t.stacktrace;return e&&(t._stack=e),JSON.stringify(t,null,4)},this.serialize=function(t){var e="";if("undefined"==typeof t)return"undefined";try{e=String(t),("[object Object]"===e||"[object Arguments]"===e)&&(e=JSON.stringify(t))}catch(t){}return e},this.serializeElement=function(t){function e(t){var e,n={};for(e=0;e=0&&t.options[t.selectedIndex])return t.options[t.selectedIndex].value;return null}var o;return t?(o={tag:t.tagName.toLowerCase(),attributes:e(t)},"select"===o.tag?o.value=r(t):t.hasOwnProperty("value")&&(o.value=n(t.value)),"input"!==o.tag&&"textarea"!==o.tag&&(t.textContent?o.text=t.textContent:t.innerText&&(o.text=t.innerText)),o):null},this.createGUID=function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},this.isoNow=function(){function t(t){function e(t){return 10>t?"0"+t:t}return t.getUTCFullYear()+"-"+e(t.getUTCMonth()+1)+"-"+e(t.getUTCDate())+"T"+e(t.getUTCHours())+":"+e(t.getUTCMinutes())+":"+e(t.getUTCSeconds())+"."+(t.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}var e=new Date;return e.toISOString?e.toISOString():t(e)},this.hasMethod=function(t,e){try{return"function"==typeof t[e]&&!!t[e]}catch(t){return!1}},this.arrayUnique=function(t){for(var e=t.concat(),n=0;n this.EVENTS.maxEventStackLength){ 228 | currentEventStack.shift(); 229 | } 230 | return info; 231 | }; 232 | 233 | this.wrapGlobalErrors = function(){ 234 | window.onerror = function(errMsg, url, line, column, error){ 235 | try { 236 | error = error || {}; 237 | error.message = error.message || scope.serialize(errMsg); 238 | error.file = error.file || scope.serialize(url); 239 | error.line = error.line || (parseInt(line, 10) || null); 240 | error.column = error.column || (parseInt(column, 10) || null); 241 | scope.addError(scope.SENDERS.window, error); 242 | } catch (e) { 243 | scope.fault(e); 244 | } 245 | }; 246 | }; 247 | 248 | this.wrapConsole = function(){ 249 | var i, level, logLevels = ["log", "debug", "info", "warn", "error"]; 250 | for(i = logLevels.length - 1; i >= 0; i--){ 251 | level = logLevels[i]; 252 | if(this.hasMethod(console, level)) { 253 | (function(level){ 254 | var original = console[level]; 255 | 256 | console[level] = function (txt) { 257 | if(_options.allowConsoleLogEvent) { 258 | try { 259 | if ((arguments.length > 1) || (arguments[1] === IGNORLOG)) { 260 | arguments.length = 1; 261 | original.apply(this, arguments); 262 | return; 263 | } 264 | original.apply(this, arguments); 265 | if (level === "error") { 266 | scope.addError(scope.SENDERS.console, new Error(arguments[0])); 267 | } else { 268 | scope.scheduleEvent(scope.EVENTS.console, { 269 | level: level, 270 | args: scope.serialize(arguments) 271 | }); 272 | } 273 | } catch (e) { 274 | scope.fault(e); 275 | } 276 | }else{ 277 | original.apply(this, arguments); 278 | } 279 | } 280 | 281 | })(level); 282 | } 283 | } 284 | }; 285 | 286 | this.wrapNetwork = function(){ 287 | var origSend = XMLHttpRequest.prototype.send, 288 | origError = XMLHttpRequest.prototype.error, 289 | origOpen = XMLHttpRequest.prototype.open; 290 | function finalize(xhr) { 291 | if (xhr.errorTrackingInfo) { 292 | xhr.errorTrackingInfo.statusCode = xhr.status == 1223 ? 204 : xhr.status; 293 | xhr.errorTrackingInfo.statusText = xhr.status == 1223 ? "No Content" : xhr.statusText; 294 | scope.scheduleEvent(scope.EVENTS.xhr, xhr.errorTrackingInfo); 295 | } 296 | } 297 | 298 | function checkFault(xhr) { 299 | var errorText; 300 | if (xhr.status === 0) { 301 | errorText = 'Not connect. Verify Network.'; 302 | } else if (xhr.status == 404) { 303 | errorText = 'Requested page not found. [404]'; 304 | } else if (xhr.status == 500) { 305 | errorText = 'Internal Server Error [500].'; 306 | } else { 307 | errorText = 'Uncaught Error.\n' + xhr.responseText; 308 | } 309 | 310 | scope.addError(scope.SENDERS.xhr, { 311 | status: xhr.status, 312 | statusText: xhr.statusText || errorText, 313 | errorInfo: xhr.errorTrackingInfo 314 | }); 315 | } 316 | 317 | function completionListener(xhr){ 318 | if (window.ProgressEvent) { 319 | if (xhr.addEventListener) { 320 | xhr.addEventListener("readystatechange", function() { 321 | if (xhr.readyState === 4) { 322 | finalize(xhr); 323 | } 324 | //checkFault(xhr); 325 | }, true); 326 | } 327 | } 328 | if (xhr.addEventListener) { 329 | xhr.addEventListener("load", function() { 330 | finalize(xhr); 331 | // checkFault(xhr); 332 | }, true); 333 | xhr.addEventListener("error", function(event) { 334 | finalize(xhr); 335 | checkFault(xhr); 336 | }, true); 337 | xhr.addEventListener("abort", function(event) { 338 | finalize(xhr); 339 | checkFault(xhr); 340 | }, true); 341 | } else { 342 | setTimeout(function() { 343 | try { 344 | var origOnLoad = xhr.onload, 345 | origOnAbort = xhr.onabort, 346 | origOnError = xhr.onerror; 347 | 348 | 349 | xhr.onload = function() { 350 | finalize(xhr); 351 | checkFault(xhr); 352 | if (typeof origOnLoad === "function") { 353 | origOnLoad.apply(xhr, arguments); 354 | } 355 | }; 356 | 357 | xhr.onerror = function() { 358 | finalize(xhr); 359 | checkFault(xhr); 360 | if ("function" === typeof origOnError) { 361 | origOnError.apply(xhr, arguments); 362 | } 363 | }; 364 | xhr.onabort = function() { 365 | finalize(xhr); 366 | checkFault(xhr); 367 | if ("function" === typeof origOnAbort) { 368 | origOnAbort.apply(xhr, arguments); 369 | } 370 | }; 371 | } catch (e) { 372 | scope.fault(e); 373 | } 374 | }, 0); 375 | } 376 | } 377 | 378 | XMLHttpRequest.prototype.open = function(method, url) { 379 | if (url.indexOf("localhost:0") < 0) { 380 | this.errorTrackingInfo = { 381 | method : method, 382 | url : url 383 | }; 384 | } 385 | return origOpen.apply(this, arguments); 386 | }; 387 | 388 | XMLHttpRequest.prototype.send = function() { 389 | if(this.errorTrackingInfo) { 390 | try { 391 | this.errorTrackingInfo.sendTime = scope.isoNow(); 392 | completionListener(this); 393 | } catch (e) { 394 | scope.fault(e); 395 | } 396 | } 397 | return origSend.apply(this, arguments); 398 | }; 399 | }; 400 | 401 | this.wrapTimers = function(){ 402 | function wrap(func){ 403 | var original = window[func]; 404 | window[func] = function logTimerEvent(){ 405 | if(_options.allowTimerLogEvent) { 406 | try { 407 | scope.scheduleEvent(scope.EVENTS.timer, { 408 | type: func, 409 | params: scope.serialize(Array.prototype.slice.call(arguments, 1)) 410 | }); 411 | } catch (e) { 412 | scope.fault(e); 413 | } 414 | } 415 | original.apply(this, arguments); 416 | }; 417 | 418 | } 419 | wrap("setTimeout"); 420 | wrap("setInterval"); 421 | }; 422 | 423 | function wrapDOMEvents () { 424 | var i, eventName, keys = Object.keys(scope.EVENTS.DOMEventTypes), allEvents = []; 425 | 426 | for (i = 0; i < keys.length; i++) { 427 | allEvents = allEvents.concat(scope.EVENTS.DOMEventTypes[keys[i]]); 428 | } 429 | allEvents = scope.arrayUnique(allEvents); 430 | for (i = allEvents.length - 1; i >= 0; i--) { 431 | eventName = allEvents[i]; 432 | document.addEventListener(eventName, _DOMEventListener, true); 433 | } 434 | }; 435 | 436 | function _RemoveDOMEventListener(){ 437 | var i, eventName, keys = Object.keys(scope.EVENTS.DOMEventTypes), allEvents = []; 438 | 439 | for(i = 0; i < keys.length; i++){ 440 | allEvents = allEvents.concat(scope.EVENTS.DOMEventTypes[keys[i]]); 441 | } 442 | allEvents = scope.arrayUnique(allEvents); 443 | for(i = allEvents.length - 1; i >= 0; i--) { 444 | eventName = allEvents[i]; 445 | document.removeEventListener(eventName, _DOMEventListener, true); 446 | } 447 | }; 448 | 449 | this.removeListener = function(){ 450 | _RemoveDOMEventListener(); 451 | }; 452 | 453 | 454 | 455 | this.wrapCustomEventListeners = function(){ 456 | function wrap(object, funcName){ 457 | var original = object[funcName]; 458 | object[funcName] = function(){ 459 | var listener; 460 | try { 461 | if(arguments.length > 0 && !scope.arrayContains(scope.EVENTS.EventListenerEliminations, arguments[0])){ 462 | listener = arguments[1]; 463 | if (typeof listener === "function") { 464 | arguments[1] = function (event) { 465 | listener.apply(this, arguments); 466 | scope.scheduleEvent(scope.EVENTS.listener, { 467 | target: scope.serializeElement(scope.elementForEvent(event)), 468 | type: event.type 469 | }); 470 | } 471 | } 472 | } 473 | } catch (e) { 474 | scope.fault(e); 475 | } 476 | original.apply(this, arguments); 477 | }; 478 | } 479 | 480 | wrap(Element.prototype, "addEventListener"); 481 | }; 482 | 483 | this.elementForEvent = function(event){ 484 | return event.target || document.elementFromPoint(event.clientX, event.clientY); 485 | }; 486 | 487 | this.serializeError = function(error){ 488 | var stack = error.stack || error.stacktrace; 489 | if(stack){ 490 | error._stack = stack; 491 | } 492 | return JSON.stringify(error, null, 4); 493 | }; 494 | 495 | this.serialize = function(obj) { 496 | var result = ""; 497 | if (typeof obj === "undefined") { 498 | return "undefined"; 499 | } 500 | try { 501 | result = String(obj); 502 | if(result === "[object Object]" || result === "[object Arguments]"){ 503 | result = JSON.stringify(obj); 504 | } 505 | } catch (e) {} 506 | return result; 507 | }; 508 | 509 | this.serializeElement = function(element){ 510 | var result; 511 | 512 | function getElementAttributes(el) { 513 | var i, attrs = {}; 514 | for (i = 0; i < el.attributes.length; i++) { 515 | if (el.attributes[i].name.toLowerCase() !== "value") { 516 | attrs[el.attributes[i].name] = el.attributes[i].value; 517 | } 518 | } 519 | return attrs; 520 | } 521 | 522 | function serializeValue(data) { 523 | if(typeof data === "string") { 524 | if (data == "") { 525 | return ""; 526 | } 527 | if (/^[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(data)) { 528 | return "{type: email, length: "+data.length+"}"; 529 | } 530 | if (/^(\d{4}[\/\-](0?[1-9]|1[012])[\/\-]0?[1-9]|[12][0-9]|3[01])$/.test(data)) { 531 | return "{type: date, length: "+data.length+"}"; 532 | } 533 | if (/^\s*$/.test(data)) { 534 | return "{type: whitespace, length: "+data.length+"}"; 535 | } 536 | if (/^\d*$/.test(data)) { 537 | return "{type: numeric, length: "+data.length+"}"; 538 | } 539 | if (/^[a-zA-Z]*$/.test(data)) { 540 | return "{type: alpha, length: "+data.length+"}"; 541 | } 542 | if (/^[a-zA-Z0-9]*$/.test(data)) { 543 | return "{type: alphanumeric, length: "+data.length+"}"; 544 | } 545 | return "{type: characters, length: "+data.length+"}"; 546 | } else { 547 | return scope.serialize(data); 548 | } 549 | } 550 | 551 | function getSelectValue(element){ 552 | var i; 553 | if (element.multiple) { 554 | for (i = 0; i < element.options.length; i++) { 555 | if (element.options[i].selected) { 556 | return element.options[i].value; 557 | } 558 | } 559 | } else { 560 | if (element.selectedIndex >= 0) { 561 | if (element.options[element.selectedIndex]) { 562 | return element.options[element.selectedIndex].value; 563 | } 564 | } 565 | } 566 | return null 567 | } 568 | 569 | if(element){ 570 | result = { 571 | tag: element.tagName.toLowerCase(), 572 | attributes: getElementAttributes(element) 573 | }; 574 | if(result.tag === "select"){ 575 | result.value = getSelectValue(element); 576 | } else if(element.hasOwnProperty('value')){ 577 | result.value = serializeValue(element.value); 578 | } 579 | if(result.tag !== "input" && result.tag !== "textarea") { 580 | if (element.textContent) { 581 | result.text = element.textContent; 582 | } else if (element.innerText) { 583 | result.text = element.innerText; 584 | } 585 | } 586 | return result; 587 | } 588 | return null; 589 | }; 590 | 591 | this.createGUID = function() { 592 | function s4() { 593 | return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); 594 | } 595 | return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 596 | s4() + '-' + s4() + s4() + s4(); 597 | }; 598 | 599 | this.isoNow = function(){ 600 | function getISO(date){ 601 | function pad(number) { 602 | if (number < 10) { 603 | return '0' + number; 604 | } 605 | return number; 606 | } 607 | 608 | return date.getUTCFullYear() + 609 | '-' + pad(date.getUTCMonth() + 1) + 610 | '-' + pad(date.getUTCDate()) + 611 | 'T' + pad(date.getUTCHours()) + 612 | ':' + pad(date.getUTCMinutes()) + 613 | ':' + pad(date.getUTCSeconds()) + 614 | '.' + (date.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 615 | 'Z'; 616 | } 617 | 618 | var date = new Date; 619 | return date.toISOString ? date.toISOString() : getISO(date); 620 | }; 621 | 622 | this.hasMethod = function(obj, method) { 623 | try { 624 | return typeof obj[method] === "function" && !!obj[method]; 625 | } catch (e) { 626 | return false; 627 | } 628 | }; 629 | 630 | this.arrayUnique = function(array) { 631 | var a = array.concat(); 632 | for(var i=0; i