<!DOCTYPE html><html><head><script type='text/javascript'>window.NREUM||(NREUM={});NREUM.info = {"agent":"","beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"5661488242","applicationID":"11048357","applicationTime":605.816397,"transactionName":"M1EGbEcDC0cABkFRDQobIUBFEABHEg9GFyUhYEsX","queueTime":0,"ttGuid":"8ab23e95571970","agentToken":null}; (window.NREUM||(NREUM={})).loader_config={xpid:"VQYOV1NaCBABVVFWDwICUQ=="};window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o||e)},o,o.exports)}return e[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e,n){function r(t){try{s.console&&console.log(t)}catch(e){}}var o,i=t("ee"),a=t(15),s={};try{o=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(s.console=!0,o.indexOf("dev")!==-1&&(s.dev=!0),o.indexOf("nr_dev")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on("internal-error",function(t){r(t.stack)}),s.dev&&i.on("fn-err",function(t,e,n){r(n.stack)}),s.dev&&(r("NR AGENT IN DEVELOPMENT MODE"),r("flags: "+a(s,function(t,e){return t}).join(", ")))},{}],2:[function(t,e,n){function r(t,e,n,r,o){try{d?d-=1:i("err",[o||new UncaughtException(t,e,n)])}catch(s){try{i("ierr",[s,(new Date).getTime(),!0])}catch(c){}}return"function"==typeof f&&f.apply(this,a(arguments))}function UncaughtException(t,e,n){this.message=t||"Uncaught error with no additional information",this.sourceURL=e,this.line=n}function o(t){i("err",[t,(new Date).getTime()])}var i=t("handle"),a=t(16),s=t("ee"),c=t("loader"),f=window.onerror,u=!1,d=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(l){"stack"in l&&(t(8),t(7),"addEventListener"in window&&t(5),c.xhrWrappable&&t(9),u=!0)}s.on("fn-start",function(t,e,n){u&&(d+=1)}),s.on("fn-err",function(t,e,n){u&&(this.thrown=!0,o(n))}),s.on("fn-end",function(){u&&!this.thrown&&d>0&&(d-=1)}),s.on("internal-error",function(t){i("ierr",[t,(new Date).getTime(),!0])})},{}],3:[function(t,e,n){t("loader").features.ins=!0},{}],4:[function(t,e,n){function r(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var o=t("ee"),i=t("handle"),a=t(8),s=t(7),c="learResourceTimings",f="addEventListener",u="resourcetimingbufferfull",d="bstResource",l="resource",p="-start",h="-end",m="fn"+p,w="fn"+h,v="bstTimer",y="pushState";t("loader").features.stn=!0,t(6);var g=NREUM.o.EV;o.on(m,function(t,e){var n=t[0];n instanceof g&&(this.bstStart=Date.now())}),o.on(w,function(t,e){var n=t[0];n instanceof g&&i("bst",[n,e,this.bstStart,Date.now()])}),a.on(m,function(t,e,n){this.bstStart=Date.now(),this.bstType=n}),a.on(w,function(t,e){i(v,[e,this.bstStart,Date.now(),this.bstType])}),s.on(m,function(){this.bstStart=Date.now()}),s.on(w,function(t,e){i(v,[e,this.bstStart,Date.now(),"requestAnimationFrame"])}),o.on(y+p,function(t){this.time=Date.now(),this.startPath=location.pathname+location.hash}),o.on(y+h,function(t){i("bstHist",[location.pathname+location.hash,this.startPath,this.time])}),f in window.performance&&(window.performance["c"+c]?window.performance[f](u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["c"+c]()},!1):window.performance[f]("webkit"+u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["webkitC"+c]()},!1)),document[f]("scroll",r,!1),document[f]("keypress",r,!1),document[f]("click",r,!1)}},{}],5:[function(t,e,n){function r(t){for(var e=t;e&&!e.hasOwnProperty(u);)e=Object.getPrototypeOf(e);e&&o(e)}function o(t){s.inPlace(t,[u,d],"-",i)}function i(t,e){return t[1]}var a=t("ee").get("events"),s=t(17)(a),c=t("gos"),f=XMLHttpRequest,u="addEventListener",d="removeEventListener";e.exports=a,"getPrototypeOf"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+"-start",function(t,e){if(t[1]){var n=t[1];if("function"==typeof n){var r=c(n,"nr@wrapped",function(){return s(n,"fn-",null,n.name||"anonymous")});this.wrapped=t[1]=r}else"function"==typeof n.handleEvent&&s.inPlace(n,["handleEvent"],"fn-")}}),a.on(d+"-start",function(t){var e=this.wrapped;e&&(t[1]=e)})},{}],6:[function(t,e,n){var r=t("ee").get("history"),o=t(17)(r);e.exports=r,o.inPlace(window.history,["pushState","replaceState"],"-")},{}],7:[function(t,e,n){var r=t("ee").get("raf"),o=t(17)(r),i="equestAnimationFrame";e.exports=r,o.inPlace(window,["r"+i,"mozR"+i,"webkitR"+i,"msR"+i],"raf-"),r.on("raf-start",function(t){t[0]=o(t[0],"fn-")})},{}],8:[function(t,e,n){function r(t,e,n){t[0]=a(t[0],"fn-",null,n)}function o(t,e,n){this.method=n,this.timerDuration="number"==typeof t[1]?t[1]:0,t[0]=a(t[0],"fn-",this,n)}var i=t("ee").get("timer"),a=t(17)(i),s="setTimeout",c="setInterval",f="clearTimeout",u="-start",d="-";e.exports=i,a.inPlace(window,[s,"setImmediate"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,"clearImmediate"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],9:[function(t,e,n){function r(t,e){d.inPlace(e,["onreadystatechange"],"fn-",s)}function o(){var t=this,e=u.context(t);t.readyState>3&&!e.resolved&&(e.resolved=!0,u.emit("xhr-resolved",[],t)),d.inPlace(t,w,"fn-",s)}function i(t){v.push(t),h&&(g=-g,b.data=g)}function a(){for(var t=0;t<v.length;t++)r([],v[t]);v.length&&(v=[])}function s(t,e){return e}function c(t,e){for(var n in t)e[n]=t[n];return e}t(5);var f=t("ee"),u=f.get("xhr"),d=t(17)(u),l=NREUM.o,p=l.XHR,h=l.MO,m="readystatechange",w=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],v=[];e.exports=u;var y=window.XMLHttpRequest=function(t){var e=new p(t);try{u.emit("new-xhr",[e],e),e.addEventListener(m,o,!1)}catch(n){try{u.emit("internal-error",[n])}catch(r){}}return e};if(c(p,y),y.prototype=p.prototype,d.inPlace(y.prototype,["open","send"],"-xhr-",s),u.on("send-xhr-start",function(t,e){r(t,e),i(e)}),u.on("open-xhr-start",r),h){var g=1,b=document.createTextNode(g);new h(a).observe(b,{characterData:!0})}else f.on("fn-end",function(t){t[0]&&t[0].type===m||a()})},{}],10:[function(t,e,n){function r(t){var e=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<d;r++)t.removeEventListener(u[r],this.listener,!1);if(!e.aborted){if(n.duration=(new Date).getTime()-this.startTime,4===t.readyState){e.status=t.status;var i=o(t,this.lastSize);if(i&&(n.rxSize=i),this.sameOrigin){var a=t.getResponseHeader("X-NewRelic-App-Data");a&&(e.cat=a.split(", ").pop())}}else e.status=0;n.cbTime=this.cbTime,f.emit("xhr-done",[t],t),s("xhr",[e,n,this.startTime])}}}function o(t,e){var n=t.responseType;if("json"===n&&null!==e)return e;var r="arraybuffer"===n||"blob"===n||"json"===n?t.response:t.responseText;return h(r)}function i(t,e){var n=c(e),r=t.params;r.host=n.hostname+":"+n.port,r.pathname=n.pathname,t.sameOrigin=n.sameOrigin}var a=t("loader");if(a.xhrWrappable){var s=t("handle"),c=t(11),f=t("ee"),u=["load","error","abort","timeout"],d=u.length,l=t("id"),p=t(14),h=t(13),m=window.XMLHttpRequest;a.features.xhr=!0,t(9),f.on("new-xhr",function(t){var e=this;e.totalCbs=0,e.called=0,e.cbTime=0,e.end=r,e.ended=!1,e.xhrGuids={},e.lastSize=null,p&&(p>34||p<10)||window.opera||t.addEventListener("progress",function(t){e.lastSize=t.loaded},!1)}),f.on("open-xhr-start",function(t){this.params={method:t[0]},i(this,t[1]),this.metrics={}}),f.on("open-xhr-end",function(t,e){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid)}),f.on("send-xhr-start",function(t,e){var n=this.metrics,r=t[0],o=this;if(n&&r){var i=h(r);i&&(n.txSize=i)}this.startTime=(new Date).getTime(),this.listener=function(t){try{"abort"===t.type&&(o.params.aborted=!0),("load"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof e.onload))&&o.end(e)}catch(n){try{f.emit("internal-error",[n])}catch(r){}}};for(var a=0;a<d;a++)e.addEventListener(u[a],this.listener,!1)}),f.on("xhr-cb-time",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof n.onload||this.end(n)}),f.on("xhr-load-added",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),f.on("xhr-load-removed",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),f.on("addEventListener-end",function(t,e){e instanceof m&&"load"===t[0]&&f.emit("xhr-load-added",[t[1],t[2]],e)}),f.on("removeEventListener-end",function(t,e){e instanceof m&&"load"===t[0]&&f.emit("xhr-load-removed",[t[1],t[2]],e)}),f.on("fn-start",function(t,e,n){e instanceof m&&("onload"===n&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=(new Date).getTime()))}),f.on("fn-end",function(t,e){this.xhrCbStart&&f.emit("xhr-cb-time",[(new Date).getTime()-this.xhrCbStart,this.onload,e],e)})}},{}],11:[function(t,e,n){e.exports=function(t){var e=document.createElement("a"),n=window.location,r={};e.href=t,r.port=e.port;var o=e.href.split("://");!r.port&&o[1]&&(r.port=o[1].split("/")[0].split("@").pop().split(":")[1]),r.port&&"0"!==r.port||(r.port="https"===o[0]?"443":"80"),r.hostname=e.hostname||n.hostname,r.pathname=e.pathname,r.protocol=o[0],"/"!==r.pathname.charAt(0)&&(r.pathname="/"+r.pathname);var i=!e.protocol||":"===e.protocol||e.protocol===n.protocol,a=e.hostname===document.domain&&e.port===n.port;return r.sameOrigin=i&&(!e.hostname||a),r}},{}],12:[function(t,e,n){function r(){}function o(t,e,n){return function(){return i(t,[(new Date).getTime()].concat(s(arguments)),e?null:this,n),e?void 0:this}}var i=t("handle"),a=t(15),s=t(16),c=t("ee").get("tracer"),f=NREUM;"undefined"==typeof window.newrelic&&(newrelic=f);var u=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit"],d="api-",l=d+"ixn-";a(u,function(t,e){f[e]=o(d+e,!0,"api")}),f.addPageAction=o(d+"addPageAction",!0),e.exports=newrelic,f.interaction=function(){return(new r).get()};var p=r.prototype={createTracer:function(t,e){var n={},r=this,o="function"==typeof e;return i(l+"tracer",[Date.now(),t,n],r),function(){if(c.emit((o?"":"no-")+"fn-start",[Date.now(),r,o],n),o)try{return e.apply(this,arguments)}finally{c.emit("fn-end",[Date.now()],n)}}}};a("setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,e){p[e]=o(l+e)}),newrelic.noticeError=function(t){"string"==typeof t&&(t=new Error(t)),i("err",[t,(new Date).getTime()])}},{}],13:[function(t,e,n){e.exports=function(t){if("string"==typeof t&&t.length)return t.length;if("object"==typeof t){if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!("undefined"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(e){return}}}},{}],14:[function(t,e,n){var r=0,o=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);o&&(r=+o[1]),e.exports=r},{}],15:[function(t,e,n){function r(t,e){var n=[],r="",i=0;for(r in t)o.call(t,r)&&(n[i]=e(r,t[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],16:[function(t,e,n){function r(t,e,n){e||(e=0),"undefined"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(o<0?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=r},{}],17:[function(t,e,n){function r(t){return!(t&&"function"==typeof t&&t.apply&&!t[a])}var o=t("ee"),i=t(16),a="nr@original",s=Object.prototype.hasOwnProperty,c=!1;e.exports=function(t){function e(t,e,n,o){function nrWrapper(){var r,a,s,c;try{a=this,r=i(arguments),s="function"==typeof n?n(r,a):n||{}}catch(u){d([u,"",[r,a,o],s])}f(e+"start",[r,a,o],s);try{return c=t.apply(a,r)}catch(l){throw f(e+"err",[r,a,l],s),l}finally{f(e+"end",[r,a,c],s)}}return r(t)?t:(e||(e=""),nrWrapper[a]=t,u(t,nrWrapper),nrWrapper)}function n(t,n,o,i){o||(o="");var a,s,c,f="-"===o.charAt(0);for(c=0;c<n.length;c++)s=n[c],a=t[s],r(a)||(t[s]=e(a,f?s+o:o,i,s))}function f(e,n,r){if(!c){c=!0;try{t.emit(e,n,r)}catch(o){d([o,e,n,r])}c=!1}}function u(t,e){if(Object.defineProperty&&Object.keys)try{var n=Object.keys(t);return n.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(r){d([r])}for(var o in t)s.call(t,o)&&(e[o]=t[o]);return e}function d(e){try{t.emit("internal-error",e)}catch(n){}}return t||(t=o),e.inPlace=n,e.flag=a,e}},{}],ee:[function(t,e,n){function r(){}function o(t){function e(t){return t&&t instanceof r?t:t?s(t,a,i):i()}function n(n,r,o){t&&t(n,r,o);for(var i=e(o),a=l(n),s=a.length,c=0;c<s;c++)a[c].apply(i,r);var u=f[w[n]];return u&&u.push([v,n,r,i]),i}function d(t,e){m[t]=l(t).concat(e)}function l(t){return m[t]||[]}function p(t){return u[t]=u[t]||o(n)}function h(t,e){c(t,function(t,n){e=e||"feature",w[n]=e,e in f||(f[e]=[])})}var m={},w={},v={on:d,emit:n,get:p,listeners:l,context:e,buffer:h};return v}function i(){return new r}var a="nr@context",s=t("gos"),c=t(15),f={},u={},d=e.exports=o();d.backlog=f},{}],gos:[function(t,e,n){function r(t,e,n){if(o.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[e]=r,r}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){o.buffer([t],r),o.emit(t,e,n)}var o=t("ee").get("handle");e.exports=r,r.ee=o},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||"object"!==e&&"function"!==e?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i="nr@id",a=t("gos");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!g++){var t=y.info=NREUM.info,e=u.getElementsByTagName("script")[0];if(t&&t.licenseKey&&t.applicationID&&e){c(w,function(e,n){t[e]||(t[e]=n)});var n="https"===m.split(":")[0]||t.sslForHttp;y.proto=n?"https://":"http://",s("mark",["onload",a()],null,"api");var r=u.createElement("script");r.src=y.proto+t.agent,e.parentNode.insertBefore(r,e)}}}function o(){"complete"===u.readyState&&i()}function i(){s("mark",["domContent",a()],null,"api")}function a(){return(new Date).getTime()}var s=t("handle"),c=t(15),f=window,u=f.document,d="addEventListener",l="attachEvent",p=f.XMLHttpRequest,h=p&&p.prototype;NREUM.o={ST:setTimeout,CT:clearTimeout,XHR:p,REQ:f.Request,EV:f.Event,PR:f.Promise,MO:f.MutationObserver},t(12);var m=""+location,w={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-974.min.js"},v=p&&h&&h[d]&&!/CriOS/.test(navigator.userAgent),y=e.exports={offset:a(),origin:m,features:{},xhrWrappable:v};u[d]?(u[d]("DOMContentLoaded",i,!1),f[d]("load",r,!1)):(u[l]("onreadystatechange",o),f[l]("onload",r)),s("mark",["firstbyte",a()],null,"api");var g=0},{}]},{},["loader",2,10,4,3]);</script><title>Top Rated Products on Shopperr</title><meta name="description" content="Shop for Top Rated Products on Shopperr."><meta name="charset" content="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="msvalidate.01" content="3F9B33FD3FAA6FFAB32A29B28B5534FB"><meta name="google-site-verification" content="9xfit9mO-D4wojZfHRITlvQYPVlcXJvx5I77RYfdtJQ"><link href="http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,600,700,300,800" rel="stylesheet" type="text/css"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"><link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"><link href="/stylesheets/index.css" rel="stylesheet"></head><body><ul class="views"><li class="product-card"><div class="imagehover"><img src=""></div><div class="card"><div class="id"></div><div class="price"></div><div class="cardscore"><ul class="scoreradial-small">
<li class="scoreradialcontent-small" data-name="Great!" data-percent="86">
<svg viewBox="-15 -15 230 230">
<g fill="none" stroke-width="23" transform="translate(100,100)">
<path d="M 0 -100 a 100 100 0 1 0 0.1 0" stroke="url(#cl2)"/>
</g>
</svg>
<svg viewBox="-15 -15 230 230">
<path class="scoreradialpath-small" d="M 100 0 a 100 100 0 1 0 0.1 0" stroke-dashoffset="540"></path>
</svg>
</li>
</ul>
<svg width="0" height="0">
<defs>
<linearGradient gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="1">
<stop class="scoreradialstop1-small" stop-color="#40d0ac"/>
<stop class="scoreradialstop2-small" offset="100%" stop-color="#40d0ac"/>
</linearGradient>
</defs>
</svg></div><a class="titlelink"><h2 class="title"></h2></a><div class="manufacturer small"></div><div class="miniDescription small"></div></div></li></ul> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-WN76FN" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><script>(function(w,d,s,l,i){
  w[l]=w[l]||[];
  w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});
  var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
  j.async=true;
  j.src='//www.googletagmanager.com/gtm.js?id='+i+dl;
  f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-WN76FN');
