UNPKG

sizeme.js

Version:

Javascript utils for accessing the SizeMe API

313 lines (272 loc) 8.53 kB
(function() { var SizeMe, hasProp = {}.hasOwnProperty, slice = [].slice; SizeMe = (function() { var _authToken, _facepalm, createCORSRequest, createFitResponse, defaultErrorCallback; SizeMe.contextAddress = "https://www.sizeme.com"; SizeMe.version = "2.0"; _authToken = void 0; _facepalm = function() { return !("withCredentials" in XMLHttpRequest.prototype); }; function SizeMe(authToken) { _authToken = authToken; } createCORSRequest = function(method, service, callback, errorCallback) { var url, xhr; xhr = void 0; url = "" + SizeMe.contextAddress + service; if (!_facepalm()) { xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 300) { return callback(xhr); } else { return errorCallback(xhr); } } }; xhr.open(method, url, true); if (_authToken != null) { xhr.setRequestHeader("X-AUTH-TOKEN", _authToken); } } else if (typeof XDomainRequest !== "undefined" && XDomainRequest !== null) { xhr = new XDomainRequest(); url = url + "?_tm=" + (new Date().getTime()); if (_authToken != null) { url = url + "&authToken=" + _authToken; } xhr.onload = function() { return callback(xhr); }; xhr.onerror = function() { return errorCallback(xhr); }; xhr.open(method, url, true); } else { console.error("Unsupported browser"); } return xhr; }; defaultErrorCallback = function(xhr, status, statusText) { if (window.console && console.log) { return console.log("Error: " + statusText + " (" + status + ")"); } }; SizeMe.getAuthToken = function(callback, errorCallback) { var cb, iframe, xhr; if (errorCallback == null) { errorCallback = defaultErrorCallback; } if (_facepalm()) { iframe = document.createElement("iframe"); cb = function(event) { var tokenObj; tokenObj = JSON.parse(event.data); window.detachEvent("onmessage", cb); document.body.removeChild(iframe); if (callback != null) { if (typeof callback === "function") { callback(tokenObj); } } }; window.attachEvent("onmessage", cb); iframe.setAttribute("src", SizeMe.contextAddress + "/api/authToken.html"); iframe.setAttribute("style", "display:none"); document.body.appendChild(iframe); } else { xhr = createCORSRequest("GET", "/api/authToken", function(xhr) { return callback(JSON.parse(xhr.responseText)); }, function(xhr) { return errorCallback(xhr, xhr.status, xhr.statusText); }); xhr.withCredentials = true; xhr.send(); } }; createFitResponse = function(xhr) { var fitResponse, response, responseMap, size; response = JSON.parse(xhr.responseText); responseMap = new SizeMe.Map(); for (size in response) { if (!hasProp.call(response, size)) continue; fitResponse = response[size]; fitResponse.matchMap = SizeMe.Map.fromObject(fitResponse.matchMap); responseMap.addItem(size, fitResponse); } return responseMap; }; SizeMe.prototype.fetchProfilesForAccount = function(callback, errorCallback) { if (errorCallback == null) { errorCallback = defaultErrorCallback; } createCORSRequest("GET", "/api/profiles", function(xhr) { return callback(JSON.parse(xhr.responseText)); }, function(xhr) { return errorCallback(xhr, xhr.status, xhr.statusText); }).send(); return void 0; }; SizeMe.prototype.match = function(fitRequest, successCallback, errorCallback) { var data, xhr; if (errorCallback == null) { errorCallback = defaultErrorCallback; } data = JSON.stringify(fitRequest); xhr = createCORSRequest("POST", "/api/compareSizes", function(xhr) { return successCallback(createFitResponse(xhr)); }, function(xhr) { return errorCallback(xhr, xhr.status, xhr.statusText); }); if (xhr.setRequestHeader != null) { xhr.setRequestHeader("Content-Type", "application/json"); } xhr.send(data); return void 0; }; SizeMe.prototype.getItemTypes = function(callback, errorCallback) { if (errorCallback == null) { errorCallback = defaultErrorCallback; } createCORSRequest("GET", "/api/itemTypes", function(xhr) { return callback(JSON.parse(xhr.responseText)); }, function(xhr) { return errorCallback(xhr, xhr.status, xhr.statusText); }).send(); return void 0; }; SizeMe.loginFrame = function(callback) { var options, timer, url, win; url = SizeMe.contextAddress + "/loginframe.html"; options = "height=375,width=349,left=200,top=200,location=no,menubar=no, resizable=no,scrollbars=no,toolbar=no"; win = window.open(url, "", options); timer = win != null ? setInterval(function() { if (win.closed) { clearInterval(timer); if (win != null) { return callback(); } } }, 100) : void 0; }; return SizeMe; })(); SizeMe.Map = (function() { function Map() {} Map.prototype.keys = function() { var k, results; results = []; for (k in this) { if (!hasProp.call(this, k)) continue; results.push(k); } return results; }; Map.prototype.each = function(f) { var k, v; for (k in this) { if (!hasProp.call(this, k)) continue; v = this[k]; f(k, v); } return void 0; }; Map.prototype.addItem = function(key, value) { this[key] = value; return this; }; Map.prototype.addItems = function() { var i, items, j, ref; items = 1 <= arguments.length ? slice.call(arguments, 0) : []; if (items.length % 2 !== 0) { throw new Error('Arguments must be "tuples" (example: (key1, value1, key2, value2, ...)'); } for (i = j = 0, ref = items.length; j < ref; i = j += 2) { this.addItem(items[i], items[i + 1]); } return this; }; Map.fromObject = function(obj) { var k, map, v; map = new SizeMe.Map(); for (k in obj) { if (!hasProp.call(obj, k)) continue; v = obj[k]; map.addItem(k, v); } return map; }; return Map; })(); SizeMe.FitRequest = (function() { function FitRequest(profileId, item) { this.profileId = profileId; this.item = item; } return FitRequest; })(); SizeMe.Item = (function() { function Item(itemType, itemLayer, itemThickness, itemStretch) { this.itemType = itemType; this.itemLayer = itemLayer != null ? itemLayer : 0; this.itemThickness = itemThickness != null ? itemThickness : 0; this.itemStretch = itemStretch != null ? itemStretch : 0; this.measurements = new SizeMe.Map(); } Item.prototype.addSize = function(size, measurements) { this.measurements.addItem(size, measurements); return this; }; return Item; })(); SizeMe.FitRange = (function() { var ranges; function FitRange() {} ranges = { too_small: { start: 0, end: 1000 }, slim: { start: 1000, end: 1050 }, regular: { start: 1050, end: 1110 }, loose: { start: 1110, end: 1170 }, too_big: { start: 1170, end: 99990 } }; FitRange.getFitRangeLabels = function() { return ranges; }; FitRange.getFitRangeLabel = function(fitValue) { var label, range, result; result = (function() { var results; results = []; for (label in ranges) { if (!hasProp.call(ranges, label)) continue; range = ranges[label]; if (range.start <= fitValue && range.end > fitValue) { results.push(label); } } return results; })(); return result; }; return FitRange; })(); window.SizeMe = SizeMe; }).call(this);