Giỏ hàng
ÁO THUN GIA ĐÌNH IN HÌNH TÙY CHỌN THEO YÊU CẦU
    KHUYẾN MÃI

ÁO THUN GIA ĐÌNH IN HÌNH TÙY CHỌN THEO YÊU CẦU

04/01/2017

ÁO THUN GIA ĐÌNH IN HÌNH TÙY CHỌN THEO YÊU CẦU LẤY NHANH 15 PHÚT GIÁ KHUYẾN MÃI 20% CHO NĂM MỚI 2019

ÁO MÙA NOEL 2019
    KHUYẾN MÃI

ÁO MÙA NOEL 2019

12/12/2016

Chụp hình kỉ niệm đón giáng sinh với áo thun gia đình in hình giáng sinh cực đẹp... In áo gia đình, áo đôi theo yêu cầu nhé!!!!

ĐẶT ÁO LỚP TẶNG HUY HIỆU LỚP, TẶNG ÁO CHO GVCN
    KHUYẾN MÃI

ĐẶT ÁO LỚP TẶNG HUY HIỆU LỚP, TẶNG ÁO CHO GVCN

22/09/2014

1. ĐẶT ÁO LỚP TẶNG HUY HIỆU LỚP, VÀ FREE ÁO CHO GVCN 2. KHUYẾN MÃI NĂM HỌC MỚI, ÁO LỚP CHỈ VỚI 70K

ÁO LỚP MÙA TRẠI 26-03
    KHUYẾN MÃI

ÁO LỚP MÙA TRẠI 26-03

10/02/2014

Đơn hàng từ 38 áo trở lên được tặng thêm 3 áo. (áp dụng cho đơn hàng áo đồng phục lớp)

VUI NOEL 2018 LÀM ÁO LỚP NHẬN QUÀ TẶNG HẤP DẪN
    KHUYẾN MÃI

VUI NOEL 2018 LÀM ÁO LỚP NHẬN QUÀ TẶNG HẤP DẪN

07/12/2013

VUI NOEL 2018 LÀM ÁO LỚP NHẬN QUÀ TẶNG HẤP DẪN

SIÊU KHUYẾN MÃI NGÀY TỰU TRƯỜNG
    KHUYẾN MÃI

SIÊU KHUYẾN MÃI NGÀY TỰU TRƯỜNG

19/09/2013

ÁO LỚP CHỈ CÒN 70.000/ÁO VỚI CÁC MÀU : TRẮNG, VÀNG, XANH CỐM, XANH TRỜI, HỒNG PHẤN, XANH THIÊN THANH VÀ 80.000/ÁO CHO TẤT CẢ CÁC MÀU KHÁC

Cách Thức Đặt Hàng Qua Mạng
    KHUYẾN MÃI

Cách Thức Đặt Hàng Qua Mạng

03/08/2011

Cách Thức Đặt Hàng Qua Mạng

<canvas id="c"></canvas>

canvas {
  display: block;
  width: 100vw;
  height: 100vh;
}


var c = document.getElementById("c");
var ctx = c.getContext("2d");
var cH;
var cW;
var bgColor = "#FF6138";
var animations = [];
var circles = [];

var colorPicker = (function() {
  var colors = ["#FF6138", "#FFBE53", "#2980B9", "#282741"];
  var index = 0;
  function next() {
    index = index++ < colors.length-1 ? index : 0;
    return colors[index];
  }
  function current() {
    return colors[index]
  }
  return {
    next: next,
    current: current
  }
})();

function removeAnimation(animation) {
  var index = animations.indexOf(animation);
  if (index > -1) animations.splice(index, 1);
}

function calcPageFillRadius(x, y) {
  var l = Math.max(x - 0, cW - x);
  var h = Math.max(y - 0, cH - y);
  return Math.sqrt(Math.pow(l, 2) + Math.pow(h, 2));
}

function addClickListeners() {
  document.addEventListener("touchstart", handleEvent);
  document.addEventListener("mousedown", handleEvent);
};