</script> <div id="productModal-cover" style="opacity:0;display:none;" class="modal-cover"></div><div id="productModal" class="modal fade productmodal"><div class="modal-dialog modal-lg"><div class="arrow-left"><span class="ion-chevron-left"></span></div><div class="arrow-right"><span class="ion-chevron-right"></span></div><div class="modal-content"><div class="modal-fadeout-1"></div><div class="modal-fadeout-2"></div><div class="modal-body"><div id="productModal-scoreDetailBack" style="display:none;"><span style="margin-right:6px;font-size:16px;float:left;" class="ion-chevron-left">&nbsp;</span><span style="line-height:1.6em;">Product Details</span></div><div id="productModal-imageDetailBack" style="display:none;"><span style="margin-right:6px;font-size:16px;float:left;" class="ion-chevron-left">&nbsp;</span><span style="line-height:1.6em;">Product Details</span></div><div id="productModal-id" class="id"></div><button type="button" data-dismiss="modal" class="close"><span>&times;</span></button><div class="container-fluid"><div class="row"><div class="col-md-6 col-md-offset-6"><span id="productModal-subtitle" class="grey"></span><h4 id="productModal-title" class="modal-title"></h4><div class="price"><div class="priceline"></div><div id="productModal-price">0</div><div class="priceline"></div></div><div class="imagerow"><div id="productModal-images" class="images"></div><div class="images-shadow-container"><div class="images-shadow"></div></div></div><div id="productModal-imagebars" class="imagebars"></div><div id="productModal-score" class="score"><ul class="scoreradial">
<li id="productModal-scoreradialcontent" data-name="Great!" data-percent="86">
<svg viewBox="-10 -10 220 220">
<g fill="none" stroke-width="14" transform="translate(100,100)">
<path d="M 0 -100 a 100 100 0 1 0 0.1 0" stroke="url(#cl1)"/>
</g>
</svg>
<svg viewBox="-10 -10 220 220">
<path id="productModal-scoreradialpath" d="M 100 0 a 100 100 0 1 0 0.1 0" stroke-dashoffset="540"></path>
</svg>
<div class="scorebanner">Shopperr Score</div>
<div class="scorebanner-corner1"></div>
<div class="scorebanner-corner2"></div>
</li>
</ul>
<svg width="0" height="0">
<defs>
<linearGradient id="cl1" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="1">
<stop id="productModal-scoreradialstop1" stop-color="#40d0ac"/>
<stop id="productModal-scoreradialstop2" offset="100%" stop-color="#40d0ac"/>
</linearGradient>
</defs>
</svg><div id="productModal-totalReviews">58 Opinions</div><div style="display:none;" class="scoreDescription"> <p id="productModal-scoreDescription">This product is highly rated and shared. <br>You can buy this with confidence.<br></p><p style="margin-top:6px;"><a href="/about" target="_blank">Learn More <span style="font-size:10px;" class="ion-chevron-right"></span></a></p></div><ul class="socialcounts"><li><span class="counticon ion-social-facebook"> </span><span id="productModal-facebookCount" class="countcontent">58 shares</span></li><li><span class="counticon ion-social-twitter"> </span><span id="productModal-twitterCount" class="countcontent">58 tweets</span></li><li><span class="counticon ion-social-pinterest"> </span><span id="productModal-pinterestCount" class="countcontent">58 pins</span></li><li><span class="counticon fa fa-amazon"></span><span id="productModal-amazonCount" class="countcontent">5.0 stars</span></li></ul><ul style="display:none;" class="socialcountdetails"><li><div id="productModal-facebookProgress" class="progress"><div style="width:40%;" class="progress-bar"></div></div></li><li><div id="productModal-twitterProgress" class="progress"><div style="width:40%;" class="progress-bar"></div></div></li><li><div id="productModal-pinterestProgress" class="progress"><div style="width:40%;" class="progress-bar"></div></div></li><li><div id="productModal-amazonProgress" class="progress"><div style="width:40%;" class="progress-bar"></div></div></li></ul></div><a href="#" id="productModal-buy" target="_blank">ADD TO CART</a><div id="productModal-descriptionContainer"><p id="productModal-description"></p></div><div id="productModal-divider"></div><div id="productModal-featuresContainer"><h4>Details</h4><ul id="productModal-features" class="features"></ul></div><div id="productModal-similarHeader">Similar Products<div id="productModal-similar"><ul></ul></div></div></div></div></div></div></div></div></div><div id="searchmodalbg"></div><div id="searchModal" class="searchmodal"><div class="searchmodal-body"><div class="container-fluid"><div class="row"><div class="col-xs-11 left-container"><div id="show-search2" class="icon"><span class="glyphicon glyphicon-search"></span></div><input id="searchbox" placeholder="Search..." class="searchbox"></div><div class="col-xs-1 right-container"><button id="searchmodalclose" type="button" class="modal-close-button close"><span>&times;</span></button></div></div><div class="row"><div class="col-xs-12 search-results-container"><ul id="searchresults" class="searchresults spaced"></ul></div></div></div></div></div><div id="sideMenu" class="sidemenu"><button type="button" id="sideMenu-close" class="close"><span>&times;</span></button><div class="topSection"><a href="/" class="sideMenuButton"> <span class="ion-ios-home"></span><span>Explore</span></a><a href="/" class="sideMenuButton"> <span class="ion-heart"></span><span>Trending</span></a><a href="/featured/toprated" class="sideMenuButton"> <span class="ion-checkmark"></span><span>Top Rated</span></a><a href="/browse" class="sideMenuButton"> <span class="ion-grid"></span><span>Browse</span></a></div><div class="bottomSection"><a href="/blog" class="sideMenuButton"><span>Blog</span></a><a href="/about" target="_blank" class="sideMenuButton"><span>About</span></a><a href="/privacy" target="_blank" class="sideMenuButton"><span>Privacy</span></a><a href="/terms" target="_blank" class="sideMenuButton"><span>Terms</span></a><a href="/cdn-cgi/l/email-protection#61090e1605182112090e11110413134f020e0c" target="_blank" class="sideMenuButton"><span>Contact</span></a></div><div class="footerSection"><span>Shopperr © 2016</span></div></div><div class="main"><header><nav><div class="container-fluid"><div class="row"><div class="col-xs-3 col-sm-4 col-md-3"><div id="show-search" class="pull-left icon"><span class="glyphicon glyphicon-search"></span></div><div class="pull-left icontext icon"><a href="/browse">Browse</a></div></div><div class="col-xs-5 col-sm-4 col-md-6"><div class="logo"><a href="/"> <img src="/images/logo-white.svg"></a></div></div><div class="col-xs-4 col-sm-4 col-md-3"><div id="show-menu" class="pull-right icon"><span class="glyphicon glyphicon-menu-hamburger"></span></div></div></div></div></nav><nav class="navbar navbar-default"><div class="container-fluid"><div id="secondmenu-collapse"><ul class="nav navbar-nav"><li><a href="/" class="active">Score</a></li><li><a href="/featured/trending">Trending</a></li><li><a href="/featured/buzz">Buzz</a></li></ul></div></div></nav><div class="search"></div></header><main><div class="products"><ul class="short"></ul></div><div class="cube"><div class="tcube c1"></div><div class="tcube c2"></div><div class="tcube c4"></div><div class="tcube c3"></div></div><div class="cartContainer"><div class="cartControls"><button data-dismiss="cart" type="button" class="close ion-android-close"></button><button type="button" class="back ion-android-arrow-back"></button></div><div class="cartHeader"></div><div class="cartBody vertical-center text-center material"><div class="container"><div class="row"><div id="cartContents" class="col-sm-12"><div>hi</div></div></div></div></div></div><div id="cartViews" style="display:none;"><div data-cartStep="100" class="cartStep"><div class="field">Loading order details...</div></div><div data-cartStep="1" class="cartStep"></div><div data-cartStep="2" class="cartStep"><div class="field">What is your email address?</div><div class="field-xl"><input name="signupEmail" type="email" class="form-control-material"></div><div onclick="transitionCart(3);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="3" class="cartStep"><div class="field">What is your full name?</div><div class="field-xl"><input name="signupFirstName" type="text" style="margin-right:24px;" class="form-control-material form-control-md"><input name="signupLastName" type="text" class="form-control-material form-control-md"></div><div onclick="transitionCart(4);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="4" class="cartStep"><div class="field">What is your phone number?</div><div class="field-xl"><input name="signupPhone" type="tel" class="form-control-material"></div><div onclick="transitionCart(5);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="5" class="cartStep"><div class="field">What is your shipping address?</div><div class="field-xl"><input name="shippingAddress" type="text" class="form-control-material autocomplete-address"><div class="autocomplete-address-options"></div></div><div onclick="transitionCart(6);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="6" class="cartStep"><div class="field">Do you have a suite or apartment number?</div><div class="field-xl"><div onclick="transitionCart(7);" class="btn btn-white">Yes</div><div onclick="" class="btn btn-white btn-submitshipping">No</div></div><div onclick="transitionCart(7);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="7" class="cartStep"><div class="field">What is your suite or apartment number?</div><div class="field-xl"><input name="shippingAddress2" type="text" class="form-control-material"></div><div onclick="" class="btn btn-next btn-submitshipping"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="8" class="cartStep"><div class="field">Is your billing address the same as your shipping address?</div><div class="field-xl"><div onclick="transitionCart(12);" class="btn btn-white">Yes</div><div onclick="transitionCart(9);" class="btn btn-white">No</div></div><div onclick="transitionCart(9);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="9" class="cartStep"><div class="field">What is your billing address?</div><div class="field-xl"><input name="billingAddress" type="text" class="form-control-material autocomplete-address"><div class="autocomplete-address-options"></div></div><div onclick="transitionCart(10);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="10" class="cartStep"><div class="field">Do you have a suite or apartment number?</div><div class="field-xl"><div onclick="transitionCart(11);" class="btn btn-white">Yes</div><div onclick="transitionCart(12);" class="btn btn-white">No</div></div><div onclick="transitionCart(11);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="11" class="cartStep"><div class="field">What is your suite or apartment number?</div><div class="field-xl"><input name="billingAddress2" type="text" class="form-control-material"></div><div onclick="transitionCart(12);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="12" class="cartStep"><div class="field">What is your credit card number?</div><div class="field-xl"><input placeholder="Number" name="billingCardNumber" type="text" maxlength="16" style="margin-right:24px;" class="form-control-material"><input placeholder="CVV" name="billingCardCVV" maxlength="4" type="text" class="form-control-material form-control-sm"></div><div onclick="transitionCart(13);" class="btn btn-next"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="13" class="cartStep"><div class="field">When does your credit card expire?</div><div class="field-xl"><input placeholder="MM" name="billingCardMonth" type="text" maxlength="2" style="margin-right:24px;" class="form-control-material form-control-sm"><input placeholder="YYYY" name="billingCardYear" maxlength="4" type="text" class="form-control-material form-control-sm"></div><div onclick="" class="btn btn-next btn-submitbilling"><div class="ion-android-arrow-forward"></div></div></div><div data-cartStep="14" class="cartStep"><div class="field">Loading order summary...</div></div><div data-cartStep="15" class="cartStep"><div class="field">Order complete. Thank you!</div></div></div><div id="cartPlaceNode" style="display:none;"></div></main><div class="terms"><p>Popular Searches</p><ul><li><a href="/products/power%20plate">power plate</a></li><li><a href="/products/iphone%205%20charger%20portable">iphone 5 charger portable</a></li><li><a href="/products/65%20inch%20tv">65 inch tv</a></li><li><a href="/products/64%20gb">64 gb</a></li><li><a href="/products/2%20door%20floor%20cabinet">2 door floor cabinet</a></li><li><a href="/products/canon%2035mm%20lenses">canon 35mm lenses</a></li><li><a href="/products/dvi%20to%20usb%20adapter">dvi to usb adapter</a></li><li><a href="/products/ip%20management">ip management</a></li><li><a href="/products/watch%20compass%20thermometer">watch compass thermometer</a></li><li><a href="/products/1tb%207200rpm%202%205%20sata">1tb 7200rpm 2 5 sata</a></li><li><a href="/products/sonicwall%20firewall">sonicwall firewall</a></li><li><a href="/products/wireless%20lan%20adapter">wireless lan adapter</a></li><li><a href="/products/say%20no">say no</a></li><li><a href="/products/factor">factor</a></li><li><a href="/products/image%20film%20scanner">image film scanner</a></li><li><a href="/products/patio%20screen">patio screen</a></li><li><a href="/products/desktop%20monitor">desktop monitor</a></li><li><a href="/products/mh%20hps%20ballast">mh hps ballast</a></li><li><a href="/products/invicta%20automatic%20diver">invicta automatic diver</a></li><li><a href="/products/adobe%20photoshop%205">adobe photoshop 5</a></li><li><a href="/products/portable%20dvd%20players%20with%20sd%20card">portable dvd players with sd card</a></li><li><a href="/products/mac%20os%20x%20mountain%20lion">mac os x mountain lion</a></li><li><a href="/products/led%20countdown%20timer">led countdown timer</a></li><li><a href="/products/500%20watt%20power%20supply">500 watt power supply</a></li><li><a href="/products/c%20cell%20led%20flashlight">c cell led flashlight</a></li></ul></div><script src="/js/jquery-2.1.4.min.js"></script><script src="/js/mousewheel.min.js"></script><script src="/js/waitforimages.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script><script src="/js/materialize.min.js"></script><script src="/js/jquery.dotdotdot.min.js"></script><script src="/js/braintree.js"></script><script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCiiw6_qitPaSNAS21_WVinkWjEGbZausE&amp;libraries=places"></script><script src="/js/uuid.js"></script><script src="/js/index.js"></script></div><script type="text/javascript">/* <![CDATA[ */(function(d,s,a,i,j,r,l,m,t){try{l=d.getElementsByTagName('a');t=d.createElement('textarea');for(i=0;l.length-i;i++){try{a=l[i].href;s=a.indexOf('/cdn-cgi/l/email-protection');m=a.length;if(a&&s>-1&&m>28){j=28+s;s='';if(j<m){r='0x'+a.substr(j,2)|0;for(j+=2;j<m&&a.charAt(j)!='X';j+=2)s+='%'+('0'+('0x'+a.substr(j,2)^r).toString(16)).slice(-2);j++;s=decodeURIComponent(s)+a.substr(j,m-j)}t.innerHTML=s.replace(/</g,'&lt;').replace(/>/g,'&gt;');l[i].href='mailto:'+t.value}}catch(e){}}}catch(e){}})(document);/* ]]> */</script></body></html><script type="text/javascript">var productsVisible = false;

