sizeme.js
Version:
Javascript utils for accessing the SizeMe API
313 lines (272 loc) • 8.53 kB
JavaScript
(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);