//iOS6Switch.js
(function(){
//FastClick 0.6.7
function FastClick(a){"use strict";var b,c=this;if(this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=10,this.layer=a,!a||!a.nodeType)throw new TypeError("Layer must be a document node");this.onClick=function(){return FastClick.prototype.onClick.apply(c,arguments)},this.onMouse=function(){return FastClick.prototype.onMouse.apply(c,arguments)},this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(c,arguments)},this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(c,arguments)},this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(c,arguments)},FastClick.notNeeded(a)||(this.deviceIsAndroid&&(a.addEventListener("mouseover",this.onMouse,!0),a.addEventListener("mousedown",this.onMouse,!0),a.addEventListener("mouseup",this.onMouse,!0)),a.addEventListener("click",this.onClick,!0),a.addEventListener("touchstart",this.onTouchStart,!1),a.addEventListener("touchend",this.onTouchEnd,!1),a.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(a.removeEventListener=function(b,c,d){var e=Node.prototype.removeEventListener;"click"===b?e.call(a,b,c.hijacked||c,d):e.call(a,b,c,d)},a.addEventListener=function(b,c,d){var e=Node.prototype.addEventListener;"click"===b?e.call(a,b,c.hijacked||(c.hijacked=function(a){a.propagationStopped||c(a)}),d):e.call(a,b,c,d)}),"function"==typeof a.onclick&&(b=a.onclick,a.addEventListener("click",function(a){b(a)},!1),a.onclick=null))}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf("Android")>0,FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent),FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&/OS 4_\d(_\d)?/.test(navigator.userAgent),FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&/OS ([6-9]|\d{2})_\d/.test(navigator.userAgent),FastClick.prototype.needsClick=function(a){"use strict";switch(a.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(a.disabled)return!0;break;case"input":if(this.deviceIsIOS&&"file"===a.type||a.disabled)return!0;break;case"label":case"video":return!0}return/\bneedsclick\b/.test(a.className)},FastClick.prototype.needsFocus=function(a){"use strict";switch(a.nodeName.toLowerCase()){case"textarea":case"select":return!0;case"input":switch(a.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!a.disabled&&!a.readOnly;default:return/\bneedsfocus\b/.test(a.className)}},FastClick.prototype.sendClick=function(a,b){"use strict";var c,d;document.activeElement&&document.activeElement!==a&&document.activeElement.blur(),d=b.changedTouches[0],c=document.createEvent("MouseEvents"),c.initMouseEvent("click",!0,!0,window,1,d.screenX,d.screenY,d.clientX,d.clientY,!1,!1,!1,!1,0,null),c.forwardedTouchEvent=!0,a.dispatchEvent(c)},FastClick.prototype.focus=function(a){"use strict";var b;this.deviceIsIOS&&a.setSelectionRange?(b=a.value.length,a.setSelectionRange(b,b)):a.focus()},FastClick.prototype.updateScrollParent=function(a){"use strict";var b,c;if(b=a.fastClickScrollParent,!b||!b.contains(a)){c=a;do{if(c.scrollHeight>c.offsetHeight){b=c,a.fastClickScrollParent=c;break}c=c.parentElement}while(c)}b&&(b.fastClickLastScrollTop=b.scrollTop)},FastClick.prototype.getTargetElementFromEventTarget=function(a){"use strict";return a.nodeType===Node.TEXT_NODE?a.parentNode:a},FastClick.prototype.onTouchStart=function(a){"use strict";var b,c,d;if(a.targetTouches.length>1)return!0;if(b=this.getTargetElementFromEventTarget(a.target),c=a.targetTouches[0],this.deviceIsIOS){if(d=window.getSelection(),d.rangeCount&&!d.isCollapsed)return!0;if(!this.deviceIsIOS4){if(c.identifier===this.lastTouchIdentifier)return a.preventDefault(),!1;this.lastTouchIdentifier=c.identifier,this.updateScrollParent(b)}}return this.trackingClick=!0,this.trackingClickStart=a.timeStamp,this.targetElement=b,this.touchStartX=c.pageX,this.touchStartY=c.pageY,a.timeStamp-this.lastClickTime<200&&a.preventDefault(),!0},FastClick.prototype.touchHasMoved=function(a){"use strict";var b=a.changedTouches[0],c=this.touchBoundary;return Math.abs(b.pageX-this.touchStartX)>c||Math.abs(b.pageY-this.touchStartY)>c?!0:!1},FastClick.prototype.findControl=function(a){"use strict";return void 0!==a.control?a.control:a.htmlFor?document.getElementById(a.htmlFor):a.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},FastClick.prototype.onTouchEnd=function(a){"use strict";var b,c,d,e,f,g=this.targetElement;if((this.touchHasMoved(a)||a.timeStamp-this.trackingClickStart>300)&&(this.trackingClick=!1,this.targetElement=null),!this.trackingClick)return!0;if(a.timeStamp-this.lastClickTime<200)return this.cancelNextClick=!0,!0;if(this.lastClickTime=a.timeStamp,c=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,this.deviceIsIOSWithBadTarget&&(f=a.changedTouches[0],g=document.elementFromPoint(f.pageX-window.pageXOffset,f.pageY-window.pageYOffset)),d=g.tagName.toLowerCase(),"label"===d){if(b=this.findControl(g)){if(this.focus(g),this.deviceIsAndroid)return!1;g=b}}else if(this.needsFocus(g))return a.timeStamp-c>100||this.deviceIsIOS&&window.top!==window&&"input"===d?(this.targetElement=null,!1):(this.focus(g),this.deviceIsIOS4&&"select"===d||(this.targetElement=null,a.preventDefault()),!1);return this.deviceIsIOS&&!this.deviceIsIOS4&&(e=g.fastClickScrollParent,e&&e.fastClickLastScrollTop!==e.scrollTop)?!0:(this.needsClick(g)||(a.preventDefault(),this.sendClick(g,a)),!1)},FastClick.prototype.onTouchCancel=function(){"use strict";this.trackingClick=!1,this.targetElement=null},FastClick.prototype.onMouse=function(a){"use strict";return this.targetElement?a.forwardedTouchEvent?!0:a.cancelable?!this.needsClick(this.targetElement)||this.cancelNextClick?(a.stopImmediatePropagation?a.stopImmediatePropagation():a.propagationStopped=!0,a.stopPropagation(),a.preventDefault(),!1):!0:!0:!0},FastClick.prototype.onClick=function(a){"use strict";var b;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===a.target.type&&0===a.detail?!0:(b=this.onMouse(a),b||(this.targetElement=null),b)},FastClick.prototype.destroy=function(){"use strict";var a=this.layer;this.deviceIsAndroid&&(a.removeEventListener("mouseover",this.onMouse,!0),a.removeEventListener("mousedown",this.onMouse,!0),a.removeEventListener("mouseup",this.onMouse,!0)),a.removeEventListener("click",this.onClick,!0),a.removeEventListener("touchstart",this.onTouchStart,!1),a.removeEventListener("touchend",this.onTouchEnd,!1),a.removeEventListener("touchcancel",this.onTouchCancel,!1)},FastClick.notNeeded=function(a){"use strict";var b;if("undefined"==typeof window.ontouchstart)return!0;if(/Chrome\/[0-9]+/.test(navigator.userAgent)){if(!FastClick.prototype.deviceIsAndroid)return!0;if(b=document.querySelector("meta[name=viewport]"),b&&-1!==b.content.indexOf("user-scalable=no"))return!0}return"none"===a.style.msTouchAction?!0:!1},FastClick.attach=function(a){"use strict";return new FastClick(a)},"undefined"!=typeof define&&define.amd?define(function(){"use strict";return FastClick}):"undefined"!=typeof module&&module.exports?(module.exports=FastClick.attach,module.exports.FastClick=FastClick):window.FastClick=FastClick;
var id = 0;
var sList = new Array, hList = new Array;
Array.prototype.remove = function(dx){
if(isNaN(dx) || dx > this.length){
return false;
}
for(var i = 0, n = 0; i < this.length; i ++){
if(this[i] != this[dx]){
this[n ++] = this[i];
}
}
this.length -= 1;
}
var getBorderWidth = function(e, b){
var w = Number(e.css("border-" + b + "-width").replace(/px/g, ""));
isNaN(w) && (w = 0);
return w;
}
var init = function(_elem, _opt){
if(_elem.attr("ios6switch") == "true") return;
_elem.attr("ios6switch", "true");
_opt.showOriginalCheckbox != true && _elem.css("display", "none");
var switchelement = '
';
_elem.after(switchelement);
sList.push("ios6switch" + id);
hList.push(-1);
var thisid = id;
var _switcher = $(".ios6switch" + id);
_opt.addClass != "" && _switcher.addClass(_opt.addClass);
_switcher.css({
height: _opt.size + "px"
});
_switcher.find(".ios6switch_switch_on").html(_opt.switchonText);
_switcher.find(".ios6switch_switch_off").html(_opt.switchoffText);
_switcher.find(".ios6switch_switch_on").css({
"background-color": _opt.switchonColor,
"color": _opt.switchonTextColor,
});
_switcher.find(".ios6switch_switch_off").css({
"background-color": _opt.switchoffColor,
"color": _opt.switchoffTextColor,
});
_opt.thumbSwitchonColor == "" && (_opt.thumbSwitchonColor = _opt.thumbColor);
_opt.thumbPressedColor == "" && (_opt.thumbPressedColor = _opt.thumbColor);
_opt.thumbSwitchonPressedColor == "" && (_opt.thumbSwitchonPressedColor = _opt.thumbPressedColor);
_switcher.find(".ios6switch_thumb").attr("data-thumb-color", _opt.thumbColor);
_switcher.find(".ios6switch_thumb").attr("data-thumb-on-color", _opt.thumbSwitchonColor);
_switcher.find(".ios6switch_thumb").attr("data-thumb-pressed-color", _opt.thumbPressedColor);
_switcher.find(".ios6switch_thumb").attr("data-thumb-on-pressed-color", _opt.thumbSwitchonPressedColor);
_switcher.find(".ios6switch_thumb").attr("data-pressed", "false");
setSize(_switcher);
setThumbColor(_switcher);
var startpress = function(){
_switcher.attr("data-disabled") != "true" && _switcher.find(".ios6switch_thumb").attr("data-pressed", "true");
setThumbColor(_switcher);
}
var endpress = function(){
_switcher.find(".ios6switch_thumb").attr("data-pressed", "false");
setThumbColor(_switcher);
}
_switcher.find(".ios6switch_thumb").mousedown(startpress);
$(document).mouseup(endpress);
_switcher.find(".ios6switch_thumb")[0].addEventListener && _switcher.find(".ios6switch_thumb")[0].addEventListener("touchstart", startpress, false);
_switcher.find(".ios6switch_thumb")[0].addEventListener && document.addEventListener('touchend', endpress, false);
var disabled = false;
var posX, lastX, dragged = false, dragging = false, dragging2 = false;
if(_opt.draggable == true){
var startdrag = function(e){
if(disabled != true){
if(e.changedTouches) {
e.pageX = e.changedTouches[0].pageX;
}
posX = e.pageX - _switcher.find(".ios6switch_draglayer").position().left;
_switcher.find(".ios6switch_draglayer").stop(true);
lastX = e.pageX;
dragging = true;
}
}
var stopdrag = function(){
if(dragging2 == true){
dragged = true;
toggleswitch();
}
dragging = false;
dragging2 = false;
}
var move = function(e){
if(e.changedTouches){
e.pageX = e.changedTouches[0].pageX;
}
if(dragging == true && Math.abs(e.pageX - lastX) > 5){
dragging2 = true;
}
if(dragging2 == true){
var thisposX = e.pageX - posX;
if(thisposX < 0){
thisposX = 0;
}
else if(thisposX > _switcher.innerWidth() - _switcher.innerHeight()){
thisposX = _switcher.innerWidth() - _switcher.innerHeight();
}
_switcher.find(".ios6switch_draglayer").css({
"left": thisposX + "px"
});
setThumbColor(_switcher);
}
dragging && (e.preventDefault ? e.preventDefault() : window.event.returnValue = false);
}
_switcher.find(".ios6switch_thumb").mousedown(startdrag);
$(document).mouseup(stopdrag);
$(document).mousemove(move);
_switcher.find(".ios6switch_thumb")[0].addEventListener && _switcher.find(".ios6switch_thumb")[0].addEventListener("touchstart", startdrag, false);
document.addEventListener && document.addEventListener('touchend', stopdrag, false);
document.addEventListener && document.addEventListener('touchmove', function(e){
if(e.targetTouches.length <= 1 && dragging == true) move(e);
}, false);
}
var disable = function(){
disabled = true;
_switcher.css("opacity", _opt.disabledOpacity);
_switcher.attr("data-disabled", "true");
_elem[0].disabled = true;
}
var enable = function(){
disabled = false;
_switcher.css("opacity", "");
_switcher.attr("data-disabled", "false");
_elem[0].disabled = false;
}
_elem[0].disabled == true && disable();
var checkstatus = _elem[0].checked;
_elem[0].checked == true && _switcher.find(".ios6switch_draglayer").css("left", ((_switcher.innerHeight() * 79 / 27) - _switcher.innerHeight()) + "px");
FastClick.attach(_switcher[0]);
_elem.click(function(){
checkstatus = !_elem[0].checked;
toggleswitch();
});
var soundElement;
if(_opt.sound != ""){
soundElement = "";
$("body").append(soundElement);
};
var toggleswitch = function(){
if(disabled == true) return;
var thumbx = _switcher.find(".ios6switch_draglayer").position().left;
var switchw = _switcher.innerWidth() - _switcher.innerHeight();
var evt = document.createEvent ? document.createEvent("HTMLEvents") : false;
evt && evt.initEvent("change", true, true);
_switcher.attr("hasAnimate", "true");
if(dragged == true && thumbx <= switchw / 2 || dragged != true && checkstatus == true){
_switcher.find(".ios6switch_draglayer").stop(true).animate({
left: "0px"
}, (thumbx / switchw) * _opt.animateSpeed, _opt.animateEasing, function(){
_switcher.removeAttr("hasAnimate");
_elem[0].checked = false;
evt ? _elem[0].dispatchEvent(evt) : _elem[0].fireEvent("onchange");
});
checkstatus = false;
}
else{
_switcher.find(".ios6switch_draglayer").stop(true).animate({
left: (_switcher.innerWidth() - _switcher.innerHeight()) + "px"
}, ((switchw - thumbx) / switchw) * _opt.animateSpeed, _opt.animateEasing, function(){
_switcher.removeAttr("hasAnimate");
_elem[0].checked = true;
evt ? _elem[0].dispatchEvent(evt) : _elem[0].fireEvent("onchange");
});
checkstatus = true;
}
setTimeout(function(){
dragged = false;
}, 10);
if(_opt.sound != "" && typeof $("#switchsound" + thisid)[0].play != "undefined"){
$("#switchsound" + thisid)[0].currentTime = 0;
$("#switchsound" + thisid)[0].play();
}
}
_switcher[0].addEventListener ? _switcher[0].addEventListener("click", toggleswitch) : _switcher[0].attachEvent("onclick", toggleswitch);
var switchon = function(){
checkstatus = false;
toggleswitch();
}
var switchoff = function(){
checkstatus = true;
toggleswitch();
}
var destroy = function(){
sList.remove(thisid);
hList.remove(thisid);
id --;
_elem.unbind("disable");
_elem.unbind("enable");
_elem.unbind("switchon");
_elem.unbind("switchoff");
_elem.unbind("toggleswitch");
_elem.unbind("destroy");
_switcher.remove();
$("#switchsound" + thisid).remove();
_elem.removeAttr("ios6switch");
_elem.css("display", "");
}
id ++;
_elem.bind("disable", disable);
_elem.bind("enable", enable);
_elem.bind("switchon", switchon);
_elem.bind("switchoff", switchoff);
_elem.bind("toggleswitch", toggleswitch);
_elem.bind("destroy", destroy);
}
var startinterval = false;
var interval = function(){
if(startinterval != true) return;
for(var i = 0; i < id; i ++){
var te = $("." + sList[i]);
if(hList[i] != te.innerHeight()){
setSize(te);
hList[i] = te.innerHeight();
}
te.attr("hasAnimate") == "true" && setThumbColor(te);
}
}
setInterval(interval, 25);
var setThumbColor = function(te){
var switchh = te.innerHeight();
var switchw = te.innerWidth();
var layerx = te.find(".ios6switch_draglayer").position().left;
if(te.find(".ios6switch_thumb").attr("data-pressed") == "true"){
(layerx <= (switchw - switchh) / 2) ? te.find(".ios6switch_thumb").css("background-color", te.find(".ios6switch_thumb").attr("data-thumb-pressed-color")) : te.find(".ios6switch_thumb").css("background-color", te.find(".ios6switch_thumb").attr("data-thumb-on-pressed-color"));
}
else{
(layerx <= (switchw - switchh) / 2) ? te.find(".ios6switch_thumb").css("background-color", te.find(".ios6switch_thumb").attr("data-thumb-color")) : te.find(".ios6switch_thumb").css("background-color", te.find(".ios6switch_thumb").attr("data-thumb-on-color"));
}
}
var setSize = function(te){
var layerat = te.find(".ios6switch_draglayer").position().left / te.innerWidth();
te.css("width", (te.innerHeight() * 79 / 27) + "px");
var thumbx = te.find(".ios6switch_thumb").position().left;
var thumbb1 = getBorderWidth(te.find(".ios6switch_thumb"), "top");
var thumbb2 = getBorderWidth(te.find(".ios6switch_thumb"), "bottom");
var layerx = te.find(".ios6switch_draglayer").position().left;
var switchh = te.innerHeight();
var switchw = te.innerWidth();
te.find(".ios6switch_thumb").css({
width: (switchh - thumbb1 - thumbb2) + "px",
height: (switchh - thumbb1 - thumbb2) + "px"
});
te.css("border-radius", (te.outerHeight() / 2) + "px");
te.find(".ios6switch_switch_on").css("left", (thumbx + (switchh / 2) - switchw) + "px");
te.find(".ios6switch_switch_off").css("left", (thumbx + (switchh / 2)) + "px");
te.find(".ios6switch_draglayer").css("left", (te.innerWidth() * layerat) + "px");
te.find(".ios6switch_switch_on, .ios6switch_switch_off").css({
"line-height" : switchh + "px",
"font-size" : (switchh * .7) + "px"
});
}
$.fn.extend({
ios6switch: function(opt){
var _def = {
draggable: true,
size: 27,
showOriginalCheckbox: false,
disabledOpacity: 0.5,
animateSpeed: 400,
animateEasing: "swing",
addClass: "",
sound: "",
thumbColor: "#FFFFFF",
thumbPressedColor: "#CCCCCC",
thumbSwitchonColor: "",
thumbSwitchonPressedColor: "",
switchoffColor: "#FFFFFF",
switchonColor: "#008AF2",
switchoffTextColor: "#555555",
switchonTextColor: "#FFFFFF",
switchoffText: "0",
switchonText: "1"
}
var opt = opt || {};
var _opt = $.extend(_def, opt);
for(i in $(this)){
var te = $(this).eq(i);
startinterval = true;
te.is("input[type=checkbox]") && init($(this).eq(i), _opt);
}
}
})
})(jQuery);