var _CartUrl = 'https://cart-api.bringhub.com';
var _APIUrl = 'https://api.bringhub.io';
var _PaymentUrl = 'https://secure-payment.bringhub.com';
var _PublisherId = '174';
var _PartnerId = '1560';
var _SessionId = uuid.v1();
var _GooglePlacesQuery;
var _GooglePlacesDetails;

function initService(){
  _GooglePlacesQuery = new google.maps.places.AutocompleteService();
  _GooglePlacesDetails = new google.maps.places.PlacesService($('#cartPlaceNode')[0]);
  //- service.getQueryPredictions({ input: 'pizza near Syd' }, displaySuggestions);
}

$(document).ready(function(){
  initService();
});

function locationAutoCb(predictions, status){
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    console.log(status);
    return;
  }

  //- predictions.forEach(function(prediction) {
  //-   var li = document.createElement('li');
  //-   li.appendChild(document.createTextNode(prediction.description));
  //-   document.getElementById('results').appendChild(li);
  //- });
  //- console.log(predictions);
}

function locationAuto(str, cb){
  //- $.ajax({
  //-   type: 'GET',
  //-   url: 'https://maps.googleapis.com/maps/api/place/autocomplete/json?key='+_GoogleAppKey+'&input='+encodeURIComponent(str),
  //-   error: function(err){
  //-     console.log(err);
  //-   },
  //-   success: function(data){
  //-     console.log(data);
  //-   }
  //- });
  _GooglePlacesQuery.getPlacePredictions({input:str}, cb);
}

$('[data-dismiss="cart"]').click(function(){
  //- $(this).parents('.cartContainer').removeClass('in');
  //- var that = $(this).parents('.cartContainer');
  //- setTimeout(function(){
  //-   that.css('display', 'none');
  //- }, 500);
  endCart();
});
function showCart(){
  $('.cartContainer').css('display', 'block');
  setTimeout(function(){
    $('.cartContainer').addClass('in');
  }, 1)
}

/*$.ajax({
  type: 'POST',
  dataType: 'json',
  contentType: 'application/json',
  url: _CartUrl+'/payments/payment_gateway',
  headers: {
    'X-Partner-Id':_PartnerId,
    'X-Publisher-Id':_PublisherId,
    'X-Session-Id':_SessionId,
    'Accept':'application/json'
  },
  data: data,
  error: function(err){
    cb(err);
  },
  success: function(data){
    cb(null, data);
  }
});*/

_Products = [];
Products = {};
for(var i = 0; i < _Products.length; i++){
  Products[_Products[i].id] = _Products[i];
}
ProductList = "toprated";
ProductSearch = "";
ProductCategory = "";
ProductSearchType = "magic";
API_URL = 'http://api.shopperr.com/';
var truncate = function(string, length) {
  if (!string || string.length <= length) {
    return string;
  }
  string += ' ';
  string = string.slice(0, length);
  while (!(string.slice(-1) === " " || string === "")) {
    string = string.slice(0, -1);
  }
  while (!/[A-Za-z]/.test(string.slice(-1) || string === "")) {
    string = string.slice(0, -1);
  }
  return string;// + "&hellip;";
};
var featuresFilter = function(a) {
  var ret = [];
  for(var i in a){
    if(a[i].length < 60)
      ret.push(a[i]);
  }
  return ret;
};