function handleEvent(e) {
    if (e.touches) { 
      e.preventDefault();
      e = e.touches[0];
    }
    var currentColor = colorPicker.current();
    var nextColor = colorPicker.next();
    var targetR = calcPageFillRadius(e.pageX, e.pageY);
    var rippleSize = Math.min(200, (cW * .4));
    var minCoverDuration = 750;
    
    var pageFill = new Circle({
      x: e.pageX,
      y: e.pageY,
      r: 0,
      fill: nextColor
    });
    var fillAnimation = anime({
      targets: pageFill,
      r: targetR,
      duration:  Math.max(targetR / 2 , minCoverDuration ),
      easing: "easeOutQuart",
      complete: function(){
        bgColor = pageFill.fill;
        removeAnimation(fillAnimation);
      }
    });
    
    var ripple = new Circle({
      x: e.pageX,
      y: e.pageY,
      r: 0,
      fill: currentColor,
      stroke: {
        width: 3,
        color: currentColor
      },
      opacity: 1
    });
    var rippleAnimation = anime({
      targets: ripple,
      r: rippleSize,
      opacity: 0,
      easing: "easeOutExpo",
      duration: 900,
      complete: removeAnimation
    });
    
    var particles = [];
    for (var i=0; i<32; i++) {
      var particle = new Circle({
        x: e.pageX,
        y: e.pageY,
        fill: currentColor,
        r: anime.random(24, 48)
      })
      particles.push(particle);
    }
    var particlesAnimation = anime({
      targets: particles,
      x: function(particle){
        return particle.x + anime.random(rippleSize, -rippleSize);
      },
      y: function(particle){
        return particle.y + anime.random(rippleSize * 1.15, -rippleSize * 1.15);
      },
      r: 0,
      easing: "easeOutExpo",
      duration: anime.random(1000,1300),
      complete: removeAnimation
    });
    animations.push(fillAnimation, rippleAnimation, particlesAnimation);
}

function extend(a, b){
  for(var key in b) {
    if(b.hasOwnProperty(key)) {
      a[key] = b[key];
    }
  }
  return a;
}

var Circle = function(opts) {
  extend(this, opts);
}

Circle.prototype.draw = function() {
  ctx.globalAlpha = this.opacity || 1;
  ctx.beginPath();
  ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
  if (this.stroke) {
    ctx.strokeStyle = this.stroke.color;
    ctx.lineWidth = this.stroke.width;
    ctx.stroke();
  }
  if (this.fill) {
    ctx.fillStyle = this.fill;
    ctx.fill();
  }
  ctx.closePath();
  ctx.globalAlpha = 1;
}

var animate = anime({
  duration: Infinity,
  update: function() {
    ctx.fillStyle = bgColor;
    ctx.fillRect(0, 0, cW, cH);
    animations.forEach(function(anim) {
      anim.animatables.forEach(function(animatable) {
        animatable.target.draw();
      });
    });
  }
});

var resizeCanvas = function() {
  cW = window.innerWidth;
  cH = window.innerHeight;
  c.width = cW * devicePixelRatio;
  c.height = cH * devicePixelRatio;
  ctx.scale(devicePixelRatio, devicePixelRatio);
};

(function init() {
  resizeCanvas();
  if (window.CP) {
    // CodePen's loop detection was causin' problems
    // and I have no idea why, so...
    window.CP.PenTimer.MAX_TIME_IN_LOOP_WO_EXIT = 6000; 
  }
  window.addEventListener("resize", resizeCanvas);
  addClickListeners();
  if (!!window.location.pathname.match(/fullcpgrid/)) {
    startFauxClicking();
  }
  handleInactiveUser();
})();

function handleInactiveUser() {
  var inactive = setTimeout(function(){
    fauxClick(cW/2, cH/2);
  }, 2000);
  
  function clearInactiveTimeout() {
    clearTimeout(inactive);
    document.removeEventListener("mousedown", clearInactiveTimeout);
    document.removeEventListener("touchstart", clearInactiveTimeout);
  }
  
  document.addEventListener("mousedown", clearInactiveTimeout);
  document.addEventListener("touchstart", clearInactiveTimeout);
}

function startFauxClicking() {
  setTimeout(function(){
    fauxClick(anime.random( cW * .2, cW * .8), anime.random(cH * .2, cH * .8));
    startFauxClicking();
  }, anime.random(200, 900));
}

function fauxClick(x, y) {
  var fauxClick = new Event("mousedown");
  fauxClick.pageX = x;
  fauxClick.pageY = y;
  document.dispatchEvent(fauxClick);
}