123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431 |
- /*!
- * ZeroClipboard
- * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
- * Copyright (c) 2014 Jon Rohan, James M. Greene
- * Licensed MIT
- * http://zeroclipboard.org/
- * v2.0.0-beta.5
- */
- ;(function (window) {
- 'use strict'
- var _currentElement
- var _flashState = {
- bridge: null,
- version: '0.0.0',
- pluginType: 'unknown',
- disabled: null,
- outdated: null,
- unavailable: null,
- deactivated: null,
- overdue: null,
- ready: null
- }
- var _clipData = {}
- var _clipDataFormatMap = null
- var _clientIdCounter = 0
- var _clientMeta = {}
- var _elementIdCounter = 0
- var _elementMeta = {}
- var _swfPath = (function () {
- var i,
- jsDir,
- tmpJsPath,
- jsPath,
- swfPath = 'ZeroClipboard.swf'
- if (!(document.currentScript && (jsPath = document.currentScript.src))) {
- var scripts = document.getElementsByTagName('script')
- if ('readyState' in scripts[0]) {
- for (i = scripts.length; i--; ) {
- if (scripts[i].readyState === 'interactive' && (jsPath = scripts[i].src)) {
- break
- }
- }
- } else if (document.readyState === 'loading') {
- jsPath = scripts[scripts.length - 1].src
- } else {
- for (i = scripts.length; i--; ) {
- tmpJsPath = scripts[i].src
- if (!tmpJsPath) {
- jsDir = null
- break
- }
- tmpJsPath = tmpJsPath.split('#')[0].split('?')[0]
- tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf('/') + 1)
- if (jsDir == null) {
- jsDir = tmpJsPath
- } else if (jsDir !== tmpJsPath) {
- jsDir = null
- break
- }
- }
- if (jsDir !== null) {
- jsPath = jsDir
- }
- }
- }
- if (jsPath) {
- jsPath = jsPath.split('#')[0].split('?')[0]
- swfPath = jsPath.slice(0, jsPath.lastIndexOf('/') + 1) + swfPath
- }
- return swfPath
- })()
- var _camelizeCssPropName = (function () {
- var matcherRegex = /\-([a-z])/g,
- replacerFn = function (match, group) {
- return group.toUpperCase()
- }
- return function (prop) {
- return prop.replace(matcherRegex, replacerFn)
- }
- })()
- var _getStyle = function (el, prop) {
- var value, camelProp, tagName
- if (window.getComputedStyle) {
- value = window.getComputedStyle(el, null).getPropertyValue(prop)
- } else {
- camelProp = _camelizeCssPropName(prop)
- if (el.currentStyle) {
- value = el.currentStyle[camelProp]
- } else {
- value = el.style[camelProp]
- }
- }
- if (prop === 'cursor') {
- if (!value || value === 'auto') {
- tagName = el.tagName.toLowerCase()
- if (tagName === 'a') {
- return 'pointer'
- }
- }
- }
- return value
- }
- var _elementMouseOver = function (event) {
- if (!event) {
- event = window.event
- }
- var target
- if (this !== window) {
- target = this
- } else if (event.target) {
- target = event.target
- } else if (event.srcElement) {
- target = event.srcElement
- }
- ZeroClipboard.activate(target)
- }
- var _addEventHandler = function (element, method, func) {
- if (!element || element.nodeType !== 1) {
- return
- }
- if (element.addEventListener) {
- element.addEventListener(method, func, false)
- } else if (element.attachEvent) {
- element.attachEvent('on' + method, func)
- }
- }
- var _removeEventHandler = function (element, method, func) {
- if (!element || element.nodeType !== 1) {
- return
- }
- if (element && element.removeEventListener) {
- element.removeEventListener(method, func, false)
- } else if (element.detachEvent) {
- element.detachEvent('on' + method, func)
- }
- }
- var _addClass = function (element, value) {
- if (!element || element.nodeType !== 1) {
- return element
- }
- if (element.classList) {
- if (!element.classList.contains(value)) {
- element.classList.add(value)
- }
- return element
- }
- if (value && typeof value === 'string') {
- var classNames = (value || '').split(/\s+/)
- if (element.nodeType === 1) {
- if (!element.className) {
- element.className = value
- } else {
- var className = ' ' + element.className + ' ',
- setClass = element.className
- for (var c = 0, cl = classNames.length; c < cl; c++) {
- if (className.indexOf(' ' + classNames[c] + ' ') < 0) {
- setClass += ' ' + classNames[c]
- }
- }
- element.className = setClass.replace(/^\s+|\s+$/g, '')
- }
- }
- }
- return element
- }
- var _removeClass = function (element, value) {
- if (!element || element.nodeType !== 1) {
- return element
- }
- if (element.classList) {
- if (element.classList.contains(value)) {
- element.classList.remove(value)
- }
- return element
- }
- if ((value && typeof value === 'string') || value === undefined) {
- var classNames = (value || '').split(/\s+/)
- if (element.nodeType === 1 && element.className) {
- if (value) {
- var className = (' ' + element.className + ' ').replace(/[\n\t]/g, ' ')
- for (var c = 0, cl = classNames.length; c < cl; c++) {
- className = className.replace(' ' + classNames[c] + ' ', ' ')
- }
- element.className = className.replace(/^\s+|\s+$/g, '')
- } else {
- element.className = ''
- }
- }
- }
- return element
- }
- var _getZoomFactor = function () {
- var rect,
- physicalWidth,
- logicalWidth,
- zoomFactor = 1
- if (typeof document.body.getBoundingClientRect === 'function') {
- rect = document.body.getBoundingClientRect()
- physicalWidth = rect.right - rect.left
- logicalWidth = document.body.offsetWidth
- zoomFactor = Math.round((physicalWidth / logicalWidth) * 100) / 100
- }
- return zoomFactor
- }
- var _getDOMObjectPosition = function (obj, defaultZIndex) {
- var info = {
- left: 0,
- top: 0,
- width: 0,
- height: 0,
- zIndex: _getSafeZIndex(defaultZIndex) - 1
- }
- if (obj.getBoundingClientRect) {
- var rect = obj.getBoundingClientRect()
- var pageXOffset, pageYOffset, zoomFactor
- if ('pageXOffset' in window && 'pageYOffset' in window) {
- pageXOffset = window.pageXOffset
- pageYOffset = window.pageYOffset
- } else {
- zoomFactor = _getZoomFactor()
- pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor)
- pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor)
- }
- var leftBorderWidth = document.documentElement.clientLeft || 0
- var topBorderWidth = document.documentElement.clientTop || 0
- info.left = rect.left + pageXOffset - leftBorderWidth
- info.top = rect.top + pageYOffset - topBorderWidth
- info.width = 'width' in rect ? rect.width : rect.right - rect.left
- info.height = 'height' in rect ? rect.height : rect.bottom - rect.top
- }
- return info
- }
- var _cacheBust = function (path, options) {
- var cacheBust = options == null || (options && options.cacheBust === true)
- if (cacheBust) {
- return (path.indexOf('?') === -1 ? '?' : '&') + 'noCache=' + new Date().getTime()
- } else {
- return ''
- }
- }
- var _vars = function (options) {
- var i,
- len,
- domain,
- domains,
- str = '',
- trustedOriginsExpanded = []
- if (options.trustedDomains) {
- if (typeof options.trustedDomains === 'string') {
- domains = [options.trustedDomains]
- } else if (typeof options.trustedDomains === 'object' && 'length' in options.trustedDomains) {
- domains = options.trustedDomains
- }
- }
- if (domains && domains.length) {
- for (i = 0, len = domains.length; i < len; i++) {
- if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === 'string') {
- domain = _extractDomain(domains[i])
- if (!domain) {
- continue
- }
- if (domain === '*') {
- trustedOriginsExpanded = [domain]
- break
- }
- trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [
- domain,
- '//' + domain,
- window.location.protocol + '//' + domain
- ])
- }
- }
- }
- if (trustedOriginsExpanded.length) {
- str += 'trustedOrigins=' + encodeURIComponent(trustedOriginsExpanded.join(','))
- }
- if (options.forceEnhancedClipboard === true) {
- str += (str ? '&' : '') + 'forceEnhancedClipboard=true'
- }
- return str
- }
- var _inArray = function (elem, array, fromIndex) {
- if (typeof array.indexOf === 'function') {
- return array.indexOf(elem, fromIndex)
- }
- var i,
- len = array.length
- if (typeof fromIndex === 'undefined') {
- fromIndex = 0
- } else if (fromIndex < 0) {
- fromIndex = len + fromIndex
- }
- for (i = fromIndex; i < len; i++) {
- if (array.hasOwnProperty(i) && array[i] === elem) {
- return i
- }
- }
- return -1
- }
- var _prepClip = function (elements) {
- if (typeof elements === 'string') {
- throw new TypeError("ZeroClipboard doesn't accept query strings.")
- }
- return typeof elements.length !== 'number' ? [elements] : elements
- }
- var _dispatchCallback = function (func, context, args, async) {
- if (async) {
- window.setTimeout(function () {
- func.apply(context, args)
- }, 0)
- } else {
- func.apply(context, args)
- }
- }
- var _getSafeZIndex = function (val) {
- var zIndex, tmp
- if (val) {
- if (typeof val === 'number' && val > 0) {
- zIndex = val
- } else if (typeof val === 'string' && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {
- zIndex = tmp
- }
- }
- if (!zIndex) {
- if (typeof _globalConfig.zIndex === 'number' && _globalConfig.zIndex > 0) {
- zIndex = _globalConfig.zIndex
- } else if (
- typeof _globalConfig.zIndex === 'string' &&
- (tmp = parseInt(_globalConfig.zIndex, 10)) &&
- !isNaN(tmp) &&
- tmp > 0
- ) {
- zIndex = tmp
- }
- }
- return zIndex || 0
- }
- var _extend = function () {
- var i,
- len,
- arg,
- prop,
- src,
- copy,
- target = arguments[0] || {}
- for (i = 1, len = arguments.length; i < len; i++) {
- if ((arg = arguments[i]) != null) {
- for (prop in arg) {
- if (arg.hasOwnProperty(prop)) {
- src = target[prop]
- copy = arg[prop]
- if (target === copy) {
- continue
- }
- if (copy !== undefined) {
- target[prop] = copy
- }
- }
- }
- }
- }
- return target
- }
- var _extractDomain = function (originOrUrl) {
- if (originOrUrl == null || originOrUrl === '') {
- return null
- }
- originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, '')
- if (originOrUrl === '') {
- return null
- }
- var protocolIndex = originOrUrl.indexOf('//')
- originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2)
- var pathIndex = originOrUrl.indexOf('/')
- originOrUrl =
- pathIndex === -1
- ? originOrUrl
- : protocolIndex === -1 || pathIndex === 0
- ? null
- : originOrUrl.slice(0, pathIndex)
- if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === '.swf') {
- return null
- }
- return originOrUrl || null
- }
- var _determineScriptAccess = (function () {
- var _extractAllDomains = function (origins, resultsArray) {
- var i, len, tmp
- if (origins == null || resultsArray[0] === '*') {
- return
- }
- if (typeof origins === 'string') {
- origins = [origins]
- }
- if (!(typeof origins === 'object' && typeof origins.length === 'number')) {
- return
- }
- for (i = 0, len = origins.length; i < len; i++) {
- if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {
- if (tmp === '*') {
- resultsArray.length = 0
- resultsArray.push('*')
- break
- }
- if (_inArray(tmp, resultsArray) === -1) {
- resultsArray.push(tmp)
- }
- }
- }
- }
- return function (currentDomain, configOptions) {
- var swfDomain = _extractDomain(configOptions.swfPath)
- if (swfDomain === null) {
- swfDomain = currentDomain
- }
- var trustedDomains = []
- _extractAllDomains(configOptions.trustedOrigins, trustedDomains)
- _extractAllDomains(configOptions.trustedDomains, trustedDomains)
- var len = trustedDomains.length
- if (len > 0) {
- if (len === 1 && trustedDomains[0] === '*') {
- return 'always'
- }
- if (_inArray(currentDomain, trustedDomains) !== -1) {
- if (len === 1 && currentDomain === swfDomain) {
- return 'sameDomain'
- }
- return 'always'
- }
- }
- return 'never'
- }
- })()
- var _objectKeys = function (obj) {
- if (obj == null) {
- return []
- }
- if (Object.keys) {
- return Object.keys(obj)
- }
- var keys = []
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- keys.push(prop)
- }
- }
- return keys
- }
- var _deleteOwnProperties = function (obj) {
- if (obj) {
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- delete obj[prop]
- }
- }
- }
- return obj
- }
- var _safeActiveElement = function () {
- try {
- return document.activeElement
- } catch (err) {}
- return null
- }
- var _pick = function (obj, keys) {
- var newObj = {}
- for (var i = 0, len = keys.length; i < len; i++) {
- if (keys[i] in obj) {
- newObj[keys[i]] = obj[keys[i]]
- }
- }
- return newObj
- }
- var _omit = function (obj, keys) {
- var newObj = {}
- for (var prop in obj) {
- if (_inArray(prop, keys) === -1) {
- newObj[prop] = obj[prop]
- }
- }
- return newObj
- }
- var _mapClipDataToFlash = function (clipData) {
- var newClipData = {},
- formatMap = {}
- if (!(typeof clipData === 'object' && clipData)) {
- return
- }
- for (var dataFormat in clipData) {
- if (
- dataFormat &&
- clipData.hasOwnProperty(dataFormat) &&
- typeof clipData[dataFormat] === 'string' &&
- clipData[dataFormat]
- ) {
- switch (dataFormat.toLowerCase()) {
- case 'text/plain':
- case 'text':
- case 'air:text':
- case 'flash:text':
- newClipData.text = clipData[dataFormat]
- formatMap.text = dataFormat
- break
- case 'text/html':
- case 'html':
- case 'air:html':
- case 'flash:html':
- newClipData.html = clipData[dataFormat]
- formatMap.html = dataFormat
- break
- case 'application/rtf':
- case 'text/rtf':
- case 'rtf':
- case 'richtext':
- case 'air:rtf':
- case 'flash:rtf':
- newClipData.rtf = clipData[dataFormat]
- formatMap.rtf = dataFormat
- break
- default:
- break
- }
- }
- }
- return {
- data: newClipData,
- formatMap: formatMap
- }
- }
- var _mapClipResultsFromFlash = function (clipResults, formatMap) {
- if (
- !(
- typeof clipResults === 'object' &&
- clipResults &&
- typeof formatMap === 'object' &&
- formatMap
- )
- ) {
- return clipResults
- }
- var newResults = {}
- for (var prop in clipResults) {
- if (clipResults.hasOwnProperty(prop)) {
- if (prop !== 'success' && prop !== 'data') {
- newResults[prop] = clipResults[prop]
- continue
- }
- newResults[prop] = {}
- var tmpHash = clipResults[prop]
- for (var dataFormat in tmpHash) {
- if (
- dataFormat &&
- tmpHash.hasOwnProperty(dataFormat) &&
- formatMap.hasOwnProperty(dataFormat)
- ) {
- newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat]
- }
- }
- }
- }
- return newResults
- }
- var _args = (function (arraySlice) {
- return function (args) {
- return arraySlice.call(args, 0)
- }
- })(window.Array.prototype.slice)
- var _detectFlashSupport = function () {
- var plugin,
- ax,
- mimeType,
- hasFlash = false,
- isActiveX = false,
- isPPAPI = false,
- flashVersion = ''
- function parseFlashVersion(desc) {
- var matches = desc.match(/[\d]+/g)
- matches.length = 3
- return matches.join('.')
- }
- function isPepperFlash(flashPlayerFileName) {
- return (
- !!flashPlayerFileName &&
- (flashPlayerFileName = flashPlayerFileName.toLowerCase()) &&
- (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(
- flashPlayerFileName
- ) ||
- flashPlayerFileName.slice(-13) === 'chrome.plugin')
- )
- }
- function inspectPlugin(plugin) {
- if (plugin) {
- hasFlash = true
- if (plugin.version) {
- flashVersion = parseFlashVersion(plugin.version)
- }
- if (!flashVersion && plugin.description) {
- flashVersion = parseFlashVersion(plugin.description)
- }
- if (plugin.filename) {
- isPPAPI = isPepperFlash(plugin.filename)
- }
- }
- }
- if (navigator.plugins && navigator.plugins.length) {
- plugin = navigator.plugins['Shockwave Flash']
- inspectPlugin(plugin)
- if (navigator.plugins['Shockwave Flash 2.0']) {
- hasFlash = true
- flashVersion = '2.0.0.11'
- }
- } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
- mimeType = navigator.mimeTypes['application/x-shockwave-flash']
- plugin = mimeType && mimeType.enabledPlugin
- inspectPlugin(plugin)
- } else if (typeof ActiveXObject !== 'undefined') {
- isActiveX = true
- try {
- ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.7')
- hasFlash = true
- flashVersion = parseFlashVersion(ax.GetVariable('$version'))
- } catch (e1) {
- try {
- ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6')
- hasFlash = true
- flashVersion = '6.0.21'
- } catch (e2) {
- try {
- ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
- hasFlash = true
- flashVersion = parseFlashVersion(ax.GetVariable('$version'))
- } catch (e3) {
- isActiveX = false
- }
- }
- }
- }
- _flashState.disabled = hasFlash !== true
- _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11
- _flashState.version = flashVersion || '0.0.0'
- _flashState.pluginType = isPPAPI
- ? 'pepper'
- : isActiveX
- ? 'activex'
- : hasFlash
- ? 'netscape'
- : 'unknown'
- }
- _detectFlashSupport()
- var ZeroClipboard = function (elements) {
- if (!(this instanceof ZeroClipboard)) {
- return new ZeroClipboard(elements)
- }
- this.id = '' + _clientIdCounter++
- _clientMeta[this.id] = {
- instance: this,
- elements: [],
- handlers: {}
- }
- if (elements) {
- this.clip(elements)
- }
- if (typeof _flashState.ready !== 'boolean') {
- _flashState.ready = false
- }
- if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
- var _client = this
- var maxWait = _globalConfig.flashLoadTimeout
- if (typeof maxWait === 'number' && maxWait >= 0) {
- setTimeout(function () {
- if (typeof _flashState.deactivated !== 'boolean') {
- _flashState.deactivated = true
- }
- if (_flashState.deactivated === true) {
- ZeroClipboard.emit({
- type: 'error',
- name: 'flash-deactivated',
- client: _client
- })
- }
- }, maxWait)
- }
- _flashState.overdue = false
- _bridge()
- }
- }
- ZeroClipboard.prototype.setText = function (text) {
- ZeroClipboard.setData('text/plain', text)
- return this
- }
- ZeroClipboard.prototype.setHtml = function (html) {
- ZeroClipboard.setData('text/html', html)
- return this
- }
- ZeroClipboard.prototype.setRichText = function (richText) {
- ZeroClipboard.setData('application/rtf', richText)
- return this
- }
- ZeroClipboard.prototype.setData = function () {
- ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments))
- return this
- }
- ZeroClipboard.prototype.clearData = function () {
- ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments))
- return this
- }
- ZeroClipboard.prototype.setSize = function (width, height) {
- _setSize(width, height)
- return this
- }
- var _setHandCursor = function (enabled) {
- if (
- _flashState.ready === true &&
- _flashState.bridge &&
- typeof _flashState.bridge.setHandCursor === 'function'
- ) {
- _flashState.bridge.setHandCursor(enabled)
- } else {
- _flashState.ready = false
- }
- }
- ZeroClipboard.prototype.destroy = function () {
- this.unclip()
- this.off()
- delete _clientMeta[this.id]
- }
- var _getAllClients = function () {
- var i,
- len,
- client,
- clients = [],
- clientIds = _objectKeys(_clientMeta)
- for (i = 0, len = clientIds.length; i < len; i++) {
- client = _clientMeta[clientIds[i]].instance
- if (client && client instanceof ZeroClipboard) {
- clients.push(client)
- }
- }
- return clients
- }
- ZeroClipboard.version = '2.0.0-beta.5'
- var _globalConfig = {
- swfPath: _swfPath,
- trustedDomains: window.location.host ? [window.location.host] : [],
- cacheBust: true,
- forceHandCursor: false,
- forceEnhancedClipboard: false,
- zIndex: 999999999,
- debug: false,
- title: null,
- autoActivate: true,
- flashLoadTimeout: 3e4
- }
- ZeroClipboard.isFlashUnusable = function () {
- return !!(
- _flashState.disabled ||
- _flashState.outdated ||
- _flashState.unavailable ||
- _flashState.deactivated
- )
- }
- ZeroClipboard.config = function (options) {
- if (typeof options === 'object' && options !== null) {
- _extend(_globalConfig, options)
- }
- if (typeof options === 'string' && options) {
- if (_globalConfig.hasOwnProperty(options)) {
- return _globalConfig[options]
- }
- return
- }
- var copy = {}
- for (var prop in _globalConfig) {
- if (_globalConfig.hasOwnProperty(prop)) {
- if (typeof _globalConfig[prop] === 'object' && _globalConfig[prop] !== null) {
- if ('length' in _globalConfig[prop]) {
- copy[prop] = _globalConfig[prop].slice(0)
- } else {
- copy[prop] = _extend({}, _globalConfig[prop])
- }
- } else {
- copy[prop] = _globalConfig[prop]
- }
- }
- }
- return copy
- }
- ZeroClipboard.destroy = function () {
- ZeroClipboard.deactivate()
- for (var clientId in _clientMeta) {
- if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {
- var client = _clientMeta[clientId].instance
- if (client && typeof client.destroy === 'function') {
- client.destroy()
- }
- }
- }
- var flashBridge = _flashState.bridge
- if (flashBridge) {
- var htmlBridge = _getHtmlBridge(flashBridge)
- if (htmlBridge) {
- if (_flashState.pluginType === 'activex' && 'readyState' in flashBridge) {
- flashBridge.style.display = 'none'
- ;(function removeSwfFromIE() {
- if (flashBridge.readyState === 4) {
- for (var prop in flashBridge) {
- if (typeof flashBridge[prop] === 'function') {
- flashBridge[prop] = null
- }
- }
- flashBridge.parentNode.removeChild(flashBridge)
- if (htmlBridge.parentNode) {
- htmlBridge.parentNode.removeChild(htmlBridge)
- }
- } else {
- setTimeout(removeSwfFromIE, 10)
- }
- })()
- } else {
- flashBridge.parentNode.removeChild(flashBridge)
- if (htmlBridge.parentNode) {
- htmlBridge.parentNode.removeChild(htmlBridge)
- }
- }
- }
- _flashState.ready = null
- _flashState.bridge = null
- _flashState.deactivated = null
- }
- ZeroClipboard.clearData()
- }
- ZeroClipboard.activate = function (element) {
- if (_currentElement) {
- _removeClass(_currentElement, _globalConfig.hoverClass)
- _removeClass(_currentElement, _globalConfig.activeClass)
- }
- _currentElement = element
- _addClass(element, _globalConfig.hoverClass)
- _reposition()
- var newTitle = _globalConfig.title || element.getAttribute('title')
- if (newTitle) {
- var htmlBridge = _getHtmlBridge(_flashState.bridge)
- if (htmlBridge) {
- htmlBridge.setAttribute('title', newTitle)
- }
- }
- var useHandCursor =
- _globalConfig.forceHandCursor === true || _getStyle(element, 'cursor') === 'pointer'
- _setHandCursor(useHandCursor)
- }
- ZeroClipboard.deactivate = function () {
- var htmlBridge = _getHtmlBridge(_flashState.bridge)
- if (htmlBridge) {
- htmlBridge.removeAttribute('title')
- htmlBridge.style.left = '0px'
- htmlBridge.style.top = '-9999px'
- _setSize(1, 1)
- }
- if (_currentElement) {
- _removeClass(_currentElement, _globalConfig.hoverClass)
- _removeClass(_currentElement, _globalConfig.activeClass)
- _currentElement = null
- }
- }
- ZeroClipboard.state = function () {
- return {
- browser: _pick(window.navigator, ['userAgent', 'platform', 'appName']),
- flash: _omit(_flashState, ['bridge']),
- zeroclipboard: {
- version: ZeroClipboard.version,
- config: ZeroClipboard.config()
- }
- }
- }
- ZeroClipboard.setData = function (format, data) {
- var dataObj
- if (typeof format === 'object' && format && typeof data === 'undefined') {
- dataObj = format
- ZeroClipboard.clearData()
- } else if (typeof format === 'string' && format) {
- dataObj = {}
- dataObj[format] = data
- } else {
- return
- }
- for (var dataFormat in dataObj) {
- if (
- dataFormat &&
- dataObj.hasOwnProperty(dataFormat) &&
- typeof dataObj[dataFormat] === 'string' &&
- dataObj[dataFormat]
- ) {
- _clipData[dataFormat] = dataObj[dataFormat]
- }
- }
- }
- ZeroClipboard.clearData = function (format) {
- if (typeof format === 'undefined') {
- _deleteOwnProperties(_clipData)
- _clipDataFormatMap = null
- } else if (typeof format === 'string' && _clipData.hasOwnProperty(format)) {
- delete _clipData[format]
- }
- }
- var _bridge = function () {
- var flashBridge, len
- var container = document.getElementById('global-zeroclipboard-html-bridge')
- if (!container) {
- var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig)
- var allowNetworking = allowScriptAccess === 'never' ? 'none' : 'all'
- var flashvars = _vars(_globalConfig)
- var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig)
- container = _createHtmlBridge()
- var divToBeReplaced = document.createElement('div')
- container.appendChild(divToBeReplaced)
- document.body.appendChild(container)
- var tmpDiv = document.createElement('div')
- var oldIE = _flashState.pluginType === 'activex'
- tmpDiv.innerHTML =
- '<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" ' +
- 'width="100%" height="100%" ' +
- (oldIE
- ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"'
- : 'type="application/x-shockwave-flash" data="' + swfUrl + '"') +
- '>' +
- (oldIE ? '<param name="movie" value="' + swfUrl + '"/>' : '') +
- '<param name="allowScriptAccess" value="' +
- allowScriptAccess +
- '"/>' +
- '<param name="allowNetworking" value="' +
- allowNetworking +
- '"/>' +
- '<param name="menu" value="false"/>' +
- '<param name="wmode" value="transparent"/>' +
- '<param name="flashvars" value="' +
- flashvars +
- '"/>' +
- '</object>'
- flashBridge = tmpDiv.firstChild
- tmpDiv = null
- flashBridge.ZeroClipboard = ZeroClipboard
- container.replaceChild(flashBridge, divToBeReplaced)
- }
- if (!flashBridge) {
- flashBridge = document['global-zeroclipboard-flash-bridge']
- if (flashBridge && (len = flashBridge.length)) {
- flashBridge = flashBridge[len - 1]
- }
- if (!flashBridge) {
- flashBridge = container.firstChild
- }
- }
- _flashState.bridge = flashBridge || null
- }
- var _createHtmlBridge = function () {
- var container = document.createElement('div')
- container.id = 'global-zeroclipboard-html-bridge'
- container.className = 'global-zeroclipboard-container'
- container.style.position = 'absolute'
- container.style.left = '0px'
- container.style.top = '-9999px'
- container.style.width = '1px'
- container.style.height = '1px'
- container.style.zIndex = '' + _getSafeZIndex(_globalConfig.zIndex)
- return container
- }
- var _getHtmlBridge = function (flashBridge) {
- var htmlBridge = flashBridge && flashBridge.parentNode
- while (htmlBridge && htmlBridge.nodeName === 'OBJECT' && htmlBridge.parentNode) {
- htmlBridge = htmlBridge.parentNode
- }
- return htmlBridge || null
- }
- var _reposition = function () {
- if (_currentElement) {
- var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex)
- var htmlBridge = _getHtmlBridge(_flashState.bridge)
- if (htmlBridge) {
- htmlBridge.style.top = pos.top + 'px'
- htmlBridge.style.left = pos.left + 'px'
- htmlBridge.style.width = pos.width + 'px'
- htmlBridge.style.height = pos.height + 'px'
- htmlBridge.style.zIndex = pos.zIndex + 1
- }
- _setSize(pos.width, pos.height)
- }
- }
- var _setSize = function (width, height) {
- var htmlBridge = _getHtmlBridge(_flashState.bridge)
- if (htmlBridge) {
- htmlBridge.style.width = width + 'px'
- htmlBridge.style.height = height + 'px'
- }
- }
- ZeroClipboard.emit = function (event) {
- var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp
- if (typeof event === 'string' && event) {
- eventType = event
- }
- if (typeof event === 'object' && event && typeof event.type === 'string' && event.type) {
- eventType = event.type
- eventObj = event
- }
- if (!eventType) {
- return
- }
- event = _createEvent(eventType, eventObj)
- _preprocessEvent(event)
- if (event.type === 'ready' && _flashState.overdue === true) {
- return ZeroClipboard.emit({
- type: 'error',
- name: 'flash-overdue'
- })
- }
- performCallbackAsync = !/^(before)?copy$/.test(event.type)
- if (event.client) {
- _dispatchClientCallbacks.call(event.client, event, performCallbackAsync)
- } else {
- clients =
- event.target && event.target !== window && _globalConfig.autoActivate === true
- ? _getAllClientsClippedToElement(event.target)
- : _getAllClients()
- for (i = 0, len = clients.length; i < len; i++) {
- eventCopy = _extend({}, event, {
- client: clients[i]
- })
- _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync)
- }
- }
- if (event.type === 'copy') {
- tmp = _mapClipDataToFlash(_clipData)
- returnVal = tmp.data
- _clipDataFormatMap = tmp.formatMap
- }
- return returnVal
- }
- var _dispatchClientCallbacks = function (event, async) {
- var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type]
- if (handlers && handlers.length) {
- var i,
- len,
- func,
- context,
- originalContext = this
- for (i = 0, len = handlers.length; i < len; i++) {
- func = handlers[i]
- context = originalContext
- if (typeof func === 'string' && typeof window[func] === 'function') {
- func = window[func]
- }
- if (typeof func === 'object' && func && typeof func.handleEvent === 'function') {
- context = func
- func = func.handleEvent
- }
- if (typeof func === 'function') {
- _dispatchCallback(func, context, [event], async)
- }
- }
- }
- return this
- }
- var _eventMessages = {
- ready: 'Flash communication is established',
- error: {
- 'flash-disabled': 'Flash is disabled or not installed',
- 'flash-outdated': 'Flash is too outdated to support ZeroClipboard',
- 'flash-unavailable': 'Flash is unable to communicate bidirectionally with JavaScript',
- 'flash-deactivated':
- 'Flash is too outdated for your browser and/or is configured as click-to-activate',
- 'flash-overdue':
- 'Flash communication was established but NOT within the acceptable time limit'
- }
- }
- var _createEvent = function (eventType, event) {
- if (!(eventType || (event && event.type))) {
- return
- }
- event = event || {}
- eventType = (eventType || event.type).toLowerCase()
- _extend(event, {
- type: eventType,
- target: event.target || _currentElement || null,
- relatedTarget: event.relatedTarget || null,
- currentTarget: (_flashState && _flashState.bridge) || null
- })
- var msg = _eventMessages[event.type]
- if (event.type === 'error' && event.name && msg) {
- msg = msg[event.name]
- }
- if (msg) {
- event.message = msg
- }
- if (event.type === 'ready') {
- _extend(event, {
- target: null,
- version: _flashState.version
- })
- }
- if (event.type === 'error') {
- event.target = null
- if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
- _extend(event, {
- version: _flashState.version,
- minimumVersion: '11.0.0'
- })
- }
- }
- if (event.type === 'copy') {
- event.clipboardData = {
- setData: ZeroClipboard.setData,
- clearData: ZeroClipboard.clearData
- }
- }
- if (event.type === 'aftercopy') {
- event = _mapClipResultsFromFlash(event, _clipDataFormatMap)
- }
- if (event.target && !event.relatedTarget) {
- event.relatedTarget = _getRelatedTarget(event.target)
- }
- return event
- }
- var _getRelatedTarget = function (targetEl) {
- var relatedTargetId =
- targetEl && targetEl.getAttribute && targetEl.getAttribute('data-clipboard-target')
- return relatedTargetId ? document.getElementById(relatedTargetId) : null
- }
- var _preprocessEvent = function (event) {
- var element = event.target || _currentElement
- switch (event.type) {
- case 'error':
- if (
- _inArray(event.name, [
- 'flash-disabled',
- 'flash-outdated',
- 'flash-deactivated',
- 'flash-overdue'
- ])
- ) {
- _extend(_flashState, {
- disabled: event.name === 'flash-disabled',
- outdated: event.name === 'flash-outdated',
- unavailable: event.name === 'flash-unavailable',
- deactivated: event.name === 'flash-deactivated',
- overdue: event.name === 'flash-overdue',
- ready: false
- })
- }
- break
- case 'ready':
- var wasDeactivated = _flashState.deactivated === true
- _extend(_flashState, {
- disabled: false,
- outdated: false,
- unavailable: false,
- deactivated: false,
- overdue: wasDeactivated,
- ready: !wasDeactivated
- })
- break
- case 'copy':
- var textContent,
- htmlContent,
- targetEl = event.relatedTarget
- if (
- !(_clipData['text/html'] || _clipData['text/plain']) &&
- targetEl &&
- (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) &&
- (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)
- ) {
- event.clipboardData.clearData()
- event.clipboardData.setData('text/plain', textContent)
- if (htmlContent !== textContent) {
- event.clipboardData.setData('text/html', htmlContent)
- }
- } else if (
- !_clipData['text/plain'] &&
- event.target &&
- (textContent = event.target.getAttribute('data-clipboard-text'))
- ) {
- event.clipboardData.clearData()
- event.clipboardData.setData('text/plain', textContent)
- }
- break
- case 'aftercopy':
- ZeroClipboard.clearData()
- if (element && element !== _safeActiveElement() && element.focus) {
- element.focus()
- }
- break
- case 'mouseover':
- _addClass(element, _globalConfig.hoverClass)
- break
- case 'mouseout':
- if (_globalConfig.autoActivate === true) {
- ZeroClipboard.deactivate()
- }
- break
- case 'mousedown':
- _addClass(element, _globalConfig.activeClass)
- break
- case 'mouseup':
- _removeClass(element, _globalConfig.activeClass)
- break
- }
- }
- ZeroClipboard.prototype.on = function (eventName, func) {
- var i,
- len,
- events,
- added = {},
- handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers
- if (typeof eventName === 'string' && eventName) {
- events = eventName.toLowerCase().split(/\s+/)
- } else if (typeof eventName === 'object' && eventName && typeof func === 'undefined') {
- for (i in eventName) {
- if (
- eventName.hasOwnProperty(i) &&
- typeof i === 'string' &&
- i &&
- typeof eventName[i] === 'function'
- ) {
- this.on(i, eventName[i])
- }
- }
- }
- if (events && events.length) {
- for (i = 0, len = events.length; i < len; i++) {
- eventName = events[i].replace(/^on/, '')
- added[eventName] = true
- if (!handlers[eventName]) {
- handlers[eventName] = []
- }
- handlers[eventName].push(func)
- }
- if (added.ready && _flashState.ready) {
- ZeroClipboard.emit({
- type: 'ready',
- client: this
- })
- }
- if (added.error) {
- var errorTypes = ['disabled', 'outdated', 'unavailable', 'deactivated', 'overdue']
- for (i = 0, len = errorTypes.length; i < len; i++) {
- if (_flashState[errorTypes[i]]) {
- ZeroClipboard.emit({
- type: 'error',
- name: 'flash-' + errorTypes[i],
- client: this
- })
- break
- }
- }
- }
- }
- return this
- }
- ZeroClipboard.prototype.off = function (eventName, func) {
- var i,
- len,
- foundIndex,
- events,
- perEventHandlers,
- handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers
- if (arguments.length === 0) {
- events = _objectKeys(handlers)
- } else if (typeof eventName === 'string' && eventName) {
- events = eventName.split(/\s+/)
- } else if (typeof eventName === 'object' && eventName && typeof func === 'undefined') {
- for (i in eventName) {
- if (
- eventName.hasOwnProperty(i) &&
- typeof i === 'string' &&
- i &&
- typeof eventName[i] === 'function'
- ) {
- this.off(i, eventName[i])
- }
- }
- }
- if (events && events.length) {
- for (i = 0, len = events.length; i < len; i++) {
- eventName = events[i].toLowerCase().replace(/^on/, '')
- perEventHandlers = handlers[eventName]
- if (perEventHandlers && perEventHandlers.length) {
- if (func) {
- foundIndex = _inArray(func, perEventHandlers)
- while (foundIndex !== -1) {
- perEventHandlers.splice(foundIndex, 1)
- foundIndex = _inArray(func, perEventHandlers, foundIndex)
- }
- } else {
- handlers[eventName].length = 0
- }
- }
- }
- }
- return this
- }
- ZeroClipboard.prototype.handlers = function (eventName) {
- var prop,
- copy = null,
- handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers
- if (handlers) {
- if (typeof eventName === 'string' && eventName) {
- return handlers[eventName] ? handlers[eventName].slice(0) : null
- }
- copy = {}
- for (prop in handlers) {
- if (handlers.hasOwnProperty(prop) && handlers[prop]) {
- copy[prop] = handlers[prop].slice(0)
- }
- }
- }
- return copy
- }
- ZeroClipboard.prototype.clip = function (elements) {
- elements = _prepClip(elements)
- for (var i = 0; i < elements.length; i++) {
- if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
- if (!elements[i].zcClippingId) {
- elements[i].zcClippingId = 'zcClippingId_' + _elementIdCounter++
- _elementMeta[elements[i].zcClippingId] = [this.id]
- if (_globalConfig.autoActivate === true) {
- _addEventHandler(elements[i], 'mouseover', _elementMouseOver)
- }
- } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {
- _elementMeta[elements[i].zcClippingId].push(this.id)
- }
- var clippedElements = _clientMeta[this.id].elements
- if (_inArray(elements[i], clippedElements) === -1) {
- clippedElements.push(elements[i])
- }
- }
- }
- return this
- }
- ZeroClipboard.prototype.unclip = function (elements) {
- var meta = _clientMeta[this.id]
- if (!meta) {
- return this
- }
- var clippedElements = meta.elements
- var arrayIndex
- if (typeof elements === 'undefined') {
- elements = clippedElements.slice(0)
- } else {
- elements = _prepClip(elements)
- }
- for (var i = elements.length; i--; ) {
- if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
- arrayIndex = 0
- while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {
- clippedElements.splice(arrayIndex, 1)
- }
- var clientIds = _elementMeta[elements[i].zcClippingId]
- if (clientIds) {
- arrayIndex = 0
- while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {
- clientIds.splice(arrayIndex, 1)
- }
- if (clientIds.length === 0) {
- if (_globalConfig.autoActivate === true) {
- _removeEventHandler(elements[i], 'mouseover', _elementMouseOver)
- }
- delete elements[i].zcClippingId
- }
- }
- }
- }
- return this
- }
- ZeroClipboard.prototype.elements = function () {
- var meta = _clientMeta[this.id]
- return meta && meta.elements ? meta.elements.slice(0) : []
- }
- var _getAllClientsClippedToElement = function (element) {
- var elementMetaId,
- clientIds,
- i,
- len,
- client,
- clients = []
- if (
- element &&
- element.nodeType === 1 &&
- (elementMetaId = element.zcClippingId) &&
- _elementMeta.hasOwnProperty(elementMetaId)
- ) {
- clientIds = _elementMeta[elementMetaId]
- if (clientIds && clientIds.length) {
- for (i = 0, len = clientIds.length; i < len; i++) {
- client = _clientMeta[clientIds[i]].instance
- if (client && client instanceof ZeroClipboard) {
- clients.push(client)
- }
- }
- }
- }
- return clients
- }
- _globalConfig.hoverClass = 'zeroclipboard-is-hover'
- _globalConfig.activeClass = 'zeroclipboard-is-active'
- if (typeof define === 'function' && define.amd) {
- define(function () {
- return ZeroClipboard
- })
- } else if (
- typeof module === 'object' &&
- module &&
- typeof module.exports === 'object' &&
- module.exports
- ) {
- module.exports = ZeroClipboard
- } else {
- window.ZeroClipboard = ZeroClipboard
- }
- })(
- (function () {
- return this
- })()
- )
|