$(function(){
  $('body').keyup(function(e){
    if(e.which == 27){
      $('#productModal').modal('hide');
    }
  });

  var scoreDetailMode = false;
  var imageDetailMode = false;

  setActiveModalImage = function(e){
    if(!e){
      ActiveModalImage = 0;
    }else{
      var target = $(e.relatedTarget);
      $('#productModal .carousel-inner .item').each(function(i){
        if($(this)[0] == target[0]){
          ActiveModalImage = i;
        }
      });
    }
    
    $('#productModal .imagebar').each(function(i){
      if(i == ActiveModalImage)
        $(this).addClass('active');
      else
        $(this).removeClass('active');
    });
  }

  $('#productModal #productModal-score').click(function(){
    if(scoreDetailMode == false){
      $('#productModal .modal-body').addClass('out');
      setTimeout(function(){
        showScoreDetail();
        $('#productModal .modal-body').removeClass('out');
      }, 600);
    }
  });
  $('#productModal #productModal-scoreDetail').click(function(){
    $('#productModal .modal-body').addClass('out');
    setTimeout(function(){
      showScoreDetail();
      $('#productModal .modal-body').removeClass('out');
    }, 600);
  });
  $('#productModal-scoreDetailBack').click(function(){
    $('#productModal .modal-body').addClass('out');
    setTimeout(function(){
      hideScoreDetail();
      $('#productModal .modal-body').removeClass('out');
      updateMores();
    }, 600);
  });
  $('#productModal-imageDetailBack').click(function(){
    $('#productModal .modal-body').addClass('out');
    setTimeout(function(){
      hideImageDetail();
      $('#productModal .modal-body').removeClass('out');
      updateMores();
    }, 600);
  });
  function showScoreDetail(){
    scoreDetailMode = true;
    $('#productModal .scorebanner-corner1').css('background-color', '#fff');
    $('#productModal .scorebanner-corner2').css('background-color', '#fff');
    $('#productModal-score').css('background-color', '#fff');
    $('#productModal-score').css('cursor', 'auto');
    $('.socialcounts-background').css('opacity', 1);

    //$('#productModal .arrow-left').hide();
    //$('#productModal .arrow-right').hide();

    $('#productModal .modal-body').css('transform', 'translateY(0px)');
    if(window.matchMedia('(min-width: 1200px)').matches){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .container-fluid').css('margin-top', '18px'); //28px
      $('#productModal-totalReviews').css('width', '334px'); //0px
      $('#productModal .scoreradial').css('left', '90px'); //-82px
      $('#productModal .socialcounts').css('left', '110px'); //180px
      $('#productModal .socialcountdetails').css('left', '280px'); //180px
      $('#productModal .scoreDescription').css('left', '310px'); //-82px
    }else if(window.matchMedia('(min-width: 992px)').matches){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .container-fluid').css('margin-top', '18px'); //28px
      $('#productModal-totalReviews').css('width', '214px'); //0px
      $('#productModal .scoreradial').css('left', '30px'); //-82px
      $('#productModal .socialcounts').css('left', '50px'); //180px
    }else if(window.matchMedia('(min-width: 768px)').matches){
      $('#productModal-totalReviews').css('left', '0px'); //0px
      $('#productModal-totalReviews').css('width', '270px'); //0px
      $('#productModal .scoreradial').css('left', '60px'); //-82px
      $('#productModal .scoreDescription').css('left', '240px'); //-82px
      $('#productModal .socialcounts').css('left', '60px'); //180px
      $('#productModal .socialcountdetails').css('left', '230px'); //180px
    }else{
      $('#productModal-totalReviews').css('left', '-10px'); //0px
      $('#productModal-totalReviews').css('width', '154px'); //0px
      $('#productModal .container-fluid').css('margin-top', '42px'); //28px
      $('#productModal .scoreradial').css('left', '-10px'); //-82px
      $('#productModal .socialcounts').css('left', '-40px'); //180px
      $('#productModal .scoreDescription').css('left', '160px'); //-82px
      $('#productModal .scoreDescription').css('top', '50px'); //-82px
      $('#productModal .socialcountdetails').css('left', '140px'); //180px
      $('#productModal .socialcountdetails .progress').css('width', '130px'); //180px
    }
    $('#productModal .imagerow').hide();
    var col = $('#productModal .row .col-md-6');
    col.removeClass('col-md-6');
    col.removeClass('col-md-offset-6');
    col.addClass('col-md-8');
    col.addClass('col-md-offset-2');
    $('#productModal-subtitle').hide();
    $('#productModal .price').hide();
    $('#productModal-title').css('margin-bottom', '20px'); //0px
    $('#productModal-scoreDetail').hide();
    $('#productModal-imageDetail').hide();
    $('#productModal .imagebars').hide();
    $('#productModal-buy').hide();
    $('#productModal-description').hide();
    $('#productModal-featuresContainer').hide();
    $('#productModal .socialcounts').css('position', 'relative'); //absolute
    $('#productModal .socialcounts').css('top', '60px'); //24px
    $('#productModal .scoreDescription').show();
    $('#productModal-scoreDetailBack').show();
    $('#productModal .socialcountdetails').show();
  }
  function hideScoreDetail(){
    scoreDetailMode = false;
    $('.socialcounts-background').css('opacity', 0);

    $('#productModal .arrow-left').show();
    $('#productModal .arrow-right').show();

    $('#productModal .modal-body').css('transform', 'translateY(0px)');
    gy = 0;
    if(window.matchMedia('(min-width: 1200px)').matches){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal-totalReviews').css('left', '0px'); //0px
      $('#productModal-totalReviews').css('width', '214px'); //0px
      $('#productModal .socialcounts').css('left', '220px'); //180px
      $('#productModal .scoreradial').css('left', '-100px'); //-82px
    }else if(window.matchMedia('(min-width: 992px)').matches){
    //if($(document).width() >= 992){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal-totalReviews').css('left', '0px'); //0px
      $('#productModal-totalReviews').css('width', '153px'); //0px
      $('#productModal .socialcounts').css('left', '140px'); //180px
      $('#productModal .scoreradial').css('left', '-78px'); //-82px
    }else if(window.matchMedia('(min-width: 768px)').matches){
      $('#productModal-totalReviews').css('left', '0px'); //0px
      $('#productModal-totalReviews').css('width', '340px'); //0px
      $('#productModal .socialcounts').css('left', '260px'); //180px
      $('#productModal .scoreradial').css('left', '-78px'); //-82px
      $('#productModal .scoreDescription').css('left', '220px'); //220px
    }else{
      $('#productModal-totalReviews').css('left', '-78px'); //0px
      $('#productModal-totalReviews').css('width', '210px'); //0px
      $('#productModal .socialcounts').css('left', '70px'); //180px
      $('#productModal .socialcounts').css('right', '-20px'); //180px
      $('#productModal .scoreradial').css('left', '-78px'); //-82px
      $('#productModal .scoreDescription').css('left', '220px'); //220px
    }
    $('#productModal .imagerow').show();
    var col = $('#productModal .row .col-md-8');
    col.removeClass('col-md-8');
    col.removeClass('col-md-offset-2');
    col.addClass('col-md-6');
    col.addClass('col-md-offset-6');
    $('#productModal-subtitle').show();
    $('#productModal .price').show();
    $('#productModal-title').css('margin-bottom', '0px'); //0px
    $('#productModal-scoreDetail').show();
    $('#productModal-imageDetail').show();
    $('#productModal .imagebars').show();
    $('#productModal-buy').show();
    $('#productModal-description').show();
    if($('#productModal-featuresContainer').text()!='Details(none)')
      $('#productModal-featuresContainer').show();
    $('#productModal .socialcounts').css('position', 'absolute'); //absolute
    $('#productModal .socialcounts').css('top', '44px'); //24px
    $('#productModal .scoreDescription').hide();
    $('#productModal-scoreDetailBack').hide();
    $('#productModal .socialcountdetails').hide();
    $('#productModal .container-fluid').css('margin-top', '36px'); //28px
    $('#productModal .container-fluid').css('margin-bottom', '16px'); //28px
  }
  function showImageDetail(){
    imageDetailMode = true;
    //$('#productModal .arrow-left').hide();
    //$('#productModal .arrow-right').hide();

    $('#productModal .modal-body').css('transform', 'translateY(0px)');
    if(window.matchMedia('(min-width: 992px)').matches){
    //if($(document).width() >= 992){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagerow').css('left', 'initial'); //-91%
      $('#productModal .imagebars').css('left', 'initial'); //-91%
      $('#productModal .container-fluid').css('margin-top', '36px'); //28px
    }else if(window.matchMedia('(min-width: 768px)').matches){
      $('#productModal .imagerow').css('left', '8%'); //-91%
      $('#productModal .imagebars').css('left', '8%'); //-91%
      $('#productModal .container-fluid').css('margin-top', '36px'); //28px
      $('#productModal .container-fluid').css('margin-bottom', '16px'); //28px
    }else{
      $('#productModal .imagerow').css('left', '6%'); //-91%
      $('#productModal .imagebars').css('left', '6%'); //-91%
      $('#productModal .container-fluid').css('margin-top', '36px'); //28px
      $('#productModal .container-fluid').css('margin-bottom', '16px'); //28px
    }
    //$('#productModal-images').css('height', '360px'); //480px
    var col = $('#productModal .row .col-md-6');
    col.removeClass('col-md-6');
    col.removeClass('col-md-offset-6');
    col.addClass('col-md-8');
    col.addClass('col-md-offset-2');
    $('#productModal .scoreradial').hide();
    $('#productModal-subtitle').hide();
    $('#productModal .price').hide();
    $('#productModal-title').hide();
    $('#productModal-totalReviews').hide();
    $('#productModal-score').hide();
    $('#productModal-imageDetail').hide();
    $('#productModal-buy').hide();
    $('#productModal-description').hide();
    $('#productModal-featuresContainer').hide();
    $('#productModal .socialcounts').hide();
    $('#productModal-imageDetailBack').show();

    var productId = $('#productModal .id').text();
    var images = '<div id="productModal-carousel" class="carousel slide" data-ride="carousel" data-interval="">';
    images += '<div class="carousel-inner">';
    // record the main image and filter duplicates
    var mainImageUrl = Products[productId].images[0].url;
    var marginString = '';
    var height, margin;
    var maxWidth = ($('.modal-lg').width()||$('.main').width())*.84;
    if(window.matchMedia('(max-width: 767px)').matches){
      maxWidth = ($('.modal-lg').width()||$('.main').width())*.68;
    }else if(window.matchMedia('(max-width: 991px)').matches){
      maxWidth = ($('.modal-lg').width()||$('.main').width())*.84;
    }
    for(var i in Products[productId].images){
      images += '<div class="item'+(i==0?' active':'')+'">';
      if(Products[productId].images[i].height){
        marginString = '';
        height = parseInt(Products[productId].images[i].height);
        var width = parseInt(Products[productId].images[i].width);
        if(width > maxWidth)
          height *= maxWidth/width;
        if(window.matchMedia('(max-width: 767px)').matches){
          if(height < 280){
            margin = (280-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }else{
          if(height < 480){
            margin = (480-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }
      }
      images += '<img src="'+Products[productId].images[i].url+'" alt="'+Products[productId].title+'"'+marginString+'>';
      images += '</div>';
    }
    images += '</div>';
    if(Products[productId].images.length > 1){
      images += '<a class="left carousel-control" href="#productModal-carousel" data-slide="prev">';
      images += '<span class="glyphicon glyphicon-chevron-left"></span>';
      images += '</a>';
      images += '<a class="right carousel-control" href="#productModal-carousel" data-slide="next">';
      images += '<span class="glyphicon glyphicon-chevron-right"></span>';
      images += '</a>';
    }
    images += '</div>';
    $('#productModal-images').html(images);
    // image bars
    var imagebars = '';
    for(var i = 0; i < Products[productId].images.length; i++){
      imagebars += '<div class="imagebar"></div>';
    }
    $('#productModal-imagebars').html(imagebars);
    setActiveModalImage();
    $('#productModal-carousel').on('slide.bs.carousel', function(e){
      setActiveModalImage(e);
    });
    if(window.matchMedia('(min-width: 992px)').matches){
      $('#productModal .carousel-control span').addClass('hoveronly');
      $('#productModal-images').off('mouseenter');
      $('#productModal-images').off('mouseleave');
      $('#productModal-images').hover(function(){
        $('#productModal .carousel-control span').addClass('active');
      }, function(){
        $('#productModal .carousel-control span').removeClass('active');
      });
    }
    $('#productModal .imagebar').click(function(){
      var index = $(this).index();
      $('#productModal-carousel').carousel(index);
    });
  }
  function hideImageDetail(){
    imageDetailMode = false;
    $('#productModal .arrow-left').show();
    $('#productModal .arrow-right').show();

    $('#productModal .modal-body').css('transform', 'translateY(0px)');
    gy = 0;
    if(window.matchMedia('(min-width: 992px)').matches){
    //if($(document).width() >= 992){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagerow').css('left', '-91%'); //-91%
      $('#productModal .imagebars').css('left', '-91%'); //-91%
    }else{
      $('#productModal .imagerow').css('left', '8%'); //-91%
      $('#productModal .imagebars').css('left', '8%'); //-91%
    }
    //$('#productModal-images').css('height', '360px'); //480px
    var col = $('#productModal .row .col-md-8');
    col.removeClass('col-md-8');
    col.removeClass('col-md-offset-2');
    col.addClass('col-md-6');
    col.addClass('col-md-offset-6');
    $('#productModal .scoreradial').show();
    $('#productModal-subtitle').show();
    $('#productModal .price').show();
    $('#productModal-title').show();
    $('#productModal-totalReviews').show();
    $('#productModal-score').show();
    $('#productModal-imageDetail').show();
    $('#productModal-buy').show();
    $('#productModal-description').show();
    if($('#productModal-featuresContainer').text()!='Details(none)')
      $('#productModal-featuresContainer').show();
    $('#productModal .socialcounts').show();
    $('#productModal-imageDetailBack').hide();
    $('#productModal .container-fluid').css('margin-top', '36px'); //28px
    $('#productModal .container-fluid').css('margin-bottom', '16px'); //28px
    
    var productId = $('#productModal .id').text();
    var images = '<div id="productModal-carousel" class="carousel slide" data-ride="carousel" data-interval="">';
    images += '<div class="carousel-inner">';
    // record the main image and filter duplicates
    var mainImageUrl = Products[productId].images[0].url;
    var marginString = '';
    var height, margin;
    var maxWidth = ($('.modal-lg').width()||$('.main').width())*.42;
    if(window.matchMedia('(max-width: 767px)').matches){
      maxWidth = ($('.modal-lg').width()||$('.main').width())*.55;
    }else if(window.matchMedia('(max-width: 991px)').matches){
      maxWidth = ($('.modal-lg').width()||$('.main').width())*.84;
    }
    for(var i in Products[productId].images){
      images += '<div class="item'+(i==0?' active':'')+'">';
      if(Products[productId].images[i].height){
        marginString = '';
        height = parseInt(Products[productId].images[i].height);
        var width = parseInt(Products[productId].images[i].width);
        //console.log(height, width, $('.modal-lg').width(), maxWidth)
        if(width > maxWidth)
          height *= maxWidth/width;
        if(window.matchMedia('(max-width: 767px)').matches){
          if(height < 280){
            margin = (280-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }else{
          if(height < 480){
            margin = (480-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }
      }
      images += '<img src="'+Products[productId].images[i].url+'" alt="'+Products[productId].title+'"'+marginString+'>';
      images += '</div>';
    }
    images += '</div>';
    if(Products[productId].images.length > 1){
      images += '<a class="left carousel-control" href="#productModal-carousel" data-slide="prev">';
      images += '<span class="glyphicon glyphicon-chevron-left"></span>';
      images += '</a>';
      images += '<a class="right carousel-control" href="#productModal-carousel" data-slide="next">';
      images += '<span class="glyphicon glyphicon-chevron-right"></span>';
      images += '</a>';
    }
    images += '</div>';
    $('#productModal-images').html(images);
    // image bars
    var imagebars = '';
    for(var i = 0; i < Products[productId].images.length; i++){
      imagebars += '<div class="imagebar"></div>';
    }
    $('#productModal-imagebars').html(imagebars);
    setActiveModalImage();
    $('#productModal-carousel').on('slide.bs.carousel', function(e){
      setActiveModalImage(e);
    });
    $('#productModal-images img').click(function(){
      $('#productModal .modal-body').addClass('out');
      setTimeout(function(){
        showImageDetail();
        $('#productModal .modal-body').removeClass('out');
      }, 600);
    });
    if(window.matchMedia('(min-width: 992px)').matches){
      $('#productModal .carousel-control span').addClass('hoveronly');
      $('#productModal-images').off('mouseenter');
      $('#productModal-images').off('mouseleave');
      $('#productModal-images').hover(function(){
        $('#productModal .carousel-control span').addClass('active');
      }, function(){
        $('#productModal .carousel-control span').removeClass('active');
      });
    }
    $('#productModal .imagebar').click(function(){
      var index = $(this).index();
      $('#productModal-carousel').carousel(index);
    });
  }

  linkToSkimlink = function(l, p){
    var t = p||'http://shopperr.com';
    var lt = 'https://go.redirectingat.com/?id=95177X1549744&xs=1&sref='+encodeURIComponent(t)+'&xcust=1'+'&url='+encodeURIComponent(l);
    return lt;
  }

  preloadBringhubId = function(productId){
    // if we havent already loaded the bringhub id, load it
    var id = productId;
    var bid = Products[productId].bringhubId;
    var url = Products[productId].amazonURL;
    if(!bid && url){
      $.ajax({
        type: 'POST',
        url: _APIUrl+'/v1/spc',
        dataType: 'json',
        contentType: 'application/json',
        headers: {
          'X-Partner-Id':_PartnerId,
          'X-Publisher-Id':_PublisherId,
          'X-Session-Id':_SessionId,
          'Accept':'application/json'
        },
        data: JSON.stringify({
          product_url: url
        }),
        error: function(err){
          console.log('preload failed');
        },
        success: function(data){
          bid = data.pid;
          //- console.log('bid preload', id, $('#productModal-id').text());
          if($('#productModal-id').text() == id){
            $('#productModal-buy').attr('data-bringhub-pid', bid);
            Products[id].bringhubId = bid;
          }
        }
      });
    }
  }

  var _ProductDetails = null;
  addProductToCart = function(productId){
    console.log('add to cart '+productId);
    var bid = Products[productId].bringhubId;
    if(!bid){
      window.open(linkToSkimlink(Products[productId].amazonURL), '_blank');
      return;
    }
    transitionCart(100);
    showCart();
    // fetch product variants from bringhub
    $.ajax({
      type: 'GET',
      url: _CartUrl+'/collections/undefined/products/'+bid,
      dataType: 'json',
      contentType: 'application/json',
      headers: {
        'X-Partner-Id':_PartnerId,
        'X-Publisher-Id':_PublisherId,
        'X-Session-Id':_SessionId,
        'Accept':'application/json'
      },
      error: function(err){
        console.log('product details failed');
      },
      success: function(data){
        _ProductDetails = data.data;
        console.log('product details', _ProductDetails);



        beginCart(productId, bid);
      }
    });
  }

  var resetOrderSummary = function(elem){
    var str = '';
    str += '<div class="field">Loading order summary...</div>';
    elem.html(str);
  }

  var renderOrderSummary = function(elem){
    var str = '';
    str += '<div class="field">'+_ProductDetails.product.product_name+'</div>';
    str += '<div class="field">Shipping Address: '+_CartData.bringhubShipping.address+(_CartData.bringhubShipping.address2?(' '+_CartData.bringhubShipping.address2):'')+', '+_CartData.bringhubShipping.city+', '+_CartData.bringhubShipping.state+' '+_CartData.bringhubShipping.zip_code+'</div>';
    str += '<div class="field">Payment Method: '+_CartData.bringhubBilling.type+' '+_CartData.bringhubBilling.last_four+'</div>';
    str += '<div class="field">Expiration: '+_CartData.bringhubBilling.expiration_month+'/'+_CartData.bringhubBilling.expiration_year+'</div>';
    str += '<div class="field-xl">'+'$'+_ProductDetails.variants[0].price+'</div>';
    str += '<div class="btn btn-checkout btn-submitorder" onclick="">Complete Purchase</div>';
    elem.html(str);
  }

  var renderProductSummary = function(elem){
    // setup the product summary
    //- div.field What is your email address?
    //-   div.field-xl
    //-     input.form-control-material(name='signupEmail', type='email')
    //-   .btn.btn-next(onclick='transitionCart(2);')
    //-     .ion-android-arrow-forward
    var str = '';
    str += '<div class="field">'+_ProductDetails.product.product_name+'</div>';
    // render selects for all attributes
    var attributes = {};
    for(var i in _ProductDetails.variants){
      for(var j in _ProductDetails.variants[i].attributes){
        var at = _ProductDetails.variants[i].attributes[j];
        if(!attributes[at.type])
          attributes[at.type] = [];
        if(attributes[at.type].indexOf(at.value)<0)
          attributes[at.type].push(at.value);
      }
    }
    //- console.log(attributes);
    for(var i in attributes){
      str += '<div class="field"> '+i+'&nbsp;&nbsp;';
      str += '<select class="form-control form-control-material" data-type="'+i+'">';
      for(var j in attributes[i]){
        str += '<option value="'+attributes[i][j]+'">'+attributes[i][j]+'</option>';
      }
      str += '</select>';
      str += '</div>';
    }
    str += '<input type="hidden" name="variantId" value="'+_ProductDetails.variants[0].variant_id+'">';
    str += '<input type="hidden" name="bringhubVariantId" value="'+_ProductDetails.variants[0].bringhub_variant_id+'">';
    str += '<input type="hidden" name="productId" value="'+_ProductDetails.variants[0].product_id+'">';
    str += '<input type="hidden" name="bringhubProductId" value="'+_ProductDetails.variants[0].bringhub_product_id+'">';
    str += '<div class="field-xl">'+'$'+_ProductDetails.variants[0].price+'</div>';
    str += '<div class="btn btn-checkout" onclick="transitionCart(2);">Checkout</div>';
    elem.html(str);
    $(elem).find('select').change(function(){
      // find the matching variant
      var attributes = {};
      $(elem).find('select').each(function(){
        attributes[$(this).attr('data-type')] = $(this).val();
      });
      var ind = -1;
      for(var i in _ProductDetails.variants){
        var mismatched = false;
        for(var j in _ProductDetails.variants[i].attributes){
          var at = _ProductDetails.variants[i].attributes[j];
          if(attributes[at.type]!=at.value)
            mismatched = true;
        }
        if(!mismatched){
          ind = i;
          break;
        }
      }
      //- console.log(attributes, i);
      $(elem).find('[name="variantId"]').val(_ProductDetails.variants[ind].variant_id);
      $(elem).find('[name="bringhubVariantId"]').val(_ProductDetails.variants[ind].bringhub_variant_id);
      $(elem).find('[name="productId"]').val(_ProductDetails.variants[ind].product_id);
      $(elem).find('[name="bringhubProductId"]').val(_ProductDetails.variants[ind].bringhub_product_id);
      $(elem).find('.field-xl').text('$'+_ProductDetails.variants[ind].price);
    });
  }

  var _CartData = {};

  beginCart = function(productId, bid){
    // begin the cart process
    $('#cartContents').html('');
    _CartData = {};
    _CartData.shopperrProductId = productId;
    _CartData.bid = bid;
    transitionCart(1);
      showCart();
  }

  setShippingAddress = function(pred, field){
    _GooglePlacesDetails.getDetails({placeId:pred.place_id}, function(res,status){
      if(status != google.maps.places.PlacesServiceStatus.OK){
        return;
      }
      _CartData[field] = res;
      console.log('set address', field, res);
    });
  }

  wireAddress = function(that){
    var lastValue = $(that).val();
    var field = $(that).attr('name');
    $(that).on('keyup paste', function(){
      var val = $('#cartContents input.autocomplete-address').val();
      if(!$(this).val() || lastValue == val) return;
      lastValue = val;
      var preds = null;
      locationAuto($(this).val(), function(predictions, status){
        //- console.log(predictions, status);
        var html = '<ul class="options">';
        if(status != google.maps.places.PlacesServiceStatus.OK){
          html += '</ul>';
          $(that).next().html(html);
          return;
        }
        preds = predictions;
        for(var i in predictions){
          if(i>2) break;
          html += '<li data-index="'+i+'"><span>'+predictions[i].description+'</span></li>';
        }
        html += '</ul>';
        $(that).next().html(html);
        $(that).next().find('li').click(function(){
          var index = $(this).attr('data-index');
          var pred = preds[index];
          $(that).val(pred.description);
          $(that).next().html('');
          setShippingAddress(pred, field);
        });
      });
    });
  }

  recordCart = function(){
    var data = {};
    for(var i in _CartData){
      if(i.indexOf('billingCard')<0)
        data[i] = _CartData[i];
    }
    $.ajax({
      type: 'POST',
      url: API_URL+'carts',
      dataType: 'json',
      contentType: 'application/json',
      headers: {
      },
      data: JSON.stringify({
        sessionId: _SessionId,
        cartData: data
      }),
      error: function(err){
        //- console.log('record cart failed');
      },
      success: function(data){
        //- console.log('submit order', data);
        //- transitionCart('15');
      }
    });
  }

  transitionCart = function(i){
    // get the data from current step, then transition
    if(window.dataLayer){
      dataLayer.push({
        'event': 'CartProgress',
        'cartStep': ''+i,
        'cartSession': _SessionId
      });
    }
    $('#cartContents [name]').each(function(){
      if(_CartData[$(this).attr('name')] && (typeof _CartData[$(this).attr('name')] == 'object')){

      }else{
        _CartData[$(this).attr('name')] = $(this).val()||'';
      }
    });
    console.log(_CartData);
    var ii = parseInt(i);
    if(ii <= 0){
      return endCart();
    }
    ii--;
    $('.cartContainer button.back').attr('onclick', 'transitionCart('+ii+');');
    //- var step = $('#cartContents>div').attr('data-cartStep');
    var nextStep = $('#cartViews [data-cartStep="'+i+'"]').clone();
    if(i == 1){
      renderProductSummary(nextStep);
    }
    if(i == 5){
      recordCart();
    }
    if(i == 14){
      resetOrderSummary(nextStep);
    }
    $('#cartContents').fadeOut(function(){
      $('#cartContents').html('');
      $('#cartContents').append(nextStep);
      if($('#cartContents .autocomplete-address').length == 1){
        wireAddress($('#cartContents input.autocomplete-address'));
      }
      $('#cartContents [data-cartStep="1"] .btn-checkout').click(function(){
        $('#cartContents [name]').each(function(){
          if(_CartData[$(this).attr('name')] && (typeof _CartData[$(this).attr('name')] == 'object')){

          }else{
            _CartData[$(this).attr('name')] = $(this).val()||'';
          }
        });
        setupBringhubCart();
      });
      $('#cartContents .btn-submitorder').click(function(){
        $.ajax({
          type: 'POST',
          url: _CartUrl+'/transactions',
          dataType: 'json',
          contentType: 'application/json',
          headers: {
            'X-Partner-Id':_PartnerId,
            'X-Publisher-Id':_PublisherId,
            'X-Session-Id':_SessionId,
            'Accept':'application/json',
            'Authorization': 'Bearer '+_CartData.userAuth.access_token
          },
          data: JSON.stringify({
            publisher_signup: true,
            shipping_id: _CartData.shippingId,
            billing_id: _CartData.billing_id,
            cart_id: _CartData.cartId
          }),
          error: function(err){
            console.log('submit order failed');
          },
          success: function(data){
            console.log('submit order', data);
            _CartData.bringhubOrder = data;
            _CartData.orderComplete = true;
            recordCart();
            transitionCart('15');
          }
        });
      });
      $('#cartContents .btn-submitbilling').click(function(){
        $('#cartContents [name]').each(function(){
          if(_CartData[$(this).attr('name')] && (typeof _CartData[$(this).attr('name')] == 'object')){

          }else{
            _CartData[$(this).attr('name')] = $(this).val()||'';
          }
        });
        console.log(_CartData);
        transitionCart('14');
        // get payment gateway
        $.ajax({
          type: 'GET',
          url: _CartUrl+'/payments/payment_gateway?cart_id='+_CartData.cartId,
          dataType: 'json',
          contentType: 'application/json',
          headers: {
            'X-Partner-Id':_PartnerId,
            'X-Publisher-Id':_PublisherId,
            'X-Session-Id':_SessionId,
            'Accept':'application/json',
            'Authorization': 'Bearer '+_CartData.userAuth.access_token
          },
          error: function(err){
            console.log('payment gateway failed');
          },
          success: function(data){
            console.log('payment gateway', data);
            _CartData.gatewayToken = data.data.config.token;
            // store card in bringhub
            var cdata = {};
            cdata.name = _CartData.signupFirstName+' '+_CartData.signupLastName;
            cdata.number = _CartData.billingCardNumber;
            cdata.expirationMonth = _CartData.billingCardMonth;
            cdata.expirationYear = _CartData.billingCardYear;
            cdata.cvv = _CartData.billingCardCVV;
            if(cdata.number.indexOf('34')==0||cdata.number.indexOf('37')==0)
              cdata.type = 'amex';
            if(cdata.number.indexOf('4')==0)
              cdata.type = 'visa';
            if(cdata.number.indexOf('5')==0)
              cdata.type = 'mastercard';
            if(cdata.number.indexOf('6')==0)
              cdata.type = 'discover';
            console.log('cdata', cdata);
            $.ajax({
              type: 'POST',
              url: _PaymentUrl+'/cc',
              dataType: 'json',
              contentType: 'application/json',
              headers: {
                'X-Partner-Id':_PartnerId,
                'X-Publisher-Id':_PublisherId,
                'X-Session-Id':_SessionId,
                'Accept':'application/json',
                'Authorization': 'Bearer '+_CartData.userAuth.access_token
              },
              data: JSON.stringify(cdata),
              error: function(err){
                console.log('store card failed');
              },
              success: function(data){
                console.log('store card', data);
                _CartData.bringhubCardId = data.data.ccid;
                // submit card to braintree
                var btClient = new braintree.api.Client({clientToken: _CartData.gatewayToken});
                var btdata = {};
                btdata.number = cdata.number;
                btdata.expirationMonth = cdata.expirationMonth;
                btdata.expirationYear = cdata.expirationYear;
                btdata.cvv = cdata.cvv;
                console.log('btdata', btdata);
                btClient.tokenizeCard(btdata, function(err, nonce){
                  if(nonce === null){
                    console.log('tokenize card failed');
                  }else{
                    console.log('tokenize card', nonce);
                    _CartData.braintreeNonce = nonce;

                    // submit billing
                    var bdata = {};
                    if(!_CartData.billingAddress){
                      // same
                      bdata.first_name = _CartData.signupFirstName;
                      bdata.last_name = _CartData.signupLastName;
                      bdata.address = '';
                      for(var i in _CartData.shippingAddress.address_components){
                        var c = _CartData.shippingAddress.address_components[i];
                        if(c.types[0] == 'street_number' || c.types[0] == 'route'){
                          if(bdata.address)
                            bdata.address += ' ';
                          bdata.address += c.long_name;
                        }
                        if(c.types[0] == 'locality')
                          bdata.city = c.long_name;
                        if(c.types[0] == 'administrative_area_level_1')
                          bdata.state = c.short_name;
                        if(c.types[0] == 'postal_code')
                          bdata.zip_code = c.long_name;
                      }
                      if(_CartData.shippingAddress2)
                        bdata.address2 = _CartData.shippingAddress2;
                      bdata.phone_number = _CartData.signupPhone;
                      bdata.email = _CartData.signupEmail;
                      bdata.save = true;
                    }else{
                      bdata.first_name = _CartData.signupFirstName;
                      bdata.last_name = _CartData.signupLastName;
                      bdata.address = '';
                      for(var i in _CartData.billingAddress.address_components){
                        var c = _CartData.billingAddress.address_components[i];
                        if(c.types[0] == 'street_number' || c.types[0] == 'route'){
                          if(bdata.address)
                            bdata.address += ' ';
                          bdata.address += c.long_name;
                        }
                        if(c.types[0] == 'locality')
                          bdata.city = c.long_name;
                        if(c.types[0] == 'administrative_area_level_1')
                          bdata.state = c.short_name;
                        if(c.types[0] == 'postal_code')
                          bdata.zip_code = c.long_name;
                      }
                      if(_CartData.billingAddress2)
                        bdata.address2 = _CartData.billingAddress2;
                      bdata.phone_number = _CartData.signupPhone;
                      bdata.email = _CartData.signupEmail;
                      bdata.save = true;
                    }
                    bdata.ccid = _CartData.bringhubCardId;
                    bdata.payment_gateway_token = _CartData.braintreeNonce;
                    bdata.payment_gateway = 'braintree';
                    console.log('billing data', bdata);

                    $.ajax({
                      type: 'POST',
                      url: _CartUrl+'/user/billing',
                      dataType: 'json',
                      contentType: 'application/json',
                      headers: {
                        'X-Partner-Id':_PartnerId,
                        'X-Publisher-Id':_PublisherId,
                        'X-Session-Id':_SessionId,
                        'Accept':'application/json',
                        'Authorization': 'Bearer '+_CartData.userAuth.access_token
                      },
                      data: JSON.stringify(bdata),
                      error: function(err){
                        console.log('submit billing failed');
                      },
                      success: function(data){
                        console.log('submit billing', data);
                        _CartData.billingId = data.data.new_billing.id;
                        _CartData.bringhubBilling = data.data.new_billing;
                        recordCart();
                        var elem = $('#cartContents [data-cartStep="14"]');
                        renderOrderSummary(elem);
                      }
                    });
                  }
                });
              }
            });
          }
        });
      });
      $('#cartContents .btn-submitshipping').click(function(){
        $('#cartContents [name]').each(function(){
          if(_CartData[$(this).attr('name')] && (typeof _CartData[$(this).attr('name')] == 'object')){

          }else{
            _CartData[$(this).attr('name')] = $(this).val()||'';
          }
        });
        console.log(_CartData);
        var int = setInterval(function(){
          if(_CartData.userAuth){
            //- console.log('proceed');
            clearInterval(int);
            // submit shipping
            var sdata = {};
            //- console.log('shipping data', sdata);
            sdata.first_name = _CartData.signupFirstName;
            sdata.last_name = _CartData.signupLastName;
            sdata.address = '';
            //- console.log('shipping data', sdata);
            for(var i in _CartData.shippingAddress.address_components){
              var c = _CartData.shippingAddress.address_components[i];
              if(c.types[0] == 'street_number' || c.types[0] == 'route'){
                if(sdata.address)
                  sdata.address += ' ';
                sdata.address += c.long_name;
              }
              if(c.types[0] == 'locality')
                sdata.city = c.long_name;
              if(c.types[0] == 'administrative_area_level_1')
                sdata.state = c.short_name;
              if(c.types[0] == 'postal_code')
                sdata.zip_code = c.long_name;
                //- console.log('shipping data', c, sdata);
            }
            //- console.log('shipping data', sdata);
            if(_CartData.shippingAddress2)
              sdata.address2 = _CartData.shippingAddress2;
            sdata.phone_number = _CartData.signupPhone;
            sdata.email = _CartData.signupEmail;
            sdata.save = true;
            console.log('shipping data', sdata);

            $.ajax({
              type: 'POST',
              url: _CartUrl+'/user/shipping',
              dataType: 'json',
              contentType: 'application/json',
              headers: {
                'X-Partner-Id':_PartnerId,
                'X-Publisher-Id':_PublisherId,
                'X-Session-Id':_SessionId,
                'Accept':'application/json',
                'Authorization': 'Bearer '+_CartData.userAuth.access_token
              },
              data: JSON.stringify(sdata),
              error: function(err){
                console.log('submit shipping failed');
              },
              success: function(data){
                console.log('submit shipping', data);
                _CartData.shippingId = data.data.new_shipping.id;
                _CartData.bringhubShipping = data.data.new_shipping;
                recordCart();
                transitionCart('8');
              }
            });
          }
        }, 100);
        return false;
      });
      $('#cartContents').fadeIn();
    });
  }

  setupBringhubCart = function(){
    // first create a new cart
    _CartData.cart = null;
    _CartData.userAuth = null;
    $.ajax({
      type: 'POST',
      url: _CartUrl+'/carts',
      dataType: 'json',
      contentType: 'application/json',
      headers: {
        'X-Partner-Id':_PartnerId,
        'X-Publisher-Id':_PublisherId,
        'X-Session-Id':_SessionId,
        'Accept':'application/json'
      },
      data: JSON.stringify({
      }),
      error: function(err){
        console.log('create cart failed');
      },
      success: function(data){
        console.log('create cart', data);
        _CartData.cartId = data.data.cart.id;
        // now add the product to it
        $.ajax({
          type: 'PUT',
          url: _CartUrl+'/carts/'+_CartData.cartId,
          dataType: 'json',
          contentType: 'application/json',
          headers: {
            'X-Partner-Id':_PartnerId,
            'X-Publisher-Id':_PublisherId,
            'X-Session-Id':_SessionId,
            'Accept':'application/json'
          },
          data: JSON.stringify({
            type: 'product',
            product_id: _CartData.bringhubProductId,
            variant_id: _CartData.variantId,
            quantity: 1,
            collection_id: 'undefined'
          }),
          error: function(err){
            console.log('add product failed');
          },
          success: function(data){
            console.log('add product', data);
            // now validate the cart
            $.ajax({
              type: 'GET',
              url: _CartUrl+'/carts/'+_CartData.cartId+'/validate',
              dataType: 'json',
              contentType: 'application/json',
              headers: {
                'X-Partner-Id':_PartnerId,
                'X-Publisher-Id':_PublisherId,
                'X-Session-Id':_SessionId,
                'Accept':'application/json'
              },
              error: function(err){
                console.log('validate cart failed');
              },
              success: function(data){
                console.log('validate cart', data);
                _CartData.cart = data.data.cart;
                // now create the guest
                $.ajax({
                  type: 'POST',
                  url: _CartUrl+'/users/guest',
                  dataType: 'json',
                  contentType: 'application/json',
                  headers: {
                    'X-Partner-Id':_PartnerId,
                    'X-Publisher-Id':_PublisherId,
                    'X-Session-Id':_SessionId,
                    'Accept':'application/json'
                  },
                  data: JSON.stringify({
                  }),
                  error: function(err){
                    console.log('create guest failed');
                  },
                  success: function(data){
                    console.log('create guest', data);
                    _CartData.userAuth = data.data.authorization;
                  }
                });
              }
            });
          }
        });
      }
    });
  }

  endCart = function(){
    $('.cartContainer').removeClass('in');
    var that = $('.cartContainer');
    setTimeout(function(){
      that.css('display', 'none');
    }, 500);
    _CartData = {};
  }

  var imageWidth, sizeCards;
  setModal = function(productId, fullWidth) {
    $('#productModal-id').text(productId);
    preloadBringhubId(productId);
    var features;
    $('#productModal-title').trigger('destroy.dot');
    $('#productModal-description').trigger('destroy.dot');
    $('#productModal-features').trigger('destroy.dot');
    $('#productModal-title').text(Products[productId].title);
    $('#productModal-subtitle').text(Products[productId].displayBrand||'');
    $('#productModal-price').text(pricePretty(Products[productId].price));
    $('#productModal-price').attr('href', Products[productId].amazonURL);
    var pid = $('#productModal-buy').attr('data-bh-pid');
    if(pid){
      if(window.bringhub)
        bringhub.actions.clearProducts([pid]);
      $('#productModal-buy').removeAttr('data-bh-pid');
      $('#productModal-buy').removeAttr('data-bh-cid');
      $('#productModal-buy').removeAttr('data-bh-href');
    }
    //- $('#productModal-buy').attr('href', Products[productId].amazonURL||Products[productId].bizrateURL);
    if(Products[productId].amazonURL)
      $('#productModal-buy').attr('href', '#');
    else
      $('#productModal-buy').attr('href', Products[productId].bizrateURL);
    $('#productModal-buy').attr('data-bringhub-pid', Products[productId].bringhubId);
    if(window.bringhub)
      bringhub.actions.scan();
    $('#productModal-price').off('click');
    $('#productModal-price').click(function(){
      if(window.dataLayer){
        dataLayer.push({
          'event': 'VirtualPageview',
          'virtualPageURL': '/product/'+$('#productModal-id').text()+'/buy',
          'virtualPageTitle': $('#productModal-title').text()
        });
      }
    });
    $('#productModal-buy').off('click');
    $('#productModal-buy').click(function(){
      if(window.dataLayer){
        dataLayer.push({
          'event': 'VirtualPageview',
          'virtualPageURL': '/product/'+$('#productModal-id').text()+'/buy',
          'virtualPageTitle': $('#productModal-title').text()
        });
      }
      var productId = $('#productModal-id').text();
      if(Products[productId].amazonURL){
        addProductToCart(productId);
        return false;
      }
    });
    $('#productModal-arrow').attr('href', Products[productId].amazonURL);
    //$('#productModal-img').attr('src', Products[productId].images[0].url);
    // image carousel
    var images = '<div id="productModal-carousel" class="carousel slide" data-ride="carousel" data-interval="">';
    images += '<div class="carousel-inner">';
    // record the main image and filter duplicates
    var mainImageUrl = Products[productId].images[0].url;
    var marginString = '';
    var height, margin;
    var maxWidth = ($('.modal-lg').width()||$('.main').width())*.42;
    if(window.matchMedia('(max-width: 991px)').matches){
      maxWidth = ($('.modal-lg').width()||$('.main').width())*.84;
    }
    for(var i in Products[productId].images){
      images += '<div class="item'+(i==0?' active':'')+'">';
      if(Products[productId].images[i].height){
        marginString = '';
        height = parseInt(Products[productId].images[i].height);
        var width = parseInt(Products[productId].images[i].width);
        if(width > maxWidth)
          height *= maxWidth/width;
        if(window.matchMedia('(max-width: 767px)').matches){
          if(height < 280){
            margin = (280-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }else{
          if(height < 480){
            margin = (480-height)/2;
            marginString = ' style="margin-top:'+margin+'px"';
          }
        }
      }
      images += '<img src="'+Products[productId].images[i].url+'" alt="'+Products[productId].title+'"'+marginString+'>';
      images += '</div>';
    }
    images += '</div>';
    if(Products[productId].images.length > 1){
      images += '<a class="left carousel-control" href="#productModal-carousel" data-slide="prev">';
      images += '<span class="glyphicon glyphicon-chevron-left"></span>';
      images += '</a>';
      images += '<a class="right carousel-control" href="#productModal-carousel" data-slide="next">';
      images += '<span class="glyphicon glyphicon-chevron-right"></span>';
      images += '</a>';
    }
    images += '</div>';
    $('#productModal-images').html(images);
    // image bars
    var imagebars = '';
    for(var i = 0; i < Products[productId].images.length; i++){
      imagebars += '<div class="imagebar"></div>';
    }
    $('#productModal-imagebars').html(imagebars);
    setActiveModalImage();
    $('#productModal-carousel').on('slide.bs.carousel', function(e){
      setActiveModalImage(e);
    });
    $('#productModal-images img').click(function(){
      $('#productModal .modal-body').addClass('out');
      setTimeout(function(){
        showImageDetail();
        $('#productModal .modal-body').removeClass('out');
      }, 600);
    });
    if(window.matchMedia('(min-width: 992px)').matches){
      $('#productModal .carousel-control span').addClass('hoveronly');
      $('#productModal-images').off('mouseenter');
      $('#productModal-images').off('mouseleave');
      $('#productModal-images').hover(function(){
        $('#productModal .carousel-control span').addClass('active');
      }, function(){
        $('#productModal .carousel-control span').removeClass('active');
      });
    }
    $('#productModal .imagebar').click(function(){
      var index = $(this).index();
      $('#productModal-carousel').carousel(index);
    });
    var fbC = 0;
    var pnC = 0;
    var twC = 0;
    var counts = Products[productId].socialCounts;
    $('#productModal-facebookCount').parent('li').hide();
    $('#productModal-twitterCount').parent('li').hide();
    $('#productModal-pinterestCount').parent('li').hide();
    $('#productModal-amazonCount').parent('li').hide();
    $('#productModal-facebookProgress').parent('li').hide();
    $('#productModal-twitterProgress').parent('li').hide();
    $('#productModal-pinterestProgress').parent('li').hide();
    $('#productModal-amazonProgress').parent('li').hide();
    $('#productModal-totalReviews').hide();
    if(counts){
      for(var c in counts){
        if(counts[c].Facebook && counts[c].Facebook.total_count)
          fbC += counts[c].Facebook.total_count;
        if(counts[c].Twitter)
          twC += counts[c].Twitter;
        if(counts[c].Pinterest)
          pnC += counts[c].Pinterest;
      }
      // display the top two
      var v1 = 'facebook';
      var v2 = 'twitter';
      if(pnC > twC)
        v2 = 'pinterest';
      if(twC > fbC && v2 != 'twitter')
        v1 = 'twitter';
      else if(pnC > fbC && v2 != 'pinterest')
        v1 = 'pinterest';
      $('#productModal-facebookCount').text(fbC+' shares');
      $('#productModal-twitterCount').text(twC+' tweets');
      $('#productModal-pinterestCount').text(pnC+' pins');
      var fbW = Math.round(Math.log2(fbC||1))/20*100;
      if(fbW>100) fbW = 100;
      $('#productModal-facebookProgress .progress-bar').css('width', fbW+'%');
      var twW = Math.round(Math.log2(twC||1))/20*100;
      if(twW>100) twW = 100;
      $('#productModal-twitterProgress .progress-bar').css('width', twW+'%');
      var pnW = Math.round(Math.log2(pnC||1))/20*100;
      if(pnW>100) pnW = 100;
      $('#productModal-pinterestProgress .progress-bar').css('width', pnW+'%');
      if(v1 == 'facebook' || v2 == 'facebook'){
        $('#productModal-facebookCount').parent('li').show();
        $('#productModal-facebookProgress').parent('li').show();
      }
      if(v1 == 'twitter' || v2 == 'twitter'){
        $('#productModal-twitterCount').parent('li').show();
        $('#productModal-twitterProgress').parent('li').show();
      }
      if(v1 == 'pinterest' || v2 == 'pinterest'){
        $('#productModal-pinterestCount').parent('li').show();
        $('#productModal-pinterestProgress').parent('li').show();
      }
      if(Products[productId].amazonScore){
        $('#productModal-amazonCount').parent('li').show();
        $('#productModal-amazonCount').text(Products[productId].amazonScore+' stars');
        var amW = Products[productId].amazonScore/5*100;
        $('#productModal-amazonProgress .progress-bar').css('width', amW+'%');
        $('#productModal-amazonProgress').parent('li').show();
      }else{
        // show the third social score
        $('#productModal-facebookCount').parent('li').show();
        $('#productModal-twitterCount').parent('li').show();
        $('#productModal-pinterestCount').parent('li').show();
        $('#productModal-facebookProgress').parent('li').show();
        $('#productModal-twitterProgress').parent('li').show();
        $('#productModal-pinterestProgress').parent('li').show();
      }
      $('#productModal-totalReviews').text((fbC+twC+pnC+1)+((!fbC&&!twC&&!pnC)?' Opinion':' Opinions'));
      //if(fbC+twC+pnC+1 < 5)
        //$('#productModal-totalReviews').text('A score will be generated once we receive more opinions');
      $('#productModal-totalReviews').show();
    }else if(Products[productId].amazonScore){
      $('#productModal-amazonCount').parent('li').show();
      $('#productModal-amazonCount').text(Products[productId].amazonScore+' stars');
      var amW = Products[productId].amazonScore/5*100;
      $('#productModal-amazonProgress .progress-bar').css('width', amW+'%');
      $('#productModal-amazonProgress').parent('li').show();
    }
    $('#productModal-descriptionContainer').hide();
    $('#productModal-featuresContainer').hide();
    features = '(none)';
    if (Products[productId].amazonFeatures) {
      $('#productModal-featuresContainer').show();
      features = Products[productId].amazonFeatures.map(function(n) {
        return '<li><span>' + n + '</span></li>';
      });
    }
    $('#productModal-features').html(features);
    if (Products[productId].description) {
      $('#productModal-descriptionContainer').show();
      $('#productModal-description').html(Products[productId].description);
    }
    $('div#productModal-descriptionContainer *[style]').removeAttr('style');
    if (Products[productId].description && Products[productId].amazonFeatures) {
      $('#productModal-divider').show();
    } else {
      $('#productModal-divider').hide();
    }
    $('#productModal-score').hide();
    $('#productModal-similarHeader').hide();
    $('#productModal-similar').hide();

    (function() {
      var id;
      var thresh = ((fbC+twC+pnC+1)>=5);
      id = productId;
      if(Products[id].score){
        setScore(Products[id].score, thresh);
      }

      $.ajax({
        url: API_URL+'product/' + id + '/score',
        success: function(data) {
          if (data.id === id && data.score){
            setScore(data.score, thresh);
          }
        }
      });
      /*if(Products[id].similar && Products[id].similar.length){
        $.ajax({
          url: 'http://api.shopperr.com/products?keys=' + Products[id].amazonSimilarProducts.join(','),
          success: function(data) {
            //console.log(data);
          }
        });
      }*/
      $('#productModal-title').dotdotdot({
        watch: false,
        height: 125
      });
      $('#productModal-description').dotdotdot({
        watch: false,
        height: 236,
        ellipsis: ''
      });
      $('#productModal-features').dotdotdot({
        watch: false,
        height: 236,
        wrap: 'children'
      });
      setTimeout(function(){
        updateMores();
      }, 300);
    })();
  };

  function updateMores(){
    $('#productModal-title').trigger('update.dot');
    $('#productModal-description').trigger('update.dot');
    $('#productModal-description').trigger('isTruncated.dot', function(isTruncated){
      if(isTruncated){
        $('#productModal-description').append('<a class="readmore">More <span class="ion-arrow-down-b"></span></a>');
        $('#productModal-description').find('a.readmore').click(function(){
          $('#productModal-description').trigger('destroy.dot');
        });
      }
    });
    $('#productModal-features').trigger('update.dot');
    $('#productModal-features').trigger('isTruncated.dot', function(isTruncated){
      if(isTruncated){
        $('#productModal-features').append('<a class="readmore">More <span class="ion-arrow-down-b"></span></a>');
        $('#productModal-features').find('a.readmore').click(function(){
          $('#productModal-features').trigger('destroy.dot');
        });
      }
    });
  }

  function setScore(score, thresh){
    var s = Math.round(score);
    if(s >= 80){
      $('#productModal-scoreradialcontent').attr('data-name', 'Great!');
      $('#productModal-scoreDescription').text('This product is very highly rated and shared. You can buy this item with a high degree of confidence.');
      $('#productModal-scoreradialstop1').attr('stop-color', '#8bc34b');
      $('#productModal-scoreradialstop2').attr('stop-color', '#8bc34b');
      $('#productModal-scoreradialcontent').removeClass('score-good');
      $('#productModal-scoreradialcontent').removeClass('score-poor');
      $('#productModal-scoreradialcontent').addClass('score-great');
    }else if(s >= 60){
      $('#productModal-scoreradialcontent').attr('data-name', 'Good');
      $('#productModal-scoreDescription').text('This product has positive ratings and has been shared by many consumers, making it a good candidate for purchase.');
      $('#productModal-scoreradialstop1').attr('stop-color', '#f7bc31');
      $('#productModal-scoreradialstop2').attr('stop-color', '#f7bc31');
      $('#productModal-scoreradialcontent').removeClass('score-great');
      $('#productModal-scoreradialcontent').removeClass('score-poor');
      $('#productModal-scoreradialcontent').addClass('score-good');
    }else{
      $('#productModal-scoreradialcontent').attr('data-name', 'Poor');
      $('#productModal-scoreDescription').text('This product has not received many positive ratings and is not highly shared. We are unable to recommend this item for purchase.');
      $('#productModal-scoreradialstop1').attr('stop-color', '#ec5638');
      $('#productModal-scoreradialstop2').attr('stop-color', '#ec5638');
      $('#productModal-scoreradialcontent').removeClass('score-great');
      $('#productModal-scoreradialcontent').removeClass('score-good');
      $('#productModal-scoreradialcontent').addClass('score-poor');
    }
    $('#productModal-scoreradialcontent').attr('data-percent', Math.round(score));
    $('#productModal-scoreradialpath').attr('stroke-dashoffset', Math.round(score/100*629));
    //$('#productModal-scoretext').text(Math.round(Products[productId].score));
    if(!thresh){
      $('.scorebanner').hide();
      $('#productModal-scoreDetail').hide();
      $('#productModal-scoreradialcontent').addClass('nothreshold');
      $('#productModal-scoreradialcontent').attr('data-name', 'Not Enough Opinions');
      $('#productModal-scoreDescription').text('A Shopperr Score will be calculated when this item receives more customer ratings, reviews and shares.');
      $('#productModal-scoreradialcontent').attr('data-percent', '');
      $('#productModal-scoreradialpath').attr('stroke-dashoffset', 0);
    }else{
      $('.scorebanner').show();
      $('#productModal-scoreDetail').show();
      $('#productModal-scoreradialcontent').removeClass('nothreshold');
    }
    if(!imageDetailMode)
      return $('#productModal-score').fadeIn();
    else
      return;
  }

  var CategoryMetas = {};

  var ActiveModalImage = 0;
  var imageSizingLock = false;
  imageWidth = 250 + 2 * 14 + 14;
  sizeCards = function(width, height) {
    if(!imageSizingLock)
      imageSizingLock = true;
    else
      return setTimeout(function(){
        sizeCards(width, height);
      }, 100);
    var card, cards, columnHeights, currentColumn, j, k, lastColumnHeights, margin, max, neededHeight, num, numColumns, ref, ref1;
    width = width - 20;
    $('.products').width(width);
    numColumns = Math.floor(width / imageWidth);
    margin = width % imageWidth;
    lastColumnHeights = (function() {
      var j, ref, results;
      results = [];
      for (j = 1, ref = numColumns; 1 <= ref ? j <= ref : j >= ref; 1 <= ref ? j++ : j--) {
        results.push(0);
      }
      return results;
    })();
    cards = $('.products>ul>li');
    neededHeight = 0;
    columnHeights = (function() {
      var j, ref, results;
      results = [];
      for (j = 1, ref = numColumns; 1 <= ref ? j <= ref : j >= ref; 1 <= ref ? j++ : j--) {
        results.push(0);
      }
      return results;
    })();
    function shortestColumn(){
      var shortestVal = 1000000;
      var shortestI = 0;
      for(var i = 0; i < columnHeights.length; i++){
        if(columnHeights[i] < shortestVal){
          shortestVal = columnHeights[i];
          shortestI = i;
        }
      }
      return shortestI;
    }
    var cardData;
    for (num = j = 0, ref = cards.length - 1; 0 <= ref ? j <= ref : j >= ref; num = 0 <= ref ? ++j : --j) {
      card = $(cards[num]);
      /// this split is sometimes running on undefined
      if(!card || card.find('.card').length == 0 || !card.find('.card').attr('id'))
        continue;
      cardData = Products[card.find('.card').attr('id').split('-')[1]];
      var cardWidth = 262;
      var height = cardData.images[0].height;
      var width = cardData.images[0].width;
      // use naturalHeight/Width if available
      if(card.find('img')[0].naturalHeight)
        height = card.find('img')[0].naturalHeight;
      if(card.find('img')[0].naturalWidth)
        width = card.find('img')[0].naturalWidth;
      // set the image width to the min of the cardWidth or the image width
      var scaledWidth = Math.min(width,cardWidth);
      // set the height proportionally
      var scaledHeight = height*scaledWidth/width;
      if(scaledHeight > 600){
        scaledWidth = scaledWidth*600/scaledHeight;
        scaledHeight = 600;
      }
      var cardHeight = card.find('.card').height()+17.5*2+1;
      cardHeight = Math.max(scaledHeight,100)+cardHeight;
      currentColumn = shortestColumn() % numColumns;
      columnHeights[currentColumn] += cardHeight + 2 * 7 + 2 * 7;
      card.css('left', '' + (margin / 2 + currentColumn * imageWidth) + 'px');
      card.css('top', '' + lastColumnHeights[currentColumn] + 'px');
      card.find('.imagehover').height(scaledHeight);
      card.find('img').height(scaledHeight+2);
      card.find('img').width(scaledWidth+4)
      // if the image is too short, add a top margin
      if(scaledHeight < 100)
        card.find('img').css('margin-top', 50-((scaledHeight+2)/2));
      if(scaledWidth < cardWidth)
        card.find('img').css('margin-left', (cardWidth+2)/2-((scaledWidth+4)/2));
      lastColumnHeights[currentColumn] += cardHeight + 2 * 7 + 2 * 7;
    }
    max = 0;
    for (num = k = 0, ref1 = columnHeights.length - 1; 0 <= ref1 ? k <= ref1 : k >= ref1; num = 0 <= ref1 ? ++k : --k) {
      if (columnHeights[num] > max) {
        max = columnHeights[num];
      }
    }
    neededHeight += max;
    if ($('.products').children().length > 1) {
      neededHeight += 7 * 6;
    }
    imageSizingLock = false;
    return $('.products').height(neededHeight);
  };

  function pricePretty(price){
    if(price){
      var cents = price%100;
      cents = ''+cents;
      if(cents.length == 1)
        cents = '0'+cents;
      var dollars = Math.floor(price/100);
      dollars = ''+dollars;
      // always round
      price = Math.round(price/100);
      price = '$'+price;
      //price = '$'+dollars+'.'+cents;
    }
    if(price && price.length > 2){
      if(price[price.length-1] == '0' && price[price.length-2] == '0' && price[price.length-3] == '.')
        return price.substring(0, price.length-3);
    }
    return price;
  }

  var lastProduct;
  var animateProductModal = function(that){
    lastProduct = that;
    $('#productModal-cover').css('opacity', 0);
    var n = $(that).parents('.product-card');
    $('#productModal-cover').height(n.height());
    $('#productModal-cover').width(n.width());
    var o = n.offset();
    $('#productModal-cover').css({top:o.top+'px', left:o.left+'px'});
  }

  $('#productModal').on('hide.bs.modal', function(){
    $('#productModal-cover').css('display', 'block');
    $('#productModal-cover').css('opacity', 1);
    $('#productModal-cover').animate({
      opacity: 1
    }, 200, function(){
      var s = $(lastProduct).parents('.product-card');
      var o = s.offset();
      $('#productModal-cover').animate({
        top: o.top,
        left: o.left,
        height: s.height(),
        width: s.width()
      }, 250, function(){
        $('#productModal-cover').animate({
          opacity: 0
        }, 400, function(){
          $('#productModal-cover').css('display', 'none');
        });
      });
    });
  });

  $('#productModal').on('show.bs.modal', function(){
    $('#productModal .modal-content').height($(window).height()-65);
    $('#productModal .modal-body').css('transform', 'translateY(0px)');
    if($(document).width() >= 992){
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
    }
    hideScoreDetail();
    hideImageDetail();
    gy = 0;
    $('#productModal .modal-content').css('opacity', 0);
    $('#productModal-cover').css('display', 'block');
    $('#productModal-cover').animate({
      opacity: 1
    }, 250, function(){
    });
    //- var i = setInterval(function(){
    //-   if($('#productModal .modal-content').height() > 0){
    //-     clearInterval(i);
    //-     cb();
    //-   }
    //- }, 50);
    setTimeout(function(){
      cb();
    }, 300)
    function cb(){
      //$('#productModal-cover').height($('#productModal .modal-content').height());
      var s = $('#productModal .modal-lg');
      var o = s.offset();
      $('#productModal-cover').animate({
        top: o.top,
        left: o.left,
        height: s.height(),
        width: s.width()
      }, 300, function(){
        $('#productModal .modal-content').css('opacity', 1);
        $('#productModal-cover').animate({
          opacity: 0
        }, 300, function(){
          $('#productModal-cover').css('display', 'none');
        });
      });
      $('#productModal .modal-body').css('min-height', $('#productModal .modal-content').height());
    }
  });

  $('#productModal .modal-body').bind('mousewheel', function(e){
    manualScroll(gy+e.deltaY*e.deltaFactor);
  });
  //$('#productModal .modal-body').bind('touchstart', startTouch);
  //$('#productModal .modal-body').bind('touchmove', handleTouch);
  //- var lastY;
  //- function startTouch(e){
  //-   e.preventDefault();
  //-   e.stopPropagation();
  //-   lastY = e.originalEvent.touches[0].screenY;
  //- }
  //- function handleTouch(e){
  //-   e.preventDefault();
  //-   e.stopPropagation();
  //-   var touch = e.originalEvent.touches[0];
  //-   manualScroll(lastY-e.originalEvent.touches[0].screenY);
  //-   lastY = e.originalEvent.touches[0].screenY;
  //- }
  var gy = 0;
  function manualScroll(dy){
    if(dy>0){
      $('#productModal .modal-body').css('transform', 'translateY('+(0)+'px)');
      if($(document).width() >= 992){
        $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
        $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      }
      gy=0;
      offset=-gy;
      return;
    }
    if(Math.abs(dy)>$('#productModal .modal-body').height()-$('#productModal .modal-content').height()+30){
      $('#productModal .modal-body').css('transform', 'translateY('+((-1*$('#productModal .modal-body').height()+$('#productModal .modal-content').height())-30)+'px)');
      if($(document).width() >= 992){
        $('#productModal .imagerow').css('transform', 'translateY('+(-1*((-1*$('#productModal .modal-body').height()+$('#productModal .modal-content').height())-30))+'px)');
        $('#productModal .imagebars').css('transform', 'translateY('+(-1*((-1*$('#productModal .modal-body').height()+$('#productModal .modal-content').height())-30))+'px)');
      }
      gy=(-1*$('#productModal .modal-body').height()+$('#productModal .modal-content').height())-30;
      offset=-gy;
      return;
    }
    $('#productModal .modal-body').css('transform', 'translateY('+(dy)+'px)');
    if($(document).width() >= 992){
      $('#productModal .imagerow').css('transform', 'translateY('+(-dy)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(-dy)+'px)');
    }
    gy = dy;
    offset=-gy;
  }

  var wireCards = function(){
    $('.cube').hide();
    $('.products .product-card .imagehover').each(function() {
      $(this).off('click');
      $(this).click(function() {
        setModal($(this).parent().find('.card').attr('id').split('-')[1]);
        $('#productModal').modal('show');
        return animateProductModal(this);
      });
    });
    $('.products .product-card .titlelink').each(function() {
      $(this).off('click');
      $(this).click(function() {
        setModal($(this).parent().attr('id').split('-')[1]);
        $('#productModal').modal('show');
        return animateProductModal(this);
      });
    });
    $('.products .product-card').each(function(){
      $(this).animate({
        'opacity': 1
      }, 600);
    });
  }
  function escapeRegExp(str) {
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
  }
  var seed = 1;
  function randomSeeded(){
    var x = Math.sin(seed++)*10000;
    return x-Math.floor(x);
  }
  var nonStarters = ['but', 'nor', '/', 'are', 'is', '-', 'but', 'by', 'as', 'at', 'for', 'from', 'to', 'this', 'in', 'on', 'a', 'the', 'and', 'of', 'onto', 'upon', 'with'];
  function expandedMetaFromText(text, regex, limit, id){
    if(!regex || !text) return [];
    if(ProductSearch)
      regex = regex+'|'+ProductSearch;
    text = text.replace(/<(?:.|\n)*?>/gm, '');
    // match cat.regex
    var terms = [];
    var k = 0;
    var reg = new RegExp(regex, 'gi');
    var matched = [];
    while(k < limit){
      var t = reg.exec(text);
      if(!t || !t.length) break;
      if(matched.indexOf(t[0].toLowerCase())>=0)
        continue;
      k++;
      // go from this index forward and backward, capturing surrounding words. stop at breaking punctuation
      var t1 = t.index;
      var t2 = t.index+t[0].length-1;
      var words = 0;
      var whitespaceLast = false;
      while(true){
        if(t1==0) break;
        t1--;
        if(text[t1].match(/\s/)){
          // whitespace
          var word = text.substring(t1+1, text.indexOf(' ', t1+2));
          word = word.toLowerCase();
          if(nonStarters.indexOf(word)>=0){
            t1 = text.indexOf(' ', t1+2);
            break;
          }
          if(words>2){
            t1++;
            break;
          }
          whitespaceLast = true;
        }
        if(text[t1].match(/\S/)){
          // non whitespace
          if(text[t1].match(/[.,!;:]/)){
            // punctuation. break
            t1++;
            break;
          }
          if(whitespaceLast)
            words++;
          whitespaceLast = false;
        }
      }
      words = 0;
      whitespaceLast = false;
      var wordStart = t2;
      while(true){
        if(t2>=text.length-1) break;
        t2++;
        if(text[t2].match(/\s/)){
          // whitespace
          var word = text.substring(wordStart, t2);
          word = word.toLowerCase();
          if(nonStarters.indexOf(word)>=0){
            t2 = wordStart-1;
            break;
          }
          if(words>2){
            t2--;
            break;
          }
          whitespaceLast = true;
        }
        if(text[t2].match(/\S/)){
          // non whitespace
          if(text[t2].match(/[.,!;:]/)){
            // punctuation. break
            t2--;
            break;
          }
          if(whitespaceLast){
            words++;
            wordStart = t2;
          }
          whitespaceLast = false;
        }
      }
      var string = text.substring(t1, t2+1);
      string = string.replace(/"/gm, '');
      string = string.trim();
      text = text.substring(t.index+string.length);
      t = t[0];
      matched.push(t.toLowerCase());
      terms.push(string.toLowerCase());
      //t = t[0];
      //terms[t.toLowerCase()] = t.toLowerCase();
    }
    // shuffle terms with id as seed
    var sd = 0;
    for(var i=0; i<id.length; i++)
      sd+=id.charCodeAt(i);
      seed = sd;
    for(var i=0; i<terms.length; i++){
      var s = terms.splice(Math.floor(randomSeeded()*terms.length), 1);
      terms.push(s);
    }
    /*var rTerms = [];
    for(var t in terms)
      rTerms.push(terms[t]);*/
    return terms;
  }
  function updateCardsWithMeta(data){
    for(var i in data){
      var d = data[i];
      var card = $('#card-'+d.objectId);
      var cat = d.amazonRootBrowseNodeName;
      cat = CategoryMetas[cat];
      if(card && cat){
        if(!cat.regex){
          var terms = cat.allFeatureKeys.map(function(n){
            return escapeRegExp(n);
          });
          cat.regex = terms.join('|');
        }
        var text = (d.description||'')+' '+(d.amazonFeatures||'');
        var rTerms = expandedMetaFromText(text, cat.regex, 5, ProductSearch||'asdf');
        data[i].metaTerms = rTerms;
        card.find('.miniDescription').text(rTerms.join(', '));
        card.find('.miniDescription').show();
      }
    }
    sizeCards(window.innerWidth, window.innerHeight); 
  }
  var renderCardsWithData = function(data, append){
    if(data && !append){
      if(data.length && data[0].amazonRootBrowseNodeName){
        $('#searchCategoryBackText').text(data[0].amazonRootBrowseNodeName);
        $('#searchCategoryBack').attr('href', '/browse/'+encodeURIComponent(data[0].amazonRootBrowseNodeName));
      }
    }
    // start fetching the category meta
    var categories = {};
    for(var i in data){
      if(data[i].amazonRootBrowseNodeName && !CategoryMetas[data[i].amazonRootBrowseNodeName])
        categories[encodeURIComponent(data[i].amazonRootBrowseNodeName)] = true;
    }
    categories = Object.keys(categories);
    if(categories.length){
      for(var i in categories){
        categories[i] = 'categories='+categories[i];
      }
      var params = {
        url: API_URL+'categoryMeta?'+categories.join('&')
      }
      ajaxSturdy(params, 5000, 0, function(err, data2){
        if(!err){
          for(var i in data2){
            CategoryMetas[data2[i].name] = data2[i];
          }
          //renderCardsWithData(data, append);
          updateCardsWithMeta(data);
        }else{
        }
      });
    }else{
      updateCardsWithMeta(data);
    }

    var links = data.map(function(a){
      var n = {};
      n.url = a.amazonURL||a.bizrateURL;
      return n;
    });
    //- console.log(links)
    //- links.push('http://www.amazon.com/Mojang-Minecraft-Pocket-Edition/dp/B00992CF6W%3FSubscriptionId%3DAKIAJQA6PK5J5ZC4LTRQ%26tag%3Dshopperr-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00992CF6W');
    $.ajax({
      url: 'https://api.bringhub.io/v1/spc',
      dataType: 'json',
      contentType: 'application/json',
      type: 'PUT',
      headers: {
        'X-Publisher-Id': _PublisherId,
        'X-Partner-Id': _PartnerId,
        'X-Session-Id':_SessionId
      },
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      data: JSON.stringify({
        type: 'scan',
        publisherId: _PublisherId,
        url: 'http://www.shopperr.com/',
        image: 'http://shopperr.com/images/logo-white.svg',
        description: 'Shop for Top Rated Products on Shopperr',
        title: 'Top Rated Products on Shopperr',
        links: links
      })
    }).done(function(data){
      //console.log(data);
      var lnks = data.links;
      console.log('bringhub loaded', lnks);
      for(var i in lnks){
        for(var j in Products){
          if(Products[j].amazonURL == lnks[i].url){
            Products[j].bringhubId = lnks[i].pid;
          }
        }
      }
    }).fail(function(jqXHR, textStatus){
      console.log(jqXHR);
    });

    var node;
    var template = $($('.views .product-card')[0]);
    var root = $('.products>ul');
    if(!append){
      root.html('');
    }
    if(!data.length){
      $('.cube').hide();
      return;
    }
    var num = data.length;
    // fill in the html templates and bind to sizeCards after everything is loaded
    for(var i in data){
      if(!data[i].images.length){
        num--;
        continue;
      }
      Products[data[i].objectId] = data[i];
      node = template.clone();
      node.find('img').bind('load', function(){
        num--;
        if(num == 0){
          setTimeout(function(){
            updateCardsWithMeta(data);
          }, 100);
        }
      });
      node.find('img').attr('src', data[i].images[0].url);
      node.find('.card').attr('id', 'card-'+data[i].objectId);
      node.find('.id').text(data[i].objectId);
      node.find('.price').text(pricePretty(data[i].price));
      node.find('.title').html(truncate(data[i].title, 36));
      node.find('.manufacturer').html(data[i].displayBrand);
      node.find('.scoreradial-small svg:first-child path').attr('stroke', 'url(#cl2-'+data[i].objectId+')');
      node.find('.cardscore linearGradient').attr('id', 'cl2-'+data[i].objectId);
      var thresh = false;
      if(data[i].socialCounts){
        var counts = data[i].socialCounts;
        var fbC=0, twC=0, pnC=0;
        for(var c in counts){
          if(counts[c].Facebook && counts[c].Facebook.total_count)
            fbC += counts[c].Facebook.total_count;
          if(counts[c].Twitter)
            twC += counts[c].Twitter;
          if(counts[c].Pinterest)
            pnC += counts[c].Pinterest;
        }
        if(fbC+twC+pnC+1 < 5)
          thresh = false;
        else
          thresh = true;
      }
      if(thresh){
        var score = data[i].score;
        var s = Math.round(score);
        if(s >= 80){
          node.find('.scoreradialstop1-small').attr('stop-color', '#8bc34b');
          node.find('.scoreradialstop2-small').attr('stop-color', '#8bc34b');
          node.find('.scoreradialcontent-small').removeClass('score-good');
          node.find('.scoreradialcontent-small').removeClass('score-poor');
          node.find('.scoreradialcontent-small').addClass('score-great');
        }else if(s >= 60){
          node.find('.scoreradialstop1-small').attr('stop-color', '#f7bc31');
          node.find('.scoreradialstop2-small').attr('stop-color', '#f7bc31');
          node.find('.scoreradialcontent-small').removeClass('score-great');
          node.find('.scoreradialcontent-small').removeClass('score-poor');
          node.find('.scoreradialcontent-small').addClass('score-good');
        }else{
          node.find('.scoreradialstop1-small').attr('stop-color', '#ec5638');
          node.find('.scoreradialstop2-small').attr('stop-color', '#ec5638');
          node.find('.scoreradialcontent-small').removeClass('score-great');
          node.find('.scoreradialcontent-small').removeClass('score-good');
          node.find('.scoreradialcontent-small').addClass('score-poor');
        }
        node.find('.scoreradialcontent-small').attr('data-percent', Math.round(score));
        node.find('.scoreradialpath-small').attr('stroke-dashoffset', Math.round(score/100*629));
        node.find('.scoreradialcontent-small').removeClass('nothreshold');
      }else{
        node.find('.scoreradialcontent-small').attr('data-percent', 'NS');
        node.find('.scoreradialpath-small').attr('stroke-dashoffset', 0);
        node.find('.scoreradialcontent-small').addClass('nothreshold');
      }
      var miniDescription = '';
      var overLengthIndex = -1;
      var desLength = 0;
      var features = [];
      var metaFeatures = [];
      if(data[i].features){
        // fetch from the features
        for(var j in data[i].amazonFeatures){
          var feature = data[i].amazonFeatures[j];
          if(feature[feature.length-1] == '.' || feature[feature.length-1] == ',')
              feature = feature.substring(0, feature.length-1);
          if(feature.length > 26 && feature.length <= 100)
            overLengthIndex == j;
          if(feature.length >= 4 && feature.length <= 26){
            //miniDescription += feature;
            features.push(feature);
            desLength += feature.length;
            if(desLength > 100)
              break;
          }
        }
        // fetch from the description
        if(data[i].description){
          /*metaFeatures = data[i].description.split(/\.|•|◦|‣|\n|<br>|<br\/>/gi);
          // trim and filter for minimum length
          metaFeatures = metaFeatures.map(function(n){return n.trim();})
          var long = metaFeatures.filter(function(n){return n.length>26;});
          var short = metaFeatures.filter(function(n){return n.length>=4&&n.length<=26;});
          metaFeatures = short;*/
        }
        if(desLength){
          features.sort(function(a,b){
            return (a[a.length-1]>b[b.length-1]);
          });
          miniDescription = features.join(', ');
        }
        if(!desLength && overLengthIndex > -1)
          miniDescription = data[i].features[overLengthIndex].trim();
      }
      if(miniDescription)
        node.find('.miniDescription').text(miniDescription);
      else
        if(!data[i].metaTerms)
          node.find('.miniDescription').hide();

      root.append(node);
    }

    updateCardsWithMeta(data);
    wireCards();
  }

  $('#productModal').on('show.bs.modal', function(){
    if(window.dataLayer){
      dataLayer.push({
        'event': 'VirtualPageview',
        'virtualPageURL': '/product/'+$('#productModal-id').text(),
        'virtualPageTitle': $('#productModal-title').text()
      });
    }
  });
  $('#productModal').on('hide.bs.modal', function(){
    if(window.dataLayer){
      dataLayer.push({
        'event': 'VirtualPageview',
        'virtualPageURL': location.pathname,
        'virtualPageTitle': 'Top Rated Products on Shopperr'
      });
    }
  });

  function ajaxSturdy(params, timeout, times, callback){
    params.timeout = timeout;
    $.ajax(params).done(function(data){
      if(data)
        return callback(null, data);
    }).fail(function(jqXHR, textStatus){
      timeout*=2;
      if(timeout>30000)
        timeout=30000;
      if(times){
        times--;
        // wait a little extra if server is querying amazon
        if(jqXHR.status == 200){
          setTimeout(function(){
            ajaxSturdy(params, timeout, times, callback);
          }, timeout/4);
        }else
          ajaxSturdy(params, timeout, times, callback);
      }else{
        return callback(jqXHR);
      }
    });
  }

  $('#productModal').scroll(function(){
    if($(document).width() < 992) return;
    var max = $('#productModal .modal-body').height()-parseInt($('#productModal .modal-body').css('padding-bottom'));
    if($(this).scrollTop()+543 < max){
      $('#productModal .imagerow').css('top', $(this).scrollTop()+0);
      $('#productModal .imagebars').css('top', $(this).scrollTop()+543);
    }else{
      $('#productModal .imagerow').css('top', max-543);
      $('#productModal .imagebars').css('top', max);
    }
  });

  var offset;
  (function(){
    var view, indicator, relative,
        min, max, reference, pressed, xform,
        velocity, frame, timestamp, ticker,
        amplitude, target, timeConstant;

    function ypos(e) {
        // touch event
        if (e.targetTouches && (e.targetTouches.length >= 1)) {
            return e.targetTouches[0].clientY;
        }

        // mouse event
        return e.clientY;
    }

    function scroll(y) {
        //offset = (y > max) ? max : (y < min) ? min : y;
        //view.style[xform] = 'translateY(' + (-offset) + 'px)';
        manualScroll(-y);
        //indicator.style[xform] = 'translateY(' + (offset * relative) + 'px)';
    }

    function track() {
        var now, elapsed, delta, v;

        now = Date.now();
        elapsed = now - timestamp;
        timestamp = now;
        delta = offset - frame;
        frame = offset;

        v = 1000 * delta / (1 + elapsed);
        velocity = 0.8 * v + 0.2 * velocity;
    }

    function autoScroll() {
        var elapsed, delta;

        if (amplitude) {
            elapsed = Date.now() - timestamp;
            delta = -amplitude * Math.exp(-elapsed / timeConstant);
            if (delta > 0.5 || delta < -0.5) {
                scroll(target + delta);
                requestAnimationFrame(autoScroll);
            } else {
                scroll(target);
            }
        }
    }

    function tap(e) {
        pressed = true;
        reference = ypos(e);

        velocity = amplitude = 0;
        frame = offset;
        timestamp = Date.now();
        clearInterval(ticker);
        ticker = setInterval(track, 100);

        //e.preventDefault();
        //e.stopPropagation();
        //return false;
    }

    function drag(e) {
        var y, delta;
        if (pressed) {
            y = ypos(e);
            delta = reference - y;
            if (delta > 2 || delta < -2) {
                reference = y;
                scroll(offset + delta);
            }
        }
        e.preventDefault();
        //e.stopPropagation();
        return false;
    }

    function release(e) {
        pressed = false;

        clearInterval(ticker);
        if (velocity > 10 || velocity < -10) {
            amplitude = 0.8 * velocity;
            target = Math.round(offset + amplitude);
            timestamp = Date.now();
            requestAnimationFrame(autoScroll);
        }

        //e.preventDefault();
        //e.stopPropagation();
        //return false;
    }

    //view = document.getElementById('view');
    view = $('#productModal .modal-body')[0];
    if (typeof window.ontouchstart !== 'undefined') {
        view.addEventListener('touchstart', tap);
        view.addEventListener('touchmove', drag);
        view.addEventListener('touchend', release);
    }
    //- view.addEventListener('mousedown', tap);
    //- view.addEventListener('mousemove', drag);
    //- view.addEventListener('mouseup', release);

    max = parseInt(getComputedStyle(view).height, 10) - innerHeight;
    offset = min = 0;
    pressed = false;
    timeConstant = 325; // ms

    //indicator = document.getElementById('indicator');
    relative = (innerHeight - 30) / max;

    xform = 'transform';
    ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {
        var e = prefix + 'Transform';
        if (typeof view.style[e] !== 'undefined') {
            xform = e;
            return false;
        }
        return true;
    });
  })();

  var prescrollW = Math.ceil(5-$(window).width()/imageWidth)||1;
  if(prescrollW <= 0)
    prescrollW = 1;
  var prescrollHeight = $(window).height()*prescrollW+100;
  var loadingData = true;
  var currentPage = 1;
  $(window).scroll(function(e){
    var top = $(window).scrollTop();
    if(!loadingData && ($(window).height()+top+prescrollHeight >= $(document).height())){
      loadingData = true;
      var params = {};
      if(ProductSearch){
        params.url = API_URL+'products?term='+encodeURIComponent(ProductSearch)+'&page='+(currentPage+1)+'&st='+ProductSearchType;
      }else if(ProductCategory){
        params.url = API_URL+'products?category='+encodeURIComponent(ProductCategory)+'&page='+(currentPage+1)+'&st='+ProductSearchType;
      }else if(ProductList){
        params.url = API_URL+'featured/'+encodeURIComponent(ProductList)+'?page='+(currentPage+1);
      }
      if(params.url){
        $('.cube').show();
        ajaxSturdy(params, 5000, 4, function(err, data){
          if(!err){
            loadingData = false;
            currentPage++;
            renderCardsWithData(data, true);
          }
        });
      }
    }
  });

  function sizeProductModal(){
    //$('#productModal .modal-lg').css('height', (window.innerHeight-parseInt($('#productModal .modal-lg').css('marginTop'))*2)+'px');
  }

  $(window).load(function() {
    sizeProductModal();
    if(!_Products.length && ProductList){
      // load products async
      $('.cube').show();
      var params = {
        url: API_URL+'featured/'+encodeURIComponent(ProductList)
      };
      ajaxSturdy(params, 5000, 4, function(err, data){
        if(!err){
          renderCardsWithData(data);
          $('.cube').show();
          params.url = API_URL+'featured/'+encodeURIComponent(ProductList)+'?page=2';
          setTimeout(function(){
            ajaxSturdy(params, 5000, 4, function(err, data2){
              if(!err){
                renderCardsWithData(data2, true);
                currentPage = 2;
                loadingData = false;
              }else{
                $('.cube').hide();
              }
            });
          }, 100);
        }else{
          $('.cube').hide();
          if(window.location.pathname != '/')
            window.location = '/';
        }
      });
    }else if(!_Products.length && ProductCategory){
      // load products async
      $('.cube').show();
      var params = {
        url: API_URL+'products?category='+encodeURIComponent(ProductCategory)+'&st='+ProductSearchType
      };
      ajaxSturdy(params, 5000, 4, function(err, data){
        if(!err){
          renderCardsWithData(data);
          $('.cube').show();
          params.url = API_URL+'products?category='+encodeURIComponent(ProductCategory)+'&page=2'+'&st='+ProductSearchType;
          setTimeout(function(){
            ajaxSturdy(params, 5000, 4, function(err, data2){
              if(!err){
                renderCardsWithData(data2, true);
                currentPage = 2;
                loadingData = false;
              }else{
                $('.cube').hide();
              }
            });
          }, 100);
        }else{
          $('.cube').hide();
          if(window.location.pathname != '/')
            window.location = '/';
        }
      });
    }else if(!_Products.length && ProductSearch){
      // load products async
      $('.cube').show();
      var params = {
        url: API_URL+'products?term='+encodeURIComponent(ProductSearch)+'&st='+ProductSearchType
      };
      ajaxSturdy(params, 5000, 4, function(err, data){
        if(!err){
          loadingData = false;
          renderCardsWithData(data);
          $('.cube').show();
          var params = {};
          params.url = API_URL+'products?term='+encodeURIComponent(ProductSearch)+'&page=2'+'&st='+ProductSearchType;
          setTimeout(function(){
            ajaxSturdy(params, 5000, 4, function(err, data2){
              if(!err){
                renderCardsWithData(data2, true);
                currentPage = 2;
                loadingData = false;
              }else{
                $('.cube').hide();
              }
            });
          }, 100);
        }else{
          $('.cube').hide();
          if(window.location.pathname != '/')
            window.location = '/';
        }
      });
    }else if(_Products.length){
      renderCardsWithData(_Products);
      $('.cube').show();
      var params = {};
      if(ProductSearch){
        params.url = API_URL+'products?term='+encodeURIComponent(ProductSearch)+'&page=2'+'&st='+ProductSearchType;
      }else if(ProductCategory){
        params.url = API_URL+'products?category='+encodeURIComponent(ProductCategory)+'&page=2'+'&st='+ProductSearchType;
      }else if(ProductList){
        params.url = API_URL+'featured/'+encodeURIComponent(ProductList)+'?page=2';
      }
      setTimeout(function(){
        ajaxSturdy(params, 5000, 4, function(err, data2){
          if(!err){
            renderCardsWithData(data2, true);
            currentPage = 2;
            loadingData = false;
          }else{
            $('.cube').hide();
          }
        });
      }, 100);
    }
    $('body').append('<div id="dynamic-content"></div>');
  });

  if(ProductSearch || ProductCategory){
    $('#secondmenu-collapse').addClass('bottom-shadow-light');

    var tp = 'magic';
    if(ProductSearchType)
      tp = ProductSearchType;
    var index = ['magic', 'score', 'trending', 'budget'].indexOf(tp);
    $('#secondmenu-collapse a').removeClass('active');
    $($('#secondmenu-collapse a')[index]).addClass('active');

    var h = $('div.container-fluid.browse-header').outerHeight();
    $('nav.navbar.navbar-default').css('position', 'relative');
    $('nav.navbar.navbar-default').css('top', h+'px');
  }

  window.onresize = function(e) {
    //console.log('window.onresize', window.innerWidth)
    sizeCards(window.innerWidth, window.innerHeight);
    sizeProductModal();
  };

  $('#productModal-score').hover(function(){
    if(scoreDetailMode == false){
      $('#productModal .scorebanner-corner1').css('background-color', '#f7f7f7');
      $('#productModal .scorebanner-corner2').css('background-color', '#f7f7f7');
      $('#productModal-score').css('background-color', '#f7f7f7');
      $('#productModal-score').css('cursor', 'pointer');
    }
  }, function(){
    if(scoreDetailMode == false){
      $('#productModal .scorebanner-corner1').css('background-color', '#fff');
      $('#productModal .scorebanner-corner2').css('background-color', '#fff');
      $('#productModal-score').css('background-color', '#fff');
      $('#productModal-score').css('cursor', 'auto');
    }
  });

  $('.arrow-left').click(function(){
    // load the previous product
    changeProduct(-1);
  });
  $('.arrow-right').click(function(){
    // load the previous product
    changeProduct(1);
  });
  function changeProduct(offset){
    var index = 0;
    var id = $('#productModal .id').text();
    var obj = Object.keys(Products);
    for(var i in obj){
      if(Products[obj[i]].objectId == id){
        break;
      }
      index++;
    }
    index+=offset;
    if(index < 0)
      index = obj.length-1;
    if(index >= obj.length)
      index = 0;

    $('#productModal .modal-body').css('opacity', 0);
    setTimeout(function(){
      $('#productModal .modal-body').css('transform', 'translateY(0px)');
      $('#productModal .imagerow').css('transform', 'translateY('+(0)+'px)');
      $('#productModal .imagebars').css('transform', 'translateY('+(0)+'px)');
      gy = 0;
      setModal(obj[index]);
      if(scoreDetailMode){
        showScoreDetail();
      }else if(imageDetailMode){
        showImageDetail();
      }else{
        hideScoreDetail();
        hideImageDetail();
      }
      $('#productModal .modal-body').css('opacity', 1);
    }, 300);
  }

  $(document).keydown(function(e){
    if(e.which == 37){
      $('#productModal .arrow-left').trigger('click');
    }else if(e.which == 39){
      $('#productModal .arrow-right').trigger('click');
    }
  });

});
</script>