;(function(window, document){
'use strict';
if('Ink' in window&&typeof Ink.requireModules==='function'){ return; }
var paths={};
var modules={};
var modulesLoadOrder=[];
var modulesRequested={};
var pendingRMs=[];
var modulesWaitingForDeps={};
var apply=Function.prototype.apply;
var isEmptyObject=function(o){
if(typeof o!=='object'){ return false; }
for (var k in o){
if(o.hasOwnProperty(k)){
return false;
}}
return true;
};
window.Ink={
VERSION: '3.1.10',
_checkPendingRequireModules: function(){
var I, F, o, dep, mod, cb, pRMs=[];
var toApply=[];
for (I=0, F=pendingRMs.length; I < F; ++I){
o=pendingRMs[I];
if(!o){ continue; }
for (dep in o.left){
if(o.left.hasOwnProperty(dep)){
mod=modules[dep];
if(mod){
o.args[o.left[dep] ]=mod;
delete o.left[dep];
--o.remaining;
}}
}
if(o.remaining > 0){
pRMs.push(o);
}else{
cb=o.cb;
if(!cb){ continue; }
delete o.cb;
toApply.push([cb, o.args]);
}}
pendingRMs=pRMs;
for (var i=0; i < toApply.length; i++){
toApply[i][0].apply(false, toApply[i][1]);
}
if(pendingRMs.length > 0){
setTimeout(function(){ Ink._checkPendingRequireModules(); }, 0);
}},
getPath: function(key, noLib){
var split=key.split(/[._]/g);
var curKey;
var i;
var root;
var path;
for (i=split.length; i >=0; i -=1){
curKey=split.slice(0, i + 1).join('.');
if(paths[curKey]){
root=curKey;
break;
}}
if(root in paths){
path=paths[root];
}else{
return null;
}
if(!/\/$/.test(path)){
path +='/';
}
if(i < split.length){
path +=split.slice(i + 1).join('/') + '/';
}
if(!noLib){
path +='lib.js';
}
return path;
},
setPath: function(key, rootURI){
paths[key.replace(/_/, '.')]=rootURI;
},
loadScript: function(uri, contentType){
if(uri.indexOf('/')===-1){
var givenUri=uri;
uri=this.getPath(uri);
if(uri===null){
throw new Error('Could not load script "' + givenUri + '". ' +
'Path not found in the registry. Did you misspell ' +
'the name, or forgot to call setPath()?');
}}
var scriptEl=document.createElement('script');
scriptEl.setAttribute('type', contentType||'text/javascript');
scriptEl.setAttribute('src', uri);
if('onerror' in scriptEl){
scriptEl.onerror=function (){
Ink.error(['Failed to load script from ', uri, '.'].join(''));
};}
var head=document.head ||
document.getElementsByTagName('head')[0];
if(head){
return head.appendChild(scriptEl);
}},
_loadLater: function (dep){
setTimeout(function (){
if(modules[dep]||modulesRequested[dep] ||
modulesWaitingForDeps[dep]){
return;
}
modulesRequested[dep]=true;
Ink.loadScript(dep);
}, 0);
},
namespace: function(ns, returnParentAndKey){
if(!ns||!ns.length){ return null; }
var levels=ns.split('.');
var nsobj=window;
var parent;
for (var i=0, f=levels.length; i < f; ++i){
nsobj[ levels[i] ]=nsobj[ levels[i] ]||{};
parent=nsobj;
nsobj=nsobj[ levels[i] ];
}
if(returnParentAndKey){
return [
parent,
levels[i-1]
];
}
return nsobj;
},
getModule: function(mod, version){
var key=version ? [mod, '_', version].join(''):mod;
return modules[key];
},
createModule: function(mod, version, deps, modFn){
if(typeof mod!=='string'){
throw new Error('module name must be a string!');
}
if(!(typeof version==='number'||(typeof version==='string'&&version.length > 0))){
throw new Error('version number missing!');
}
var modAll=[mod, '_', version].join('');
modulesWaitingForDeps[modAll]=true;
var cb=function(){
if(modules[modAll]){
return;
}
delete modulesRequested[modAll];
delete modulesRequested[mod];
var args=Array.prototype.slice.call(arguments);
var moduleContent=modFn.apply(window, args);
modulesLoadOrder.push(modAll);
if(typeof moduleContent==='object'){
moduleContent._version=version;
}
else if(typeof moduleContent==='function'){
moduleContent.prototype._version=version;
moduleContent._version=version;
}
var isInkModule=mod.indexOf('Ink.')===0;
var t;
if(isInkModule){
t=Ink.namespace(mod, true);
}
modules[ modAll ]=moduleContent;
delete modulesWaitingForDeps[ modAll ];
if(isInkModule){
t[0][ t[1] + '_' + version ]=moduleContent;
}
modules[ mod ]=moduleContent;
if(isInkModule){
if(isEmptyObject(t[0][ t[1] ])){
t[0][ t[1] ]=moduleContent;
}}
if(this){
Ink._checkPendingRequireModules();
}};
this.requireModules(deps, cb);
},
requireModules: function(deps, cbFn){
var i, f, o, dep, mod;
f=deps&&deps.length;
o={
args: new Array(f),
left: {},
remaining: f,
cb: cbFn
};
if(!(typeof deps==='object'&&deps.length!==undefined)){
throw new Error('Dependency list should be an array!');
}
if(typeof cbFn!=='function'){
throw new Error('Callback should be a function!');
}
for (i=0; i < f; ++i){
if(Ink._moduleRenames[deps[i]]){
Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);
dep=Ink._moduleRenames[deps[i]];
}else{
dep=deps[i];
}
if(!dep){
--o.remaining;
continue;
}
mod=modules[dep];
if(mod){
o.args[i]=mod;
--o.remaining;
continue;
}
else if(!modulesRequested[dep]){
Ink._loadLater(dep);
}
o.left[dep]=i;
}
if(o.remaining > 0){
pendingRMs.push(o);
}else{
cbFn.apply(true, o.args);
}},
_moduleRenames: {
'Ink.UI.Aux_1': 'Ink.UI.Common_1'
},
getModulesLoadOrder: function(){
return modulesLoadOrder.slice();
},
getModuleScripts: function(){
var mlo=this.getModulesLoadOrder();
mlo.unshift('Ink_1');
mlo=mlo.map(function(m){
return ['<scr', 'ipt type="text/javascript" src="', Ink.getModuleURL(m), '"></scr', 'ipt>'].join('');
});
return mlo.join('\n');
},
createExt: function (moduleName, version, dependencies, modFn){
return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);
},
bind: function(fn, context){
var args=Array.prototype.slice.call(arguments, 2);
return function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.concat(innerArgs);
return fn.apply(context===false ? this:context, finalArgs);
};},
bindMethod: function (object, methodName){
return Ink.bind.apply(Ink,
[object[methodName], object].concat([].slice.call(arguments, 2)));
},
bindEvent: function(fn, context){
var args=Array.prototype.slice.call(arguments, 2);
return function(event){
var finalArgs=args.slice();
finalArgs.unshift(event||window.event);
return fn.apply(context===false ? this:context, finalArgs);
};},
i: function(id){
if(typeof(id)==='string'){
return document.getElementById(id)||null;
}
return id;
},
ss: function(selector, from){
if(typeof(Ink.Dom)==='undefined'||typeof(Ink.Dom.Selector)==='undefined'){
throw new Error('This method requires Ink.Dom.Selector');
}
return Ink.Dom.Selector.select(selector, (from||document));
},
s: function(selector, from){
if(typeof(Ink.Dom)==='undefined'||typeof(Ink.Dom.Selector)==='undefined'){
throw new Error('This method requires Ink.Dom.Selector');
}
return Ink.Dom.Selector.select(selector, (from||document))[0]||null;
},
extendObj: function(destination){
var sources=[].slice.call(arguments, 1);
for (var i=0, len=sources.length; i < len; i++){
if(!sources[i]){ continue; }
for (var property in sources[i]){
if(Object.prototype.hasOwnProperty.call(sources[i], property)){
destination[property]=sources[i][property];
}}
}
return destination;
},
log: function (){
var console=window.console;
if(console&&console.log){
apply.call(console.log, console, arguments);
}},
warn: function (){
var console=window.console;
if(console&&console.warn){
apply.call(console.warn, console, arguments);
}},
error: function (){
var console=window.console;
if(console&&console.error){
apply.call(console.error, console, arguments);
}}
};
/*
var failCount={};
var maxFails=3;
var checkDelta=0.5;
var tmpTmr=setInterval(function(){
var mk=Object.keys(modulesRequested);
var l=mk.length;
if(l > 0){
for (var i=0, f=mk.length, k, v; i < f; ++i){
k=mk[i];
v=failCount[k];
failCount[k]=(v===undefined) ? 1:++v;
if(v >=maxFails){
console.error('** Loading of module ' + k + ' failed! **');
delete modulesRequested[k];
}}
}else{
clearInterval(tmpTmr);
}}, checkDelta*1000);
*/
}(window, document));
Ink.createModule('Ink.Net.Ajax', '1', [], function(){
'use strict';
var Ajax=function(url, options){
this.init(url, options);
};
Ajax.globalOptions={
parameters: {},
requestHeaders: {}};
var xMLHttpRequestWithCredentials='XMLHttpRequest' in window&&'withCredentials' in (new XMLHttpRequest());
Ajax.prototype={
init: function(url, userOptions){
if(!url){
throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");
}
var options=Ink.extendObj({
asynchronous: true,
contentType:  'application/x-www-form-urlencoded',
cors: false,
validateCors: false,
debug: false,
delay: 0,
evalJS: true,
method: 'POST',
parameters: null,
postBody: '',
requestHeaders: null,
sanitizeJSON: false,
signRequest: false,
timeout: 0,
useCredentials: false,
xhrProxy: '',
onComplete: null,
onCreate: null,
onException: null,
onFailure: null,
onHeaders: null,
onInit: null,
onSuccess: null,
onTimeout: null
}, Ajax.globalOptions);
if(userOptions&&typeof userOptions==='object'){
options=Ink.extendObj(options, userOptions);
if(typeof userOptions.parameters==='object'){
options.parameters=Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);
}else if(userOptions.parameters!==null){
var globalParameters=this.paramsObjToStr(Ajax.globalOptions.parameters);
if(globalParameters){
options.parameters=userOptions.parameters + '&' + globalParameters;
}}
options.requestHeaders=Ink.extendObj({}, Ajax.globalOptions.requestHeaders);
options.requestHeaders=Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);
}
this.options=options;
this.safeCall('onInit');
this.url=url;
var urlLocation=this._locationFromURL(url);
this.isHTTP=this._locationIsHTTP(urlLocation);
this.isCrossDomain=this._locationIsCrossDomain(urlLocation, location);
this.requestHasBody=options.method.search(/^get|head$/i) < 0;
if(this.options.validateCors===true){
this.options.cors=this.isCrossDomain;
}
if(this.options.cors){
this.isCrossDomain=false;
}
this.transport=this.getTransport();
this.request();
},
_locationFromURL: function (url){
var urlLocation=document.createElementNS ?
document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :
document.createElement('a');
urlLocation.setAttribute('href', url);
return urlLocation;
},
_locationIsHTTP: function (urlLocation){
return urlLocation.href.match(/^https?:/i) ? true:false;
},
_locationIsCrossDomain: function (urlLocation, location){
location=location||window.location;
if(!Ajax.prototype._locationIsHTTP(urlLocation)||location.protocol==='widget:'||typeof window.widget==='object'){
return false;
}else{
var split1=urlLocation.href.split('//');
var split2=location.href.split('//');
if(split1.length===1||split2.length===1){
return false;
}
var protocol1=split1[0];
var protocol2=split2[0];
var colonOrSlash=/:|\//;  // Finds colons or slashes, which are the end of hostnames (without ports)
var host1=split1[1].split(colonOrSlash)[0];
var host2=split2[1].split(colonOrSlash)[0];
return protocol1!==protocol2 ||
host1!==host2;
}},
getTransport: function(){
if(!xMLHttpRequestWithCredentials&&this.options.cors&&'XDomainRequest' in window){
this.usingXDomainReq=true;
return new XDomainRequest();
}
else if(typeof XMLHttpRequest!=='undefined'){
return new XMLHttpRequest();
}
else if(typeof ActiveXObject!=='undefined'){
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (e){
return new ActiveXObject('Microsoft.XMLHTTP');
}}else{
return null;
}},
setHeaders: function(){
if(this.transport){
try {
var headers={
"Accept": "text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1",
"Accept-Language": navigator.language,
"X-Requested-With": "XMLHttpRequest",
"X-Ink-Version": "3"
};
if(this.options.cors){
if(!this.options.signRequest){
delete headers['X-Requested-With'];
}
delete headers['X-Ink-Version'];
}
if(this.options.requestHeaders&&typeof this.options.requestHeaders==='object'){
for(var headerReqName in this.options.requestHeaders){
if(this.options.requestHeaders.hasOwnProperty(headerReqName)){
headers[headerReqName]=this.options.requestHeaders[headerReqName];
}}
}
if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1] < 2005){
headers.Connection='close';
}
for (var headerName in headers){
if(headers.hasOwnProperty(headerName)){
this.transport.setRequestHeader(headerName, headers[headerName]);
}}
} catch(e){}}
},
/**
* Converts an object with parameters to a querystring
*
* @method paramsObjToStr
* @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`
* @return {String} A query string. Example: `'a=2&b=3'`
* @private
*/
paramsObjToStr: function(optParams){
var k, m, p, a, params=[];
if(typeof optParams==='object'){
for (p in optParams){
if(optParams.hasOwnProperty(p)){
a=optParams[p];
if(Object.prototype.toString.call(a)==='[object Array]'&&!isNaN(a.length)){
for (k=0, m=a.length; k < m; k++){
params=params.concat([
encodeURIComponent(p), '[]',   '=',
encodeURIComponent(a[k]), '&'
]);
}}else{
params=params.concat([
encodeURIComponent(p), '=',
encodeURIComponent(a), '&'
]);
}}
}
if(params.length > 0){
params.pop();
}}else{
return optParams;
}
return params.join('');
},
setParams: function(){
var params=null, optParams=this.options.parameters;
if(typeof optParams==="object"){
params=this.paramsObjToStr(optParams);
}else{
params='' + optParams;
}
if(params){
if(this.url.indexOf('?') > -1){
this.url=this.url.split('#')[0] + '&' + params;
}else{
this.url=this.url.split('#')[0] + '?' + params;
}}
},
getHeader: function(name){
if(this.usingXDomainReq&&name==='Content-Type'){
return this.transport.contentType;
}
try{
return this.transport.getResponseHeader(name);
} catch(e){
return null;
}},
getAllHeaders: function(){
try {
return this.transport.getAllResponseHeaders();
} catch(e){
return null;
}},
getResponse: function(){
var t=this.transport,
r={
headerJSON: null,
responseJSON: null,
getHeader: this.getHeader,
getAllHeaders: this.getAllHeaders,
request: this,
transport: t,
timeTaken: new Date() - this.startTime,
requestedUrl: this.url
};
r.readyState=t.readyState;
try { r.responseText=t.responseText; } catch(e){}
try { r.responseXML=t.responseXML;  } catch(e){}
try { r.status=t.status;       } catch(e){ r.status=0;  }
try { r.statusText=t.statusText;   } catch(e){ r.statusText=''; }
return r;
},
abort: function(){
if(this.transport){
clearTimeout(this.delayTimeout);
clearTimeout(this.stoTimeout);
this._aborted=true;
try { this.transport.abort(); } catch(ex){}
this.finish();
}},
runStateChange: function(){
if(this._aborted){ return; }
var rs=this.transport.readyState;
if(rs===3){
if(this.isHTTP){
this.safeCall('onHeaders');
}}else if(rs===4||this.usingXDomainReq){
if(this.options.asynchronous&&this.options.delay&&(this.startTime + this.options.delay > new Date().getTime())){
this.delayTimeout=setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());
return;
}
var responseJSON,
responseContent=this.transport.responseText,
response=this.getResponse(),
curStatus=this.transport.status;
if(this.isHTTP&&!this.options.asynchronous){
this.safeCall('onHeaders');
}
clearTimeout(this.stoTimeout);
if(curStatus===0){
if(this.isHTTP){
this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));
}else{
curStatus=responseContent ? 200:404;
}}
else if(curStatus===304){
curStatus=200;
}
var isSuccess=this.usingXDomainReq||200 <=curStatus&&curStatus < 300;
var headerContentType=this.getHeader('Content-Type')||'';
if(this.options.evalJS &&
(headerContentType.indexOf("application/json") >=0||this.options.evalJS==='force')){
try {
responseJSON=this.evalJSON(responseContent, this.sanitizeJSON);
if(responseJSON){
responseContent=response.responseJSON=responseJSON;
}} catch(e){
if(isSuccess){
this.safeCall('onException', e);
}}
}
if(this.usingXDomainReq&&headerContentType.indexOf('xml')!==-1&&'DOMParser' in window){
var mimeType;
switch (headerContentType){
case 'application/xml':
case 'application/xhtml+xml':
case 'image/svg+xml':
mimeType=headerContentType;
break;
default:
mimeType='text/xml';
}
var xmlDoc=(new DOMParser()).parseFromString(this.transport.responseText, mimeType);
this.transport.responseXML=xmlDoc;
response.responseXML=xmlDoc;
}
if(this.transport.responseXML!=null&&response.responseJSON==null&&this.transport.responseXML.xml!==""){
responseContent=this.transport.responseXML;
}
if(curStatus||this.usingXDomainReq){
if(isSuccess){
this.safeCall('onSuccess', response, responseContent);
}else{
this.safeCall('onFailure', response, responseContent);
}
this.safeCall('on'+curStatus, response, responseContent);
}
this.finish(response, responseContent);
}},
finish: function(response, responseContent){
if(response){
this.safeCall('onComplete', response, responseContent);
}
clearTimeout(this.stoTimeout);
if(this.transport){
try{ this.transport.onreadystatechange=null; } catch(e){}
if(typeof this.transport.destroy==='function'){
this.transport.destroy();
}
this.transport=null;
}},
safeCall: function(handlerName ){
var error=arguments[1] instanceof Error ? arguments[1]:null;
if(typeof this.options[handlerName]==='function'){
try {
this.options[handlerName].apply(this, [].slice.call(arguments, 1));
} catch(ex){
Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);
}}else if(error){
Ink.error('Ink.Net.Ajax: ' + error);
}},
setRequestHeader: function(name, value){
if(!this.options.requestHeaders){
this.options.requestHeaders={};}
this.options.requestHeaders[name]=value;
},
request: function(){
if(this.transport){
var params=null;
if(this.requestHasBody){
if(this.options.postBody!==null&&this.options.postBody!==''){
params=this.options.postBody;
this.setParams();
}else if(this.options.parameters!==null&&this.options.parameters!==''){
params=this.options.parameters;
}
if(typeof params==="object"&&!params.nodeType){
params=this.paramsObjToStr(params);
}else if(typeof params!=="object"&&params!==null){
params='' + params;
}
if(this.options.contentType){
this.setRequestHeader('Content-Type', this.options.contentType);
}}else{
this.setParams();
}
var url=this.url;
var method=this.options.method;
var crossDomain=this.isCrossDomain;
if(crossDomain&&this.options.xhrProxy){
this.setRequestHeader('X-Url', url);
url=this.options.xhrProxy + encodeURIComponent(url);
crossDomain=false;
}
try {
this.transport.open(method, url, this.options.asynchronous);
} catch(e){
this.safeCall('onException', e);
return this.finish(this.getResponse(), null);
}
this.setHeaders();
this.safeCall('onCreate');
if(this.options.timeout&&!isNaN(this.options.timeout)){
this.stoTimeout=setTimeout(Ink.bind(function(){
if(this.options.onTimeout){
this.safeCall('onTimeout');
this.abort();
}}, this), (this.options.timeout * 1000));
}
if(this.options.useCredentials&&!this.usingXDomainReq){
this.transport.withCredentials=true;
}
if(this.options.asynchronous&&!this.usingXDomainReq){
this.transport.onreadystatechange=Ink.bind(this.runStateChange, this);
}
else if(this.usingXDomainReq){
this.transport.onload=Ink.bind(this.runStateChange, this);
}
try {
if(crossDomain){
Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');
return;
}else{
this.startTime=new Date().getTime();
this.transport.send(params);
}} catch(e){
this.safeCall('onException', e);
return this.finish(this.getResponse(), null);
}
if(!this.options.asynchronous){
this.runStateChange();
}}
},
isJSON: function(str){
if(typeof str!=="string"||!str){ return false; }
str=str.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
},
evalJSON: function(strJSON, sanitize){
if(strJSON&&(!sanitize||this.isJSON(strJSON))){
try {
if(typeof JSON!=="undefined"&&typeof JSON.parse!=='undefined'){
return JSON.parse(strJSON);
}
return eval('(' + strJSON + ')');
} catch(e){
throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);
}}
return null;
}};
Ajax.load=function(url, callback){
var isCrossDomain=Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));
return new Ajax(url, {
method: 'GET',
cors: isCrossDomain,
onSuccess: function(response){
callback(response.responseJSON||response.responseText, response);
}});
};
Ajax.ping=function(url, callback){
var isCrossDomain=Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));
return new Ajax(url, {
method: 'HEAD',
cors: isCrossDomain,
onSuccess: function(response){
if(typeof callback==='function'){
callback(response);
}}
});
};
return Ajax;
});
Ink.createModule('Ink.Net.JsonP', '1', [], function(){
'use strict';
var JsonP=function(uri, options){
this.init(uri, options);
};
JsonP.prototype={
init: function(uri, options){
this.options=Ink.extendObj({
onSuccess:          undefined,
onFailure:          undefined,
failureObj:         {},
timeout:            10,
params:             {},
callbackParam:      'jsoncallback',
internalCallback:   '_cb',
randVar:            false
}, options||{});
if(this.options.randVar!==false){
this.randVar=this.options.randVar;
}else{
this.randVar=parseInt(Math.random() * 100000, 10);
}
this.options.internalCallback +=this.randVar;
this.uri=uri;
if(typeof(this.options.onComplete)==='function'){
this.options.onSuccess=this.options.onComplete;
}
if(typeof this.uri!=='string'){
throw new Error('Ink.Net.JsonP: Please define an URI');
}
if(typeof this.options.onSuccess!=='function'){
throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');
}
Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){
this.options.onSuccess(arguments[0]);
this._cleanUp();
}, this);
this.timeout=setTimeout(Ink.bind(function (){
this.abort();
if(typeof this.options.onFailure==='function'){
this.options.onFailure(this.options.failureObj);
}}, this),
this.options.timeout * 1000);
this._addScriptTag();
},
abort: function (){
Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this, '_cleanUp');
},
_addParamsToGet: function(uri, params){
var hasQuestionMark=uri.indexOf('?')!==-1;
var sep, pKey, pValue, parts=[uri];
for (pKey in params){
if(params.hasOwnProperty(pKey)){
if(!hasQuestionMark){ sep='?';  hasQuestionMark=true; }else{                  sep='&';                          }
pValue=params[pKey];
if(typeof pValue!=='number'&&!pValue){    pValue='';    }
parts=parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);
}}
return parts.join('');
},
_getScriptContainer: function(){
return document.body ||
document.getElementsByTagName('body')[0] ||
document.getElementsByTagName('head')[0] ||
document.documentElement;
},
_addScriptTag: function(){
this.options.params[this.options.callbackParam]='Ink.Net.JsonP.' + this.options.internalCallback;
this.options.params.rnd_seed=this.randVar;
this.uri=this._addParamsToGet(this.uri, this.options.params);
this._scriptEl=document.createElement('script');
this._scriptEl.type='text/javascript';
this._scriptEl.src=this.uri;
var scriptCtn=this._getScriptContainer();
scriptCtn.appendChild(this._scriptEl);
},
_cleanUp: function (){
if(this.timeout){
window.clearTimeout(this.timeout);
}
delete this.options.onSuccess;
delete this.options.onFailure;
delete Ink.Net.JsonP[this.options.internalCallback];
this._removeScriptTag();
},
_removeScriptTag: function(){
if(!this._scriptEl){ return;  }
this._scriptEl.parentNode.removeChild(this._scriptEl);
delete this._scriptEl;
}};
return JsonP;
});
Ink.createModule('Ink.Dom.Browser', '1', [], function(){
'use strict';
/**
* @namespace Ink.Dom.Browser
* @version 1
* @static
* @example
*     <script>*         Ink.requireModules(['Ink.Dom.Browser_1'],function(InkBrowser){
*             if(InkBrowser.CHROME){
*                 console.log('This is a CHROME browser.');
*             }
*         });
*</script>
*/
var Browser={
IE: false,
GECKO: false,
OPERA: false,
SAFARI: false,
KONQUEROR: false,
CHROME: false,
model: false,
version: false,
userAgent: false,
cssPrefix: false,
domPrefix: false,
init: function(){
this.detectBrowser();
this.setDimensions();
this.setReferrer();
},
setDimensions: function(){
var myWidth=0, myHeight=0;
if(typeof window.innerWidth==='number'){
myWidth=window.innerWidth;
myHeight=window.innerHeight;
}else if(document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight) ){
myWidth=document.documentElement.clientWidth;
myHeight=document.documentElement.clientHeight;
}else if(document.body&&(document.body.clientWidth||document.body.clientHeight) ){
myWidth=document.body.clientWidth;
myHeight=document.body.clientHeight;
}
this.windowWidth=myWidth;
this.windowHeight=myHeight;
},
setReferrer: function(){
if(document.referrer&&document.referrer.length){
this.referrer=window.escape(document.referrer);
}else{
this.referrer=false;
}},
detectBrowser: function(){
this._sniffUserAgent(navigator.userAgent);
},
_sniffUserAgent: function (sAgent){
this.userAgent=sAgent;
sAgent=sAgent.toLowerCase();
if(/applewebkit\//.test(sAgent)&&!/iemobile/.test(sAgent)){
this.cssPrefix='-webkit-';
this.domPrefix='Webkit';
if(/(chrome|crios)\//.test(sAgent)){
this.CHROME=true;
this.model='chrome';
this.version=sAgent.replace(/(.*)chrome\/([^\s]+)(.*)/, "$2");
}else{
this.SAFARI=true;
this.model='safari';
var rVersion=/version\/([^) ]+)/;
if(rVersion.test(sAgent)){
this.version=sAgent.match(rVersion)[1];
}else{
this.version=sAgent.replace(/(.*)applewebkit\/([^\s]+)(.*)/, "$2");
}}
}else if(/opera/.test(sAgent)){
this.OPERA=true;
this.model='opera';
this.version=sAgent.replace(/(.*)opera.([^\s$]+)(.*)/, "$2");
this.cssPrefix='-o-';
this.domPrefix='O';
}else if(/konqueror/.test(sAgent)){
this.KONQUEROR=true;
this.model='konqueror';
this.version=sAgent.replace(/(.*)konqueror\/([^;]+);(.*)/, "$2");
this.cssPrefix='-khtml-';
this.domPrefix='Khtml';
}else if(/(msie|trident)/i.test(sAgent)){
this.IE=true;
this.model='ie';
if(/rv:((?:\d|\.)+)/.test(sAgent)){
this.version=sAgent.match(/rv:((?:\d|\.)+)/)[1];
}else{
this.version=sAgent.replace(/(.*)\smsie\s([^;]+);(.*)/, "$2");
}
this.cssPrefix='-ms-';
this.domPrefix='ms';
}else if(/gecko/.test(sAgent)){
this.cssPrefix='-moz-';
this.domPrefix='Moz';
this.GECKO=true;
var re=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;
if(re.test(sAgent)){
this.model=sAgent.match(re)[1];
this.version=sAgent.replace(new RegExp("(.*)"+this.model+"\/([^;\\s$]+)(.*)"), "$2");
}else{
this.model='mozilla';
var reVersion=/(.*)rv:([^)]+)(.*)/;
if(reVersion.test(sAgent)){
this.version=sAgent.replace(reVersion, "$2");
}}
}},
debug: function(){
var str="known browsers: (ie, gecko, opera, safari, konqueror) \n";
str +=[this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +"\n";
str +="cssPrefix -> "+this.cssPrefix+"\n";
str +="domPrefix -> "+this.domPrefix+"\n";
str +="model -> "+this.model+"\n";
str +="version -> "+this.version+"\n";
str +="\n";
str +="original UA -> "+this.userAgent;
alert(str);
}};
Browser.init();
return Browser;
});
Ink.createModule('Ink.Dom.Css', 1, [], function(){
'use strict';
var getCs=("defaultView" in document)&&("getComputedStyle" in document.defaultView) ? document.defaultView.getComputedStyle:window.getComputedStyle;
var Css={
addRemoveClassName: function(elm, className, addRemState){
if(addRemState){
return this.addClassName(elm, className);
}
this.removeClassName(elm, className);
},
addClassName: function(elm, className){
elm=Ink.i(elm);
if(!elm||!className){ return null; }
className=('' + className).split(/[, ]+/);
var i=0;
var len=className.length;
for (; i < len; i++){
if(className[i].replace(/^\s+|\s+$/g, '')){
if(typeof elm.classList!=="undefined"){
elm.classList.add(className[i]);
}else if(!Css.hasClassName(elm, className[i])){
elm.className +=(elm.className ? ' ':'') + className[i];
}}
}},
removeClassName: function(elm, className){
elm=Ink.i(elm);
if(!elm||!className){ return null; }
className=('' + className).split(/[, ]+/);
var i=0;
var len=className.length;
if(typeof elm.classList!=="undefined"){
for (; i < len; i++){
elm.classList.remove(className[i]);
}}else{
var elmClassName=elm.className||'';
var re;
for (; i < len; i++){
re=new RegExp("(^|\\s+)" + className[i] + "(\\s+|$)");
elmClassName=elmClassName.replace(re, ' ');
}
elm.className=(elmClassName
.replace(/^\s+/, '')
.replace(/\s+$/, ''));
}},
setClassName: function(elm, className, add){
this.addRemoveClassName(elm, className, add||false);
},
hasClassName: function(elm, className, all){
elm=Ink.i(elm);
if(!elm||!className){ return false; }
className=('' + className).split(/[, ]+/);
var i=0;
var len=className.length;
var has;
var re;
for(; i < len; i++){
if(typeof elm.classList!=="undefined"){
has=elm.classList.contains(className[i]);
}else{
var elmClassName=elm.className;
if(elmClassName===className[i]){
has=true;
}else{
re=new RegExp("(^|\\s)" + className[i] + "(\\s|$)");
has=re.test(elmClassName);
}}
if(has&&!all){ return true; }
if(!has&&all){ return false; }}
if(all){
return true;
}else{
return false;
}},
blinkClass: function(element, className, timeout, negate){
element=Ink.i(element);
Css.addRemoveClassName(element, className, !negate);
setTimeout(function(){
Css.addRemoveClassName(element, className, negate);
}, Number(timeout)||100);
},
toggleClassName: function(elm, className, forceAdd){
if(!elm||!className){ return false; }
if(typeof forceAdd!=='undefined'){
return Css.addRemoveClassName(elm, className, forceAdd);
}else if(typeof elm.classList!=="undefined"&&!/[, ]/.test(className)){
elm=Ink.i(elm);
if(elm!==null){
elm.classList.toggle(className);
}}else{
if(Css.hasClassName(elm, className)){
Css.removeClassName(elm, className);
}else{
Css.addClassName(elm, className);
}}
},
setOpacity: function(elm, value){
elm=Ink.i(elm);
if(elm!==null){
var val=1;
if(!isNaN(Number(value))){
if(value <=0){   val=0;           }
else if(value <=1){   val=value;       }
else if(value <=100){ val=value / 100; }else{                   val=1;           }}
if(typeof elm.style.opacity!=='undefined'){
elm.style.opacity=val;
}else{
elm.style.filter="alpha(opacity:"+(val*100|0)+")";
}}
},
_camelCase: function(str){
return str ? str.replace(/-(\w)/g, function (_, $1){
return $1.toUpperCase();
}):str;
},
getStyle: function(elm, style){
elm=Ink.i(elm);
if(elm!==null&&elm.style){
style=style==='float' ? 'cssFloat': this._camelCase(style);
var value=elm.style[style];
if(getCs&&(!value||value==='auto')){
var css=getCs(elm, null);
value=css ? css[style]:null;
}
else if(!value&&elm.currentStyle){
value=elm.currentStyle[style];
if(value==='auto'&&(style==='width'||style==='height')){
value=elm["offset" + style.charAt(0).toUpperCase() + style.slice(1)] + "px";
}}
if(style==='opacity'){
return value ? parseFloat(value, 10):1.0;
}
else if(style==='borderTopWidth'||style==='borderBottomWidth' ||
style==='borderRightWidth'||style==='borderLeftWidth'){
if(value==='thin'){      return '1px';   }
else if(value==='medium'){    return '3px';   }
else if(value==='thick'){     return '5px';   }}
return value==='auto' ? null:value;
}},
setStyle: function(elm, style){
elm=Ink.i(elm);
if(elm===null){ return; }
if(typeof style==='string'){
elm.style.cssText +='; '+style;
if(style.indexOf('opacity')!==-1){
this.setOpacity(elm, style.match(/opacity:\s*(\d?\.?\d*)/)[1]);
}}else{
for (var prop in style){
if(style.hasOwnProperty(prop)){
if(prop==='opacity'){
this.setOpacity(elm, style[prop]);
}
else if(prop==='float'||prop==='cssFloat'){
if(typeof elm.style.styleFloat==='undefined'){
elm.style.cssFloat=style[prop];
}else{
elm.style.styleFloat=style[prop];
}}else{
elm.style[prop]=style[prop];
}}
}}
},
show: function(elm, forceDisplayProperty){
elm=Ink.i(elm);
if(elm!==null){
elm.style.display=forceDisplayProperty||'';
}},
hide: function(elm){
elm=Ink.i(elm);
if(elm!==null){
elm.style.display='none';
}},
showHide: function(elm, show){
elm=Ink.i(elm);
if(elm){
elm.style.display=show ? '':'none';
}},
toggle: function(elm, forceShow){
elm=Ink.i(elm);
if(elm!==null){
if(typeof forceShow!=='undefined'){
if(forceShow===true){
this.show(elm);
}else{
this.hide(elm);
}}else{
if(this.getStyle(elm,'display').toLowerCase()==='none'){
this.show(elm);
}else{
this.hide(elm);
}}
}},
_getRefTag: function(head){
if(head.firstElementChild){
return head.firstElementChild;
}
for (var child=head.firstChild; child; child=child.nextSibling){
if(child.nodeType===1){
return child;
}}
return null;
},
appendStyleTag: function(selector, style, options){
options=Ink.extendObj({
type: 'text/css',
force: false
}, options||{});
var styles=document.getElementsByTagName("style"),
oldStyle=false, setStyle=true, i, l;
for (i=0, l=styles.length; i<l; i++){
oldStyle=styles[i].innerHTML;
if(oldStyle.indexOf(selector) >=0){
setStyle=false;
}}
if(setStyle){
var defStyle=document.createElement("style"),
head=document.getElementsByTagName("head")[0],
refTag=false, styleStr='';
defStyle.type=options.type;
styleStr +=selector +" {";
styleStr +=style;
styleStr +="} ";
if(typeof defStyle.styleSheet!=="undefined"){
defStyle.styleSheet.cssText=styleStr;
}else{
defStyle.appendChild(document.createTextNode(styleStr));
}
if(options.force){
head.appendChild(defStyle);
}else{
refTag=this._getRefTag(head);
if(refTag){
head.insertBefore(defStyle, refTag);
}}
}},
appendStylesheet: function(path, options){
options=Ink.extendObj({
media: 'screen',
type: 'text/css',
force: false
}, options||{});
var refTag,
style=document.createElement("link"),
head=document.getElementsByTagName("head")[0];
style.media=options.media;
style.type=options.type;
style.href=path;
style.rel="Stylesheet";
if(options.force){
head.appendChild(style);
}else{
refTag=this._getRefTag(head);
if(refTag){
head.insertBefore(style, refTag);
}}
},
_loadingCSSFiles: {},
_loadedCSSFiles:  {},
appendStylesheetCb: function(url, callback){
if(!url){
return callback(url);
}
if(this._loadedCSSFiles[url]){
return callback(url);
}
var cbs=this._loadingCSSFiles[url];
if(cbs){
return cbs.push(callback);
}
this._loadingCSSFiles[url]=[callback];
var linkEl=document.createElement('link');
linkEl.type='text/css';
linkEl.rel='stylesheet';
linkEl.href=url;
var headEl=document.getElementsByTagName('head')[0];
headEl.appendChild(linkEl);
var imgEl=document.createElement('img');
/*
var _self=this;
(function(_url){
imgEl.onerror=function(){
var url=_url;
_self._loadedCSSFiles[url]=true;
var callbacks=_self._loadingCSSFiles[url];
for (var i=0, f=callbacks.length; i < f; ++i){
callbacks[i](url);
}
delete _self._loadingCSSFiles[url];
};})(url);
*/
imgEl.onerror=Ink.bindEvent(function(event, _url){
var url=_url;
this._loadedCSSFiles[url]=true;
var callbacks=this._loadingCSSFiles[url];
for (var i=0, f=callbacks.length; i < f; ++i){
callbacks[i](url);
}
delete this._loadingCSSFiles[url];
}, this, url);
imgEl.src=url;
},
decToHex: function(dec){
var normalizeTo2=function(val){
if(val.length===1){
val='0' + val;
}
val=val.toUpperCase();
return val;
};
if(typeof dec==='object'){
var rDec=normalizeTo2(parseInt(dec.r, 10).toString(16));
var gDec=normalizeTo2(parseInt(dec.g, 10).toString(16));
var bDec=normalizeTo2(parseInt(dec.b, 10).toString(16));
return rDec+gDec+bDec;
}else{
dec +='';
var rgb=dec.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);
if(rgb!==null){
return  normalizeTo2(parseInt(rgb[1], 10).toString(16)) +
normalizeTo2(parseInt(rgb[2], 10).toString(16)) +
normalizeTo2(parseInt(rgb[3], 10).toString(16));
}else{
return normalizeTo2(parseInt(dec, 10).toString(16));
}}
},
hexToDec: function(hex){
if(hex.indexOf('#')===0){
hex=hex.substr(1);
}
if(hex.length===6){
return {
r: parseInt(hex.substr(0,2), 16),
g: parseInt(hex.substr(2,2), 16),
b: parseInt(hex.substr(4,2), 16)
};}
else if(hex.length===3){
return {
r: parseInt(hex.charAt(0) + hex.charAt(0), 16),
g: parseInt(hex.charAt(1) + hex.charAt(1), 16),
b: parseInt(hex.charAt(2) + hex.charAt(2), 16)
};}
else if(hex.length <=2){
return parseInt(hex, 16);
}},
getPropertyFromStylesheet: function(selector, property){
var rule=this.getRuleFromStylesheet(selector);
if(rule){
return rule.style[property];
}
return null;
},
getPropertyFromStylesheet2: function(selector, property){
var rules=this.getRulesFromStylesheet(selector);
/*
rules.forEach(function(rule){
var x=rule.style[property];
if(x!==null&&x!==undefined){
return x;
}});
*/
var x;
for(var i=0, t=rules.length; i < t; i++){
x=rules[i].style[property];
if(x!==null&&x!==undefined){
return x;
}}
return null;
},
getRuleFromStylesheet: function(selector){
var sheet, rules, ri, rf, rule;
var s=document.styleSheets;
if(!s){
return null;
}
for (var si=0, sf=document.styleSheets.length; si < sf; ++si){
sheet=document.styleSheets[si];
rules=sheet.rules ? sheet.rules:sheet.cssRules;
if(!rules){ return null; }
for (ri=0, rf=rules.length; ri < rf; ++ri){
rule=rules[ri];
if(!rule.selectorText){ continue; }
if(rule.selectorText===selector){
return rule;
}}
}
return null;
},
getRulesFromStylesheet: function(selector){
var res=[];
var sheet, rules, ri, rf, rule;
var s=document.styleSheets;
if(!s){ return res; }
for (var si=0, sf=document.styleSheets.length; si < sf; ++si){
sheet=document.styleSheets[si];
rules=sheet.rules ? sheet.rules:sheet.cssRules;
if(!rules){
return null;
}
for (ri=0, rf=rules.length; ri < rf; ++ri){
rule=rules[ri];
if(!rule.selectorText){ continue; }
if(rule.selectorText===selector){
res.push(rule);
}}
}
return res;
},
getPropertiesFromRule: function(selector){
var rule=this.getRuleFromStylesheet(selector);
var props={};
var prop, i, f;
rule=rule.style.cssText;
var parts=rule.split(';');
var steps, val, pre, pos;
for (i=0, f=parts.length; i < f; ++i){
if(parts[i].charAt(0)===' '){
parts[i]=parts[i].substring(1);
}
steps=parts[i].split(':');
prop=this._camelCase(steps[0].toLowerCase());
val=steps[1];
if(val){
val=val.substring(1);
if(prop==='padding'||prop==='margin'||prop==='borderWidth'){
if(prop==='borderWidth'){   pre='border'; pos='Width';  }else{                          pre=prop;     pos='';       }
if(val.indexOf(' ')!==-1){
val=val.split(' ');
props[pre + 'Top'   + pos]=val[0];
props[pre + 'Bottom'+ pos]=val[0];
props[pre + 'Left'  + pos]=val[1];
props[pre + 'Right' + pos]=val[1];
}else{
props[pre + 'Top'   + pos]=val;
props[pre + 'Bottom'+ pos]=val;
props[pre + 'Left'  + pos]=val;
props[pre + 'Right' + pos]=val;
}}
else if(prop==='borderRadius'){
if(val.indexOf(' ')!==-1){
val=val.split(' ');
props.borderTopLeftRadius=val[0];
props.borderBottomRightRadius=val[0];
props.borderTopRightRadius=val[1];
props.borderBottomLeftRadius=val[1];
}else{
props.borderTopLeftRadius=val;
props.borderTopRightRadius=val;
props.borderBottomLeftRadius=val;
props.borderBottomRightRadius=val;
}}else{
props[prop]=val;
}}
}
return props;
},
changeFontSize: function(selector, delta, op, minVal, maxVal){
var that=this;
Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector){
var e;
if(typeof selector!=='string'){ e='1st argument must be a CSS selector rule.'; }
else if(typeof delta!=='number'){ e='2nd argument must be a number.'; }
else if(op!==undefined&&op!=='+'&&op!=='*'){ e='3rd argument must be one of "+", "*".'; }
else if(minVal!==undefined&&(typeof minVal!=='number'||minVal <=0)){ e='4th argument must be a positive number.'; }
else if(maxVal!==undefined&&(typeof maxVal!=='number'||maxVal < maxVal)){ e='5th argument must be a positive number greater than minValue.'; }
if(e){ throw new TypeError(e); }
var val, el, els=Selector.select(selector);
if(minVal===undefined){ minVal=1; }
op=(op==='*') ? function(a,b){return a*b;}:function(a,b){return a+b;};
for (var i=0, f=els.length; i < f; ++i){
el=els[i];
val=parseFloat(that.getStyle(el, 'fontSize'));
val=op(val, delta);
if(val < minVal){ continue; }
if(typeof maxVal==='number'&&val > maxVal){ continue; }
el.style.fontSize=val + 'px';
}});
}};
return Css;
});
Ink.createModule('Ink.Dom.Element', 1, [], function(){
'use strict';
var createContextualFragmentSupport=(
typeof document.createRange==='function' &&
typeof window.Range.prototype.createContextualFragment==='function');
var deleteThisTbodyToken='Ink.Dom.Element tbody: ' + Math.random();
var browserCreatesTbodies=(function (){
var div=document.createElement('div');
div.innerHTML='<table>';
return div.getElementsByTagName('tbody').length!==0;
}());
function rect(elem){
var dimensions={};
try {
dimensions=elem.getBoundingClientRect();
} catch(e){
dimensions={ top: elem.offsetTop, left: elem.offsetLeft };}
return dimensions;
}
var InkElement={
isDOMElement: function(o){
return o!==null&&typeof o==='object'&&'nodeType' in o&&o.nodeType===1;
},
get: function(elm){
if(typeof elm!=='undefined'){
if(typeof elm==='string'){
return document.getElementById(elm);
}
return elm;
}
return null;
},
create: function(tag, properties){
var el=document.createElement(tag);
if(properties){
for(var property in properties){
if(properties.hasOwnProperty(property)){
if(property in InkElement){
InkElement[property](el, properties[property]);
}else{
if(property==='className'||property==='class'){
el.className=properties.className||properties['class'];
}else{
el.setAttribute(property, properties[property]);
}}
}}
}
return el;
},
remove: function(elm){
elm=Ink.i(elm);
var parEl;
if(elm&&(parEl=elm.parentNode)){
parEl.removeChild(elm);
}},
scrollTo: function(elm){
elm=InkElement.get(elm);
if(elm){
if(elm.scrollIntoView){
return elm.scrollIntoView();
}
var elmOffset={},
elmTop=0, elmLeft=0;
do {
elmTop +=elm.offsetTop||0;
elmLeft +=elm.offsetLeft||0;
elm=elm.offsetParent;
} while(elm);
elmOffset={x: elmLeft, y: elmTop};
window.scrollTo(elmOffset.x, elmOffset.y);
}},
offsetTop: function(elm){
return InkElement.offset(elm)[1];
},
offsetLeft: function(elm){
return InkElement.offset(elm)[0];
},
positionedOffset: function(element){
var valueTop=0, valueLeft=0;
element=InkElement.get(element);
do {
valueTop  +=element.offsetTop||0;
valueLeft +=element.offsetLeft||0;
element=element.offsetParent;
if(element){
if(element.tagName.toLowerCase()==='body'){ break;  }
var value=element.style.position;
if(!value&&element.currentStyle){
value=element.currentStyle.position;
}
if((!value||value==='auto')&&typeof getComputedStyle!=='undefined'){
var css=getComputedStyle(element, null);
value=css ? css.position:null;
}
if(value==='relative'||value==='absolute'){ break;  }}
} while (element);
return [valueLeft, valueTop];
},
offset: function(elm){
elm=Ink.i(elm);
var res=[0, 0];
var doc=elm.ownerDocument,
docElem=doc.documentElement,
box=rect(elm),
body=doc.body,
clientTop=docElem.clientTop||body.clientTop||0,
clientLeft=docElem.clientLeft||body.clientLeft||0,
scrollTop=doc.pageYOffset||docElem.scrollTop||body.scrollTop,
scrollLeft=doc.pageXOffset||docElem.scrollLeft||body.scrollLeft,
top=box.top  + scrollTop  - clientTop,
left=box.left + scrollLeft - clientLeft;
res=[left, top];
return res;
},
scroll: function(elm){
elm=elm ? Ink.i(elm):document.body;
return [
(( !window.pageXOffset) ? elm.scrollLeft:window.pageXOffset),
(( !window.pageYOffset) ? elm.scrollTop:window.pageYOffset)
];
},
_getPropPx: function(cs, prop){
var n, c;
var val=cs.getPropertyValue ? cs.getPropertyValue(prop):cs[prop];
if(!val){ n=0; }else{
c=val.indexOf('px');
if(c===-1){ n=0; }else{
n=parseFloat(val, 10);
}}
return n;
},
offset2: function(el){
return InkElement.offset(el);
},
hasAttribute: function(elm, attr){
elm=Ink.i(elm);
return elm.hasAttribute ? elm.hasAttribute(attr):!!elm.getAttribute(attr);
},
insertAfter: function(newElm, targetElm){
if(targetElm=InkElement.get(targetElm)){
if(targetElm.nextSibling!==null){
targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);
}else{
targetElm.parentNode.appendChild(newElm);
}}
},
insertBefore: function (newElm, targetElm){
if((targetElm=InkElement.get(targetElm))){
targetElm.parentNode.insertBefore(newElm, targetElm);
}},
insertTop: function(newElm,targetElm){
if(targetElm=InkElement.get(targetElm)){
if(targetElm.firstChild){
targetElm.insertBefore(newElm, targetElm.firstChild);
}else{
targetElm.appendChild(newElm);
}}
},
insertBottom: function(newElm, targetElm){
targetElm=Ink.i(targetElm);
targetElm.appendChild(newElm);
},
textContent: function(node){
node=Ink.i(node);
var text, k, cs, m;
switch(node&&node.nodeType){
case 9: 
return InkElement.textContent(node.documentElement||node.body&&node.body.parentNode||node.body);
case 1: 
text=('textContent' in node) ? node.textContent:node.innerText;
if(typeof text!=='undefined'){
return text;
}
case 11: 
text=node.textContent;
if(typeof text!=='undefined'){
return text;
}
if(node.firstChild===node.lastChild){
return InkElement.textContent(node.firstChild);
}
text=[];
cs=node.childNodes;
for (k=0, m=cs.length; k < m; ++k){
text.push(InkElement.textContent(cs[k]) );
}
return text.join('');
case 3: 
case 4: 
return node.nodeValue;
}
return '';
},
setTextContent: function(node, text){
node=Ink.i(node);
switch(node&&node.nodeType){
case 1: 
if('innerText' in node){
node.innerText=text;
break;
}
case 11: 
if('textContent' in node){
node.textContent=text;
break;
}
case 9: 
while(node.firstChild){
node.removeChild(node.firstChild);
}
if(text!==''){
var doc=node.ownerDocument||node;
node.appendChild(doc.createTextNode(text));
}
break;
case 3: 
case 4: 
node.nodeValue=text;
break;
}},
isLink: function(element){
var b=element&&element.nodeType===1&&((/^a|area$/i).test(element.tagName) ||
element.hasAttributeNS&&element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));
return !!b;
},
isAncestorOf: function(ancestor, node){
if(!node||!ancestor){
return false;
}
if(node.compareDocumentPosition){
return (ancestor.compareDocumentPosition(node) & 0x10)!==0;
}
while (node=node.parentNode){
if(node===ancestor){
return true;
}}
return false;
},
descendantOf: function(node, descendant){
return node!==descendant&&InkElement.isAncestorOf(node, descendant);
},
firstElementChild: function(elm){
if(!elm){
return null;
}
if('firstElementChild' in elm){
return elm.firstElementChild;
}
var child=elm.firstChild;
while(child&&child.nodeType!==1){
child=child.nextSibling;
}
return child;
},
lastElementChild: function(elm){
if(!elm){
return null;
}
if('lastElementChild' in elm){
return elm.lastElementChild;
}
var child=elm.lastChild;
while(child&&child.nodeType!==1){
child=child.previousSibling;
}
return child;
},
nextElementSibling: function(node){
var sibling=null;
if(!node){ return sibling; }
if("nextElementSibling" in node){
return node.nextElementSibling;
}else{
sibling=node.nextSibling;
while(sibling&&sibling.nodeType!==1){
sibling=sibling.nextSibling;
}
return sibling;
}},
previousElementSibling: function(node){
var sibling=null;
if(!node){ return sibling; }
if("previousElementSibling" in node){
return node.previousElementSibling;
}else{
sibling=node.previousSibling;
while(sibling&&sibling.nodeType!==1){
sibling=sibling.previousSibling;
}
return sibling;
}},
elementWidth: function(element){
if(typeof element==="string"){
element=document.getElementById(element);
}
return element.offsetWidth;
},
elementHeight: function(element){
if(typeof element==="string"){
element=document.getElementById(element);
}
return element.offsetHeight;
},
elementLeft: function(element){
return InkElement.offsetLeft(element);
},
elementTop: function(element){
return InkElement.offsetTop(element);
},
elementDimensions: function(element){
element=Ink.i(element);
return [element.offsetWidth, element.offsetHeight];
},
outerDimensions: function (element){
var bbox=rect(element);
var Css=Ink.getModule('Ink.Dom.Css_1');
var getStyle=Ink.bindMethod(Css, 'getStyle', element);
return [
bbox.right - bbox.left + parseFloat(getStyle('marginLeft')||0) + parseFloat(getStyle('marginRight')||0),
bbox.bottom - bbox.top + parseFloat(getStyle('marginTop')||0) + parseFloat(getStyle('marginBottom')||0)
];
},
inViewport: function (element, options){
var dims=rect(Ink.i(element));
if(typeof options==='boolean'){
options={partial: options, margin: 0};}
options=options||{};
options.margin=options.margin||0
if(options.partial){
return  dims.bottom + options.margin > 0                           &&
dims.left   - options.margin < InkElement.viewportWidth()  &&
dims.top    - options.margin < InkElement.viewportHeight() &&
dims.right  + options.margin > 0;
}else{
return  dims.top    + options.margin > 0                           &&
dims.right  - options.margin < InkElement.viewportWidth()  &&
dims.bottom - options.margin < InkElement.viewportHeight() &&
dims.left   + options.margin > 0;
}},
isHidden: function (element){
var w=element.offsetWidth,
h=element.offsetHeight,
force=(element.tagName.toLowerCase()==='tr');
var Css=Ink.getModule('Ink.Dom.Css_1');
return (w===0&&h===0&&!force) ? true :
(w!==0&&h!==0&&!force) ? false :
Css.getStyle(element, 'display').toLowerCase()==='none';
},
isVisible: function (element){
return !this.isHidden(element);
},
clonePosition: function(cloneTo, cloneFrom){
var pos=InkElement.offset(cloneFrom);
cloneTo.style.left=pos[0]+'px';
cloneTo.style.top=pos[1]+'px';
return cloneTo;
},
ellipsizeText: function(element){
if((element=Ink.i(element))){
element.style.overflow='hidden';
element.style.whiteSpace='nowrap';
element.style.textOverflow='ellipsis';
}},
findUpwardsHaving: function(element, boolTest){
while (element&&element.nodeType===1){
if(boolTest(element)){
return element;
}
element=element.parentNode;
}
return false;
},
findUpwardsByClass: function(element, className){
var re=new RegExp("(^|\\s)" + className + "(\\s|$)");
var tst=function(el){
var cls=el.className;
return cls&&re.test(cls);
};
return InkElement.findUpwardsHaving(element, tst);
},
findUpwardsByTag: function(element, tag){
tag=tag.toUpperCase();
var tst=function(el){
return el.nodeName&&el.nodeName.toUpperCase()===tag;
};
return InkElement.findUpwardsHaving(element, tst);
},
findUpwardsById: function(element, id){
var tst=function(el){
return el.id===id;
};
return InkElement.findUpwardsHaving(element, tst);
},
findUpwardsBySelector: function(element, sel){
var Selector=Ink.getModule('Ink.Dom.Selector', '1');
if(!Selector){
throw new Error('This method requires Ink.Dom.Selector');
}
var tst=function(el){
return Selector.matchesSelector(el, sel);
};
return InkElement.findUpwardsHaving(element, tst);
},
getChildrenText: function(el, removeIt){
var node,
j,
part,
nodes=el.childNodes,
jLen=nodes.length,
text='';
if(!el){
return text;
}
for (j=0; j < jLen; ++j){
node=nodes[j];
if(!node){    continue;   }
if(node.nodeType===3){
part=InkElement._trimString(String(node.data));
if(part.length > 0){
text +=part;
if(removeIt){ el.removeChild(node);   }}else{  el.removeChild(node);   }}
}
return text;
},
_trimString: function(text){
return (String.prototype.trim) ? text.trim():text.replace(/^\s*/, '').replace(/\s*$/, '');
},
getSelectValues: function (select){
var selectEl=Ink.i(select);
var values=[];
for (var i=0; i < selectEl.options.length; ++i){
values.push(selectEl.options[i].value);
}
return values;
},
_normalizeData: function(data){
var d, data2=[];
for (var i=0, f=data.length; i < f; ++i){
d=data[i];
if(!(d instanceof Array)){
d=[d, d];
}
else if(d.length===1){
d.push(d[0]);
}
data2.push(d);
}
return data2;
},
fillSelect: function(container, data, skipEmpty, defaultValue){
var containerEl=Ink.i(container);
if(!containerEl){   return; }
containerEl.innerHTML='';
var d, optionEl;
if(!skipEmpty){
optionEl=document.createElement('option');
optionEl.setAttribute('value', '');
containerEl.appendChild(optionEl);
}
data=InkElement._normalizeData(data);
for (var i=0, f=data.length; i < f; ++i){
d=data[i];
optionEl=document.createElement('option');
optionEl.setAttribute('value', d[0]);
if(d.length > 2){
optionEl.setAttribute('extra', d[2]);
}
optionEl.appendChild(document.createTextNode(d[1]));
if(d[0]===defaultValue){
optionEl.setAttribute('selected', 'selected');
}
containerEl.appendChild(optionEl);
}},
fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl){
insertAfterEl=Ink.i(insertAfterEl);
var containerEl=document.createElement('span');
InkElement.insertAfter(containerEl, insertAfterEl);
data=InkElement._normalizeData(data);
var d, inputEl;
if(!skipEmpty){
inputEl=document.createElement('input');
inputEl.setAttribute('type', 'radio');
inputEl.setAttribute('name', name);
inputEl.setAttribute('value', '');
containerEl.appendChild(inputEl);
if(splitEl){  containerEl.appendChild(document.createElement(splitEl)); }}
for (var i=0; i < data.length; ++i){
d=data[i];
inputEl=document.createElement('input');
inputEl.setAttribute('type', 'radio');
inputEl.setAttribute('name', name);
inputEl.setAttribute('value', d[0]);
containerEl.appendChild(inputEl);
containerEl.appendChild(document.createTextNode(d[1]));
if(splitEl){  containerEl.appendChild(document.createElement(splitEl)); }
if(d[0]===defaultValue){
inputEl.checked=true;
}}
return containerEl;
},
fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl){
insertAfterEl=Ink.i(insertAfterEl);
var containerEl=document.createElement('span');
InkElement.insertAfter(containerEl, insertAfterEl);
data=InkElement._normalizeData(data);
if(name.substring(name.length - 1)!==']'){
name +='[]';
}
var d, inputEl;
for (var i=0; i < data.length; ++i){
d=data[i];
inputEl=document.createElement('input');
inputEl.setAttribute('type', 'checkbox');
inputEl.setAttribute('name', name);
inputEl.setAttribute('value', d[0]);
containerEl.appendChild(inputEl);
containerEl.appendChild(document.createTextNode(d[1]));
if(splitEl){  containerEl.appendChild(document.createElement(splitEl)); }
if(d[0]===defaultValue){
inputEl.checked=true;
}}
return containerEl;
},
parentIndexOf: function(parentEl, childEl){
if(!childEl){
childEl=parentEl;
parentEl=parentEl.parentNode;
}
if(!parentEl){ return false; }
for (var i=0, f=parentEl.children.length; i < f; ++i){
if(parentEl.children[i]===childEl){
return i;
}}
return false;
},
nextSiblings: function(elm){
elm=Ink.i(elm);
if(typeof(elm)==='object'&&elm!==null&&elm.nodeType&&elm.nodeType===1){
var elements=[],
siblings=elm.parentNode.children,
index=InkElement.parentIndexOf(elm.parentNode, elm);
for(var i=++index, len=siblings.length; i<len; i++){
elements.push(siblings[i]);
}
return elements;
}
return [];
},
previousSiblings: function(elm){
elm=Ink.i(elm);
if(typeof(elm)==='object'&&elm!==null&&elm.nodeType&&elm.nodeType===1){
var elements=[],
siblings=elm.parentNode.children,
index=InkElement.parentIndexOf(elm.parentNode, elm);
for(var i=0, len=index; i<len; i++){
elements.push(siblings[i]);
}
return elements;
}
return [];
},
siblings: function(elm){
elm=Ink.i(elm);
if(typeof(elm)==='object'&&elm!==null&&elm.nodeType&&elm.nodeType===1){
var elements=[],
siblings=elm.parentNode.children;
for(var i=0, len=siblings.length; i<len; i++){
if(elm!==siblings[i]){
elements.push(siblings[i]);
}}
return elements;
}
return [];
},
childElementCount: function(elm){
elm=Ink.i(elm);
if('childElementCount' in elm){
return elm.childElementCount;
}
if(!elm){ return 0; }
return InkElement.siblings(elm).length + 1;
},
_wrapElements: {
TABLE: function (div, html){
if(browserCreatesTbodies){
div.innerHTML="<table>" + html + "<tbody><tr><td>" + deleteThisTbodyToken + "</tr></td></tbody></table>";
}else{
div.innerHTML="<table>" + html + "</table>";
}
return div.firstChild;
},
TBODY: function (div, html){
div.innerHTML='<table><tbody>' + html + '</tbody></table>';
return div.firstChild.getElementsByTagName('tbody')[0];
},
THEAD: function (div, html){
div.innerHTML='<table><thead>' + html + '</thead><tbody></tbody></table>';
return div.firstChild.getElementsByTagName('thead')[0];
},
TFOOT: function (div, html){
div.innerHTML='<table><tfoot>' + html + '</tfoot><tbody></tbody></table>';
return div.firstChild.getElementsByTagName('tfoot')[0];
},
TR: function (div, html){
div.innerHTML='<table><tbody><tr>' + html + '</tr></tbody></table>';
return div.firstChild.firstChild.firstChild;
}},
_getWrapper: function (elm, html){
var nodeName=elm.nodeName&&elm.nodeName.toUpperCase();
var wrapper=document.createElement('div');
var wrapFunc=InkElement._wrapElements[nodeName];
if(!wrapFunc){
wrapper.innerHTML=html;
return wrapper;
}
wrapper=wrapFunc(wrapper, html);
if(browserCreatesTbodies&&nodeName==='TABLE'){
var tds=wrapper.getElementsByTagName('td');
for (var i=0, len=tds.length; i < len; i++){
if(tds[i].innerHTML===deleteThisTbodyToken){
var tbody=tds[i].parentNode.parentNode;
tbody.parentNode.removeChild(tbody);
}}
}
return wrapper;
},
appendHTML: function(elm, html){
elm=Ink.i(elm);
if(elm!==null){
var wrapper=InkElement._getWrapper(elm, html);
while (wrapper.firstChild){
elm.appendChild(wrapper.firstChild);
}}
},
prependHTML: function(elm, html){
elm=Ink.i(elm);
if(elm!==null){
var wrapper=InkElement._getWrapper(elm, html);
while (wrapper.lastChild){
elm.insertBefore(wrapper.lastChild, elm.firstChild);
}}
},
setHTML: function (elm, html){
elm=Ink.i(elm);
if(elm!==null){
try {
elm.innerHTML=html;
} catch (e){
InkElement.clear(elm);
InkElement.appendHTML(elm, html);
}}
},
wrap: function (target, container){
target=Ink.i(target);
container=Ink.i(container);
var nextNode=target.nextSibling;
var parent=target.parentNode;
container.appendChild(target);
if(nextNode!==null){
parent.insertBefore(container, nextNode);
}else{
parent.appendChild(container);
}
return container;
},
unwrap: function (elem, wrapperSelector){
elem=Ink.i(elem);
var wrapper;
if(typeof wrapperSelector==='string'){
wrapper=InkElement.findUpwardsBySelector(elem, wrapperSelector);
}else if(typeof wrapperSelector==='object'&&wrapperSelector.tagName){
wrapper=InkElement.findUpwardsHaving(elem, function (ancestor){
return ancestor===wrapperSelector;
});
}else{
wrapper=elem.parentNode;
}
if(!wrapper||!wrapper.parentNode){ return; }
InkElement.insertBefore(elem, wrapper);
},
replace: function (element, replacement){
element=Ink.i(element);
if(element!==null){
element.parentNode.replaceChild(replacement, element);
}},
removeTextNodeChildren: function(el){
el=Ink.i(el);
if(el!==null){
var prevEl, toRemove, parent=el;
el=el.firstChild;
while (el){
toRemove=(el.nodeType===3);
prevEl=el;
el=el.nextSibling;
if(toRemove){
parent.removeChild(prevEl);
}}
}},
htmlToFragment: (createContextualFragmentSupport ?
function(html){
var range;
if(typeof html!=='string'){ return document.createDocumentFragment(); }
range=document.createRange();
range.selectNode(document.body);
return range.createContextualFragment(html);
}:function (html){
var fragment=document.createDocumentFragment(),
tempElement,
current;
if(typeof html!=='string'){ return fragment; }
tempElement=document.createElement('div');
tempElement.innerHTML=html;
while((current=tempElement.firstChild)){
fragment.appendChild(current);
}
return fragment;
}),
_camelCase: function(str){
return str ? str.replace(/-(\w)/g, function (_, $1){
return $1.toUpperCase();
}):str;
},
data: function(selector){
var el;
if(typeof selector!=='object'&&typeof selector!=='string'){
throw '[Ink.Dom.Element.data] :: Invalid selector defined';
}
if(typeof selector==='object'){
el=selector;
}else{
var InkDomSelector=Ink.getModule('Ink.Dom.Selector', 1);
if(!InkDomSelector){
throw "[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1";
}
el=InkDomSelector.select(selector);
if(el.length <=0){
throw "[Ink.Dom.Element.data] :: Can't find any element with the specified selector";
}
el=el[0];
}
var dataset={};
var attrs=el.attributes||[];
var curAttr, curAttrName, curAttrValue;
if(attrs){
for (var i=0, total=attrs.length; i < total; ++i){
curAttr=attrs[i];
curAttrName=curAttr.name;
curAttrValue=curAttr.value;
if(curAttrName&&curAttrName.indexOf('data-')===0){
dataset[InkElement._camelCase(curAttrName.replace('data-', ''))]=curAttrValue;
}}
}
return dataset;
},
clear:function(elem , child){
while(( child=elem.lastChild) ){
elem.removeChild(child);
}} ,
moveCursorTo: function(el, t){
el=Ink.i(el);
if(el!==null){
if(el.setSelectionRange){
el.setSelectionRange(t, t);
}else{
var range=el.createTextRange();
range.collapse(true);
range.moveEnd('character', t);
range.moveStart('character', t);
range.select();
}}
},
pageWidth: function(){
var xScroll;
if(window.innerWidth&&window.scrollMaxX){
xScroll=window.innerWidth + window.scrollMaxX;
}else if(document.body.scrollWidth > document.body.offsetWidth){
xScroll=document.body.scrollWidth;
}else{
xScroll=document.body.offsetWidth;
}
var windowWidth;
if(window.self.innerWidth){
if(document.documentElement.clientWidth){
windowWidth=document.documentElement.clientWidth;
}else{
windowWidth=window.self.innerWidth;
}}else if(document.documentElement&&document.documentElement.clientWidth){
windowWidth=document.documentElement.clientWidth;
}else if(document.body){
windowWidth=document.body.clientWidth;
}
if(xScroll < windowWidth){
return xScroll;
}else{
return windowWidth;
}},
pageHeight: function(){
var yScroll;
if(window.innerHeight&&window.scrollMaxY){
yScroll=window.innerHeight + window.scrollMaxY;
}else if(document.body.scrollHeight > document.body.offsetHeight){
yScroll=document.body.scrollHeight;
}else{
yScroll=document.body.offsetHeight;
}
var windowHeight;
if(window.self.innerHeight){
windowHeight=window.self.innerHeight;
}else if(document.documentElement&&document.documentElement.clientHeight){
windowHeight=document.documentElement.clientHeight;
}else if(document.body){
windowHeight=document.body.clientHeight;
}
if(yScroll < windowHeight){
return windowHeight;
}else{
return yScroll;
}},
viewportWidth: function(){
if(typeof window.innerWidth!=="undefined"){
return window.innerWidth;
}
if(document.documentElement&&typeof document.documentElement.offsetWidth!=="undefined"){
return document.documentElement.offsetWidth;
}},
viewportHeight: function(){
if(typeof window.innerHeight!=="undefined"){
return window.innerHeight;
}
if(document.documentElement&&typeof document.documentElement.offsetHeight!=="undefined"){
return document.documentElement.offsetHeight;
}},
scrollWidth: function(){
if(typeof window.self.pageXOffset!=='undefined'){
return window.self.pageXOffset;
}
if(typeof document.documentElement!=='undefined'&&typeof document.documentElement.scrollLeft!=='undefined'){
return document.documentElement.scrollLeft;
}
return document.body.scrollLeft;
},
scrollHeight: function(){
if(typeof window.self.pageYOffset!=='undefined'){
return window.self.pageYOffset;
}
if(typeof document.body!=='undefined'&&typeof document.body.scrollTop!=='undefined'&&typeof document.documentElement!=='undefined'&&typeof document.documentElement.scrollTop!=='undefined'){
return document.body.scrollTop||document.documentElement.scrollTop;
}
if(typeof document.documentElement!=='undefined'&&typeof document.documentElement.scrollTop!=='undefined'){
return document.documentElement.scrollTop;
}
return document.body.scrollTop;
}};
return InkElement;
});
Ink.createModule('Ink.Dom.Event', 1, [], function(){
var bean=(function (name, context, definition){
return definition()
})('bean', this, function (name, context){
name=name||'bean'
context=context||this
var win=window
, old=context[name]
, namespaceRegex=/[^\.]*(?=\..*)\.|.*/
, nameRegex=/\..*/
, addEvent='addEventListener'
, removeEvent='removeEventListener'
, doc=document||{}
, root=doc.documentElement||{}
, W3C_MODEL=root[addEvent]
, eventSupport=W3C_MODEL ? addEvent:'attachEvent'
, ONE={}
, slice=Array.prototype.slice
, str2arr=function (s, d){ return s.split(d||' ') }
, isString=function (o){ return typeof o=='string' }
, isFunction=function (o){ return typeof o=='function' }
, standardNativeEvents =
'click dblclick mouseup mousedown contextmenu '                  +
'mousewheel mousemultiwheel DOMMouseScroll '                     +
'mouseover mouseout mousemove selectstart selectend '            +
'keydown keypress keyup '                                        +
'orientationchange '                                             +
'focus blur change reset select submit '                         +
'load unload beforeunload resize move DOMContentLoaded '         +
'readystatechange message '                                      +
'error abort scroll '
, w3cNativeEvents =
'show '                                                          +
'input invalid '                                                 +
'touchstart touchmove touchend touchcancel '                     +
'gesturestart gesturechange gestureend '                         +
'textinput'                                                      +
'readystatechange pageshow pagehide popstate '                   +
'hashchange offline online '                                     +
'afterprint beforeprint '                                        +
'dragstart dragenter dragover dragleave drag drop dragend '      +
'loadstart progress suspend emptied stalled loadmetadata '       +
'loadeddata canplay canplaythrough playing waiting seeking '     +
'seeked ended durationchange timeupdate play pause ratechange '  +
'volumechange cuechange '                                        +
'checking noupdate downloading cached updateready obsolete '
, nativeEvents=(function (hash, events, i){
for (i=0; i < events.length; i++) events[i]&&(hash[events[i]]=1)
return hash
}({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents:''))))
, customEvents=(function (){
var isAncestor='compareDocumentPosition' in root
? function (element, container){
return container.compareDocumentPosition&&(container.compareDocumentPosition(element) & 16)===16
}
: 'contains' in root
? function (element, container){
container=container.nodeType===9||container===window ? root:container
return container!==element&&container.contains(element)
}
: function (element, container){
while (element=element.parentNode) if(element===container) return 1
return 0
}
, check=function (event){
var related=event.relatedTarget
return !related
? related==null
: (related!==this&&related.prefix!=='xul'&&!/document/.test(this.toString())
&& !isAncestor(related, this))
}
return {
mouseenter: { base: 'mouseover', condition: check }
, mouseleave: { base: 'mouseout', condition: check }
, mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll':'mousewheel' }}
}())
, Event=(function (){
var commonProps=str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +
'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey '  +
'srcElement target timeStamp type view which propertyName path')
, mouseProps=commonProps.concat(str2arr('button buttons clientX clientY dataTransfer '      +
'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))
, mouseWheelProps=mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +
'axis')) // 'axis' is FF specific
, keyProps=commonProps.concat(str2arr('char charCode key keyCode keyIdentifier '          +
'keyLocation location isComposing code'))
, textProps=commonProps.concat(str2arr('data'))
, touchProps=commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))
, messageProps=commonProps.concat(str2arr('data origin source'))
, stateProps=commonProps.concat(str2arr('state'))
, overOutRegex=/over|out/
, typeFixers=[
{
reg: /key/i
, fix: function (event, newEvent){
newEvent.keyCode=event.keyCode||event.which
return keyProps
}}
, {
reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i
, fix: function (event, newEvent, type){
newEvent.rightClick=event.which===3||event.button===2
newEvent.pos={ x: 0, y: 0 }
if(event.pageX||event.pageY){
newEvent.clientX=event.pageX
newEvent.clientY=event.pageY
}else if(event.clientX||event.clientY){
newEvent.clientX=event.clientX + doc.body.scrollLeft + root.scrollLeft
newEvent.clientY=event.clientY + doc.body.scrollTop + root.scrollTop
}
if(overOutRegex.test(type)){
newEvent.relatedTarget=event.relatedTarget
|| event[(type=='mouseover' ? 'from':'to') + 'Element']
}
return mouseProps
}}
, {
reg: /mouse.*(wheel|scroll)/i
, fix: function (){ return mouseWheelProps }}
, {
reg: /^text/i
, fix: function (){ return textProps }}
, {
reg: /^touch|^gesture/i
, fix: function (){ return touchProps }}
, {
reg: /^message$/i
, fix: function (){ return messageProps }}
, {
reg: /^popstate$/i
, fix: function (){ return stateProps }}
, {
reg: /.*/
, fix: function (){ return commonProps }}
]
, typeFixerMap={}
, Event=function (event, element, isNative){
if(!arguments.length) return
event=event||((element.ownerDocument||element.document||element).parentWindow||win).event
this.originalEvent=event
this.isNative=isNative
this.isBean=true
if(!event) return
var type=event.type
, target=event.target||event.srcElement
, i, l, p, props, fixer
this.target=target&&target.nodeType===3 ? target.parentNode:target
if(isNative){
fixer=typeFixerMap[type]
if(!fixer){
for (i=0, l=typeFixers.length; i < l; i++){
if(typeFixers[i].reg.test(type)){
typeFixerMap[type]=fixer=typeFixers[i].fix
break
}}
}
props=fixer(event, this, type)
for (i=props.length; i--;){
if(!((p=props[i]) in this)&&p in event) this[p]=event[p]
}}
}
Event.prototype.preventDefault=function (){
if(this.originalEvent.preventDefault) this.originalEvent.preventDefault()
else try { this.originalEvent.returnValue=false } catch(e){}}
Event.prototype.stopPropagation=function (){
if(this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()
else this.originalEvent.cancelBubble=true
}
Event.prototype.stop=function (){
this.preventDefault()
this.stopPropagation()
this.stopped=true
}
Event.prototype.stopImmediatePropagation=function (){
if(this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()
this.isImmediatePropagationStopped=function (){ return true }}
Event.prototype.isImmediatePropagationStopped=function (){
return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()
}
Event.prototype.clone=function (currentTarget){
var ne=new Event(this, this.element, this.isNative)
ne.currentTarget=currentTarget
return ne
}
return Event
}())
, targetElement=function (element, isNative){
return !W3C_MODEL&&!isNative&&(element===doc||element===win) ? root:element
}
, RegEntry=(function (){
var wrappedHandler=function (element, fn, condition, args){
var call=function (event, eargs){
return fn.apply(element, args ? slice.call(eargs, event ? 0:1).concat(args):eargs)
}
, findTarget=function (event, eventElement){
return fn.__beanDel ? fn.__beanDel.ft(event.target, element):eventElement
}
, handler=condition
? function (event){
var target=findTarget(event, this)
if(condition.apply(target, arguments)){
if(event) event.currentTarget=target
return call(event, arguments)
}}
: function (event){
if(fn.__beanDel) event=event.clone(findTarget(event))
return call(event, arguments)
}
handler.__beanDel=fn.__beanDel
return handler
}
, RegEntry=function (element, type, handler, original, namespaces, args, root){
var customType=customEvents[type]
, isNative
if(type=='unload'){
handler=once(removeListener, element, type, handler, original)
}
if(customType){
if(customType.condition){
handler=wrappedHandler(element, handler, customType.condition, args)
}
type=customType.base||type
}
this.isNative=isNative=nativeEvents[type]&&!!element[eventSupport]
this.customType    = !W3C_MODEL&&!isNative&&type
this.element=element
this.type=type
this.original=original
this.namespaces=namespaces
this.eventType=W3C_MODEL||isNative ? type:'propertychange'
this.target=targetElement(element, isNative)
this[eventSupport] = !!this.target[eventSupport]
this.root=root
this.handler=wrappedHandler(element, handler, null, args)
}
RegEntry.prototype.inNamespaces=function (checkNamespaces){
var i, j, c=0
if(!checkNamespaces) return true
if(!this.namespaces) return false
for (i=checkNamespaces.length; i--;){
for (j=this.namespaces.length; j--;){
if(checkNamespaces[i]==this.namespaces[j]) c++
}}
return checkNamespaces.length===c
}
RegEntry.prototype.matches=function (checkElement, checkOriginal, checkHandler){
return this.element===checkElement &&
(!checkOriginal||this.original===checkOriginal) &&
(!checkHandler||this.handler===checkHandler)
}
return RegEntry
}())
, registry=(function (){
var map={}
, forAll=function (element, type, original, handler, root, fn){
var pfx=root ? 'r':'$'
if(!type||type=='*'){
for (var t in map){
if(t.charAt(0)==pfx){
forAll(element, t.substr(1), original, handler, root, fn)
}}
}else{
var i=0, l, list=map[pfx + type], all=element=='*'
if(!list) return
for (l=list.length; i < l; i++){
if((all||list[i].matches(element, original, handler))&&!fn(list[i], list, i, type)) return
}}
}
, has=function (element, type, original, root){
var i, list=map[(root ? 'r':'$') + type]
if(list){
for (i=list.length; i--;){
if(!list[i].root&&list[i].matches(element, original, null)) return true
}}
return false
}
, get=function (element, type, original, root){
var entries=[]
forAll(element, type, original, null, root, function (entry){
return entries.push(entry)
})
return entries
}
, put=function (entry){
var has = !entry.root&&!this.has(entry.element, entry.type, null, false)
, key=(entry.root ? 'r':'$') + entry.type
;(map[key]||(map[key]=[])).push(entry)
return has
}
, del=function (entry){
forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i){
list.splice(i, 1)
entry.removed=true
if(list.length===0) delete map[(entry.root ? 'r':'$') + entry.type]
return false
})
}
, entries=function (){
var t, entries=[]
for (t in map){
if(t.charAt(0)=='$') entries=entries.concat(map[t])
}
return entries
}
return { has: has, get: get, put: put, del: del, entries: entries }}())
, selectorEngine
, setSelectorEngine=function (e){
if(!arguments.length){
selectorEngine=doc.querySelectorAll
? function (s, r){
return r.querySelectorAll(s)
}
: function (){
throw new Error('Bean: No selector engine installed')
}}else{
selectorEngine=e
}}
, rootListener=function (event, type){
if(!W3C_MODEL&&type&&event&&event.propertyName!='_on' + type) return
var listeners=registry.get(this, type||event.type, null, false)
, l=listeners.length
, i=0
event=new Event(event, this, true)
if(type) event.type=type
for (; i < l&&!event.isImmediatePropagationStopped(); i++){
if(!listeners[i].removed) listeners[i].handler.call(this, event)
}}
, listener=W3C_MODEL
? function (element, type, add){
element[add ? addEvent:removeEvent](type, rootListener, false)
}
: function (element, type, add, custom){
var entry
if(add){
registry.put(entry=new RegEntry(
element
, custom||type
, function (event){
rootListener.call(element, event, custom)
}
, rootListener
, null
, null
, true
))
if(custom&&element['_on' + custom]==null) element['_on' + custom]=0
entry.target.attachEvent('on' + entry.eventType, entry.handler)
}else{
entry=registry.get(element, custom||type, rootListener, true)[0]
if(entry){
entry.target.detachEvent('on' + entry.eventType, entry.handler)
registry.del(entry)
}}
}
, once=function (rm, element, type, fn, originalFn){
return function (){
fn.apply(this, arguments)
rm(element, type, originalFn)
}}
, removeListener=function (element, orgType, handler, namespaces){
var type=orgType&&orgType.replace(nameRegex, '')
, handlers=registry.get(element, type, null, false)
, removed={}
, i, l
for (i=0, l=handlers.length; i < l; i++){
if((!handler||handlers[i].original===handler)&&handlers[i].inNamespaces(namespaces)){
registry.del(handlers[i])
if(!removed[handlers[i].eventType]&&handlers[i][eventSupport])
removed[handlers[i].eventType]={ t: handlers[i].eventType, c: handlers[i].type }}
}
for (i in removed){
if(removed.hasOwnProperty(i)){
if(!registry.has(element, removed[i].t, null, false)){
listener(element, removed[i].t, false, removed[i].c)
}}
}}
, delegate=function (selector, fn){
var findTarget=function (target, root){
var i, array=isString(selector) ? selectorEngine(selector, root):selector
for (; target&&target!==root; target=target.parentNode){
for (i=array.length; i--;){
if(array[i]===target) return target
}}
}
, handler=function (e){
var match=findTarget(e.target, this)
if(match) fn.apply(match, arguments)
}
handler.__beanDel={
ft:findTarget
, selector:selector
}
return handler
}
, fireListener=W3C_MODEL ? function (isNative, type, element){
var evt=doc.createEvent(isNative ? 'HTMLEvents':'UIEvents')
evt[isNative ? 'initEvent':'initUIEvent'](type, true, true, win, 1)
element.dispatchEvent(evt)
}:function (isNative, type, element){
element=targetElement(element, isNative)
isNative ? element.fireEvent('on' + type, doc.createEventObject()):element['_on' + type]++
}
, off=function (element, typeSpec, fn){
var isTypeStr=isString(typeSpec)
, k, type, namespaces, i
if(isTypeStr&&typeSpec.indexOf(' ') > 0){
typeSpec=str2arr(typeSpec)
for (i=typeSpec.length; i--;)
off(element, typeSpec[i], fn)
return element
}
type=isTypeStr&&typeSpec.replace(nameRegex, '')
if(type&&customEvents[type]) type=customEvents[type].base
if(!typeSpec||isTypeStr){
if(namespaces=isTypeStr&&typeSpec.replace(namespaceRegex, '')) namespaces=str2arr(namespaces, '.')
removeListener(element, type, fn, namespaces)
}else if(isFunction(typeSpec)){
removeListener(element, null, typeSpec)
}else{
for (k in typeSpec){
if(typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])
}}
return element
}
, on=function(element, events, selector, fn){
var originalFn, type, types, i, args, entry, first
if(selector===undefined&&typeof events=='object'){
for (type in events){
if(events.hasOwnProperty(type)){
on.call(this, element, type, events[type])
}}
return
}
if(!isFunction(selector)){
originalFn=fn
args=slice.call(arguments, 4)
fn=delegate(selector, originalFn, selectorEngine)
}else{
args=slice.call(arguments, 3)
fn=originalFn=selector
}
types=str2arr(events)
if(this===ONE){
fn=once(off, element, events, fn, originalFn)
}
for (i=types.length; i--;){
first=registry.put(entry=new RegEntry(
element
, types[i].replace(nameRegex, '')
, fn
, originalFn
, str2arr(types[i].replace(namespaceRegex, ''), '.')
, args
, false
))
if(entry[eventSupport]&&first){
listener(element, entry.eventType, true, entry.customType)
}}
return element
}
, add=function (element, events, fn, delfn){
return on.apply(null
, !isString(fn)
? slice.call(arguments)
: [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5):[])
)
}
, one=function (){
return on.apply(ONE, arguments)
}
, fire=function (element, type, args){
var types=str2arr(type)
, i, j, l, names, handlers
for (i=types.length; i--;){
type=types[i].replace(nameRegex, '')
if(names=types[i].replace(namespaceRegex, '')) names=str2arr(names, '.')
if(!names&&!args&&element[eventSupport]){
fireListener(nativeEvents[type], type, element)
}else{
handlers=registry.get(element, type, null, false)
args=[false].concat(args)
for (j=0, l=handlers.length; j < l; j++){
if(handlers[j].inNamespaces(names)){
handlers[j].handler.apply(element, args)
}}
}}
return element
}
, clone=function (element, from, type){
var handlers=registry.get(from, type, null, false)
, l=handlers.length
, i=0
, args, beanDel
for (; i < l; i++){
if(handlers[i].original){
args=[ element, handlers[i].type ]
if(beanDel=handlers[i].handler.__beanDel) args.push(beanDel.selector)
args.push(handlers[i].original)
on.apply(null, args)
}}
return element
}
, bean={
'on':on
, 'add':add
, 'one':one
, 'off':off
, 'remove':off
, 'clone':clone
, 'fire':fire
, 'Event':Event
, 'setSelectorEngine':setSelectorEngine
, 'noConflict':function (){
context[name]=old
return this
}}
if(win.attachEvent){
var cleanup=function (){
var i, entries=registry.entries()
for (i in entries){
if(entries[i].type&&entries[i].type!=='unload') off(entries[i].element, entries[i].type)
}
win.detachEvent('onunload', cleanup)
win.CollectGarbage&&win.CollectGarbage()
}
win.attachEvent('onunload', cleanup)
}
setSelectorEngine(Ink.ss)
return bean
});
'use strict';
var InkEvent={
KEY_BACKSPACE: 8,
KEY_TAB:       9,
KEY_RETURN:   13,
KEY_ESC:      27,
KEY_SPACE:    32,
KEY_LEFT:     37,
KEY_UP:       38,
KEY_RIGHT:    39,
KEY_DOWN:     40,
KEY_DELETE:   46,
KEY_HOME:     36,
KEY_END:      35,
KEY_PAGEUP:   33,
KEY_PAGEDOWN: 34,
KEY_INSERT:   45,
throttle: function (func, wait, opt){
wait=wait||0;
opt=opt||{};
var lastCall=0;
var timeout;
function throttled(maybeEvent){
var now=+new Date();
var timeDiff=now - lastCall;
if(opt.preventDefault &&
maybeEvent &&
typeof maybeEvent.preventDefault==='function'){
maybeEvent.preventDefault();
}
if(timeDiff >=wait){
lastCall=now;
return func.apply('bind' in opt ? opt.bind:this, [].slice.call(arguments));
}else{
var that=this;
var args=[].slice.call(arguments);
if(timeout){
clearTimeout(timeout);
}
timeout=setTimeout(function (){
timeout=null;
return throttled.apply(that, args);
}, wait - timeDiff);
}}
return throttled;
},
element: function(ev){
var node=ev.delegationTarget ||
ev.target ||
(ev.type==='mouseout'&&ev.fromElement) ||
(ev.type==='mouseleave'&&ev.fromElement) ||
(ev.type==='mouseover'&&ev.toElement) ||
(ev.type==='mouseenter'&&ev.toElement) ||
ev.srcElement ||
null;
return node&&(node.nodeType===3||node.nodeType===4) ? node.parentNode:node;
},
relatedTarget: function(ev){
var node=ev.relatedTarget ||
(ev.type==='mouseout'&&ev.toElement) ||
(ev.type==='mouseleave'&&ev.toElement) ||
(ev.type==='mouseover'&&ev.fromElement) ||
(ev.type==='mouseenter'&&ev.fromElement) ||
null;
return node&&(node.nodeType===3||node.nodeType===4) ? node.parentNode:node;
},
findElement: function(ev, elmTagName, force){
var node=this.element(ev);
while(true){
if(node.nodeName.toLowerCase()===elmTagName.toLowerCase()){
return node;
}else{
node=node.parentNode;
if(!node){
if(force){
return false;
}
return document;
}
if(!node.parentNode){
if(force){ return false; }
return document;
}}
}},
observe: function(element, eventName, callBack, useCapture){
element=Ink.i(element);
if(element){
if(element.addEventListener){
element.addEventListener(eventName, callBack, !!useCapture);
}else{
element.attachEvent('on' + eventName, (callBack=Ink.bind(callBack, element)));
}
return callBack;
}},
observeOnce: function (element, eventName, callBack, useCapture){
var onceBack=function (){
InkEvent.stopObserving(element, eventName, handler);
return callBack.apply(this, arguments);
};
var handler=InkEvent.observe(element, eventName, onceBack, useCapture);
return handler;
},
observeMulti: function (elements, eventName, callBack, useCapture){
if(typeof elements==='string'){
elements=Ink.ss(elements);
}else if( elements&&elements.nodeType===1){
elements=[elements];
}
if(!elements[0]){ return false; }
for (var i=0, len=elements.length; i < len; i++){
this.observe(elements[i], eventName, callBack, useCapture);
}
return callBack;
},
observeDelegated: function (element, eventName, selector, callback){
return InkEvent.observe(element, eventName, function (event){
var fromElement=InkEvent.element(event);
if(!fromElement||fromElement===element){ return; }
var cursor=fromElement;
while (cursor!==element&&cursor!==document&&cursor){
if(Ink.Dom.Selector_1.matchesSelector(cursor, selector)){
event.delegationTarget=cursor;
return callback(event);
}
cursor=cursor.parentNode;
}});
},
stopObserving: function(element, eventName, callBack, useCapture){
element=Ink.i(element);
if(element){
if(element.removeEventListener){
element.removeEventListener(eventName, callBack, !!useCapture);
}else{
element.detachEvent('on' + eventName, callBack);
}}
},
stop: function(event){
if(event.cancelBubble!==null){
event.cancelBubble=true;
}
if(event.stopPropagation){
event.stopPropagation();
}
if(event.preventDefault){
event.preventDefault();
}
if(window.attachEvent){
event.returnValue=false;
}
if(event.cancel!==null){
event.cancel=true;
}},
stopPropagation: function(event){
if(event.cancelBubble!==null){
event.cancelBubble=true;
}
if(event.stopPropagation){
event.stopPropagation();
}},
stopDefault: function(event){
if(event.preventDefault){
event.preventDefault();
}
if(window.attachEvent){
event.returnValue=false;
}
if(event.cancel!==null){
event.cancel=true;
}},
pointer: function(ev){
return {
x: this.pointerX(ev),
y: this.pointerY(ev)
};},
pointerX: function(ev){
return (ev.touches&&ev.touches[0]&&ev.touches[0].pageX) ||
(ev.pageX) ||
(ev.clientX);
},
pointerY: function(ev){
return (ev.touches&&ev.touches[0]&&ev.touches[0].pageY) ||
(ev.pageY) ||
(ev.clientY);
},
isLeftClick: function(ev){
if(window.addEventListener){
if(ev.button===0){
return true;
}else if(ev.type==='touchend'&&ev.button===null){
return true;
}}else{
if(ev.button===1){ return true; }}
return false;
},
isRightClick: function(ev){
return (ev.button===2);
},
isMiddleClick: function(ev){
if(window.addEventListener){
return (ev.button===1);
}else{
return (ev.button===4);
}
return false;
},
getCharFromKeyboardEvent: function(event, changeCasing){
var k=event.keyCode;
var c=String.fromCharCode(k);
var shiftOn=event.shiftKey;
if(k >=65&&k <=90){
if(typeof changeCasing==='boolean'){
shiftOn=changeCasing;
}
return (shiftOn) ? c:c.toLowerCase();
}
else if(k >=96&&k <=105){
return String.fromCharCode(48 + (k-96));
}
switch (k){
case 109:   case 189:   return '-';
case 107:   case 187:   return '+';
}
return c;
},
debug: function(){}};
return Ink.extendObj(InkEvent, bean);
});
Ink.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector){
'use strict';
function isArrayIsh(obj){
return obj!=null &&
(!InkElement.isDOMElement(obj)) &&
(InkArray.isArray(obj)||(typeof obj!=='string'&&typeof obj.length==='number'));
}
function toArray(obj){
if(isArrayIsh(obj)){ return obj; }else{ return [obj]; }}
var FormSerialize={
serialize: function(form, options){
options=options||{};
var out={};
var emptyArrayToken={};
var pairs=this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });
if(pairs==null){ return pairs; }
InkArray.forEach(pairs, function (pair){
var phpArray=/\[\]$/.test(pair[0]);
var name=pair[0].replace(/\[\]$/, '');
var value=pair[1];
var el=pair[2];
if(value===emptyArrayToken){
out[name]=[];
}else if(!(FormSerialize._resultsInArray(el)||phpArray)){
out[name]=value;
}else{
if(name in out){
if(!(out[name] instanceof Array)){
out[name]=[out[name]];
}
out[name].push(value);
}else if(phpArray){
out[name]=[value];
}else{
out[name]=value;
}}
});
return out;
},
asPairs: function (form, options){
var out=[];
options=options||{};
function emit(name, val, el){
if(options.elements){
out.push([name, val, el]);
}else{
out.push([name, val]);
}}
function serializeEl(el){
var elNodeName=el.nodeName.toLowerCase();
var elType=(el.type + '').toLowerCase();
if(elNodeName==='select'&&el.multiple){
var didEmit=false;
InkArray.forEach(Selector.select('option:checked', el), function (thisOption){
emit(el.name, thisOption.value, el);
didEmit=true;
});
if(!didEmit&&'emptyArray' in options){
emit(el.name, options.emptyArray, el);
}}else if(elNodeName==='input'&&(elType==='checkbox'||elType==='radio')&&options.outputUnchecked){
emit(el.name, null, el);
}else{
emit(el.name, el.value, el);
}}
if((form=Ink.i(form))){
var inputs=InkArray.filter(form.elements, function (elm){
return FormSerialize._isSerialized(elm, options);
});
for (var i=0, len=inputs.length; i < len; i++){
serializeEl(inputs[i]);
}
return out;
}
return null;
},
fillIn: function(form, map2){
if(!(form=Ink.i(form))){ return null; }
var pairs;
if(typeof map2==='object'&&!isArrayIsh(map2)){
pairs=FormSerialize._objToPairs(map2);
}else if(isArrayIsh(map2)){
pairs=map2;
}else{
return null;
}
return FormSerialize._fillInPairs(form, pairs);
},
_objToPairs: function (obj){
var pairs=[];
var val;
for (var name in obj) if(obj.hasOwnProperty(name)){
val=toArray(obj[name]);
for (var i=0, len=val.length; i < len; i++){
pairs.push([name, val[i]]);
}
if(len===0){
pairs.push([name, []]);
}}
return pairs;
},
_fillInPairs: function (form, pairs){
pairs=InkArray.groupBy(pairs, {
key: function (pair){ return pair[0].replace(/\[\]$/, ''); },
adjacentGroups: true
});
pairs=InkArray.map(pairs, function (pair){
var values=InkArray.reduce(pair, function (left, right){
return [null, left[1].concat([right[1]])];
}, [null, []])[1];
return [pair[0][0], values];
});
var name;
var inputs;
var values;
for (var i=0, len=pairs.length; i < len; i++){
name=pairs[i][0];
if(name in form){
inputs=form[name];
}else if((name + '[]') in form){
inputs=form[name + '[]'];
name=name + '[]';
}else{
continue;
}
inputs=toArray(inputs);
values=pairs[i][1];
FormSerialize._fillInOne(name, inputs, values);
}},
_fillInOne: function (name, inputs, values){
var firstOne=inputs[0];
var firstNodeName=firstOne.nodeName.toLowerCase();
var firstType=firstOne.getAttribute('type');
firstType=firstType&&firstType.toLowerCase();
var isSelectMulti=firstNodeName==='select'&&InkElement.hasAttribute(firstOne, 'multiple');
if(firstType==='checkbox'||firstType==='radio'){
FormSerialize._fillInBoolean(inputs, values, 'checked');
}else if(isSelectMulti){
FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');
}else{
if(inputs.length!==values.length){
Ink.warn('Form had ' + inputs.length + ' inputs named "' + name + '", but received ' + values.length + ' values.');
}
for (var i=0, len=Math.min(inputs.length, values.length); i < len; i +=1){
inputs[i].value=values[i];
}}
},
_fillInBoolean: function (inputs, values, checkAttr ){
InkArray.forEach(inputs, function (input){
var isChecked=InkArray.inArray(input.value, values);
input[checkAttr]=isChecked;
});
},
_resultsInArray: function (element){
var type=element.getAttribute('type');
var nodeName=element.nodeName.toLowerCase();
return type==='checkbox' ||
(nodeName==='select'&&InkElement.hasAttribute(element, 'multiple'));
},
_isSerialized: function (element, options){
options=options||{};
if(!InkElement.isDOMElement(element)){ return false; }
if(!InkElement.hasAttribute(element, 'name')){ return false; }
var nodeName=element.nodeName.toLowerCase();
if(!nodeName||nodeName==='fieldset'){ return false; }
if(element.type==='checkbox'||element.type==='radio'){
if(options.outputUnchecked){ return true; }
return !!element.checked;
}
return true;
}};
return FormSerialize;
});
Ink.createModule('Ink.Dom.Loaded', 1, [], function(){
'use strict';
var Loaded={
_contexts: [],
run: function(win, fn){
if(!fn){
fn=win;
win=window;
}
var context;
for (var i=0, len=this._contexts.length; i < len; i++){
if(this._contexts[i][0]===win){
context=this._contexts[i][1];
break;
}}
if(!context){
context={
cbQueue: [],
win: win,
doc: win.document,
root: win.document.documentElement,
done: false,
top: true
};
context.handlers={
checkState: Ink.bindEvent(this._checkState, this, context),
poll: Ink.bind(this._poll, this, context)
};
this._contexts.push([win, context]
);
}
var   ael=context.doc.addEventListener;
context.add=ael ? 'addEventListener':'attachEvent';
context.rem=ael ? 'removeEventListener':'detachEvent';
context.pre=ael ? '':'on';
context.det=ael ? 'DOMContentLoaded':'onreadystatechange';
context.wet=context.pre + 'load';
var csf=context.handlers.checkState;
var alreadyLoaded=(
/complete|loaded/.test(context.doc.readyState) &&
context.win.location.toString()!=='about:blank');  // https://code.google.com/p/chromium/issues/detail?id=32357
if(alreadyLoaded){
setTimeout(Ink.bind(function (){
fn.call(context.win, 'lazy');
}, this), 0);
}else{
context.cbQueue.push(fn);
context.doc[context.add](context.det , csf);
context.win[context.add](context.wet , csf);
var frameElement=1;
try{
frameElement=context.win.frameElement;
} catch(e){}
if(!ael&&context.root&&context.root.doScroll){
try {
context.top = !frameElement;
} catch(e){ }
if(context.top){
this._poll(context);
}}
}},
_checkState: function(event, context){
if(!event||(event.type==='readystatechange'&&!/complete|loaded/.test(context.doc.readyState))){
return;
}
var where=(event.type==='load') ? context.win:context.doc;
where[context.rem](context.pre+event.type, context.handlers.checkState, false);
this._ready(context);
},
_poll: function(context){
try {
context.root.doScroll('left');
} catch(e){
return setTimeout(context.handlers.poll, 50);
}
this._ready(context);
},
_ready: function(context){
if(!context.done){
context.done=true;
for (var i=0; i < context.cbQueue.length; ++i){
context.cbQueue[i].call(context.win);
}
context.cbQueue=[];
}}
};
return Loaded;
});
Ink.createModule('Ink.Dom.Selector', 1, [], function(){
'use strict';
var i,
cachedruns,
Expr,
getText,
isXML,
compile,
outermostContext,
recompare,
sortInput,
setDocument,
document,
docElem,
documentIsHTML,
rbuggyQSA,
rbuggyMatches,
matches,
contains,
expando="sizzle" + -(new Date()),
preferredDoc=window.document,
support={},
dirruns=0,
done=0,
classCache=createCache(),
tokenCache=createCache(),
compilerCache=createCache(),
hasDuplicate=false,
sortOrder=function(){ return 0; },
strundefined=typeof undefined,
MAX_NEGATIVE=1 << 31,
arr=[],
pop=arr.pop,
push_native=arr.push,
push=arr.push,
slice=arr.slice,
indexOf=arr.indexOf||function(elem){
var i=0,
len=this.length;
for(; i < len; i++){
if(this[i]===elem){
return i;
}}
return -1;
},
whitespace="[\\x20\\t\\r\\n\\f]",
characterEncoding="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
identifier=characterEncoding.replace("w", "w#"),
operators="([*^$|!~]?=)",
attributes="\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
pseudos=":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace(3, 8) + ")*)|.*)\\)|)",
rtrim=new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
rcomma=new RegExp("^" + whitespace + "*," + whitespace + "*"),
rcombinators=new RegExp("^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*"),
rpseudo=new RegExp(pseudos),
ridentifier=new RegExp("^" + identifier + "$"),
matchExpr={
"ID": new RegExp("^#(" + characterEncoding + ")"),
"CLASS": new RegExp("^\\.(" + characterEncoding + ")"),
"NAME": new RegExp("^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]"),
"TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),
"ATTR": new RegExp("^" + attributes),
"PSEUDO": new RegExp("^" + pseudos),
"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
"*(\\d+)|))" + whitespace + "*\\)|)", "i"),
"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
},
rsibling=/[\x20\t\r\n\f]*[+~]/,
rnative=/^[^{]+\{\s*\[native code/,
rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rinputs=/^(?:input|select|textarea|button)$/i,
rheader=/^h\d$/i,
rescape=/'|\\/g,
rattributeQuotes=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
runescape=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
funescape=function(_, escaped){
var high="0x" + escaped - 0x10000;
return high!==high ?
escaped :
high < 0 ?
String.fromCharCode(high + 0x10000) :
String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
};
try {
push.apply((arr=slice.call(preferredDoc.childNodes)),
preferredDoc.childNodes
);
arr[ preferredDoc.childNodes.length ].nodeType;
} catch(e){
push={ apply: arr.length ?
function(target, els){
push_native.apply(target, slice.call(els));
} :
function(target, els){
var j=target.length,
i=0;
while((target[j++]=els[i++])){}
target.length=j - 1;
}};}
function isNative(fn){
return rnative.test(fn + "");
}
function createCache(){
var cache,
keys=[];
return (cache=function(key, value){
if(keys.push(key +=" ") > Expr.cacheLength){
delete cache[ keys.shift() ];
}
return (cache[ key ]=value);
});
}
function markFunction(fn){
fn[ expando ]=true;
return fn;
}
function assert(fn){
var div=document.createElement("div");
try {
return !!fn(div);
} catch (e){
return false;
} finally {
div=null;
}}
function Sizzle(selector, context, results, seed){
var match, elem, m, nodeType,
i, groups, old, nid, newContext, newSelector;
if(( context ? context.ownerDocument||context:preferredDoc)!==document){
setDocument(context);
}
context=context||document;
results=results||[];
if(!selector||typeof selector!=="string"){
return results;
}
if((nodeType=context.nodeType)!==1&&nodeType!==9){
return [];
}
if(documentIsHTML&&!seed){
if((match=rquickExpr.exec(selector))){
if((m=match[1])){
if(nodeType===9){
elem=context.getElementById(m);
if(elem&&elem.parentNode){
if(elem.id===m){
results.push(elem);
return results;
}}else{
return results;
}}else{
if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m)) &&
contains(context, elem)&&elem.id===m){
results.push(elem);
return results;
}}
}else if(match[2]){
push.apply(results, context.getElementsByTagName(selector) );
return results;
}else if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName){
push.apply(results, context.getElementsByClassName(m) );
return results;
}}
if(support.qsa&&!rbuggyQSA.test(selector)){
old=true;
nid=expando;
newContext=context;
newSelector=nodeType===9&&selector;
if(nodeType===1&&context.nodeName.toLowerCase()!=="object"){
groups=tokenize(selector);
if((old=context.getAttribute("id"))){
nid=old.replace(rescape, "\\$&");
}else{
context.setAttribute("id", nid);
}
nid="[id='" + nid + "'] ";
i=groups.length;
while(i--){
groups[i]=nid + toSelector(groups[i]);
}
newContext=rsibling.test(selector)&&context.parentNode||context;
newSelector=groups.join(",");
}
if(newSelector){
try {
push.apply(results,
newContext.querySelectorAll(newSelector)
);
return results;
} catch(qsaError){
} finally {
if(!old){
context.removeAttribute("id");
}}
}}
}
return select(selector.replace(rtrim, "$1"), context, results, seed);
}
isXML=Sizzle.isXML=function(elem){
var documentElement=elem&&(elem.ownerDocument||elem).documentElement;
return documentElement ? documentElement.nodeName!=="HTML":false;
};
setDocument=Sizzle.setDocument=function(node){
var doc=node ? node.ownerDocument||node:preferredDoc;
if(doc===document||doc.nodeType!==9||!doc.documentElement){
return document;
}
document=doc;
docElem=doc.documentElement;
documentIsHTML = !isXML(doc);
support.getElementsByTagName=assert(function(div){
div.appendChild(doc.createComment(""));
return !div.getElementsByTagName("*").length;
});
support.attributes=assert(function(div){
div.innerHTML="<select></select>";
var type=typeof div.lastChild.getAttribute("multiple");
return type!=="boolean"&&type!=="string";
});
support.getElementsByClassName=assert(function(div){
div.innerHTML="<div class='hidden e'></div><div class='hidden'></div>";
if(!div.getElementsByClassName||!div.getElementsByClassName("e").length){
return false;
}
div.lastChild.className="e";
return div.getElementsByClassName("e").length===2;
});
support.getByName=assert(function(div){
div.id=expando + 0;
div.appendChild(document.createElement("a")).setAttribute("name", expando);
div.appendChild(document.createElement("i")).setAttribute("name", expando);
docElem.appendChild(div);
var pass=doc.getElementsByName &&
doc.getElementsByName(expando).length===2 +
doc.getElementsByName(expando + 0).length;
docElem.removeChild(div);
return pass;
});
support.sortDetached=assert(function(div1){
return div1.compareDocumentPosition &&
(div1.compareDocumentPosition(document.createElement("div")) & 1);
});
Expr.attrHandle=assert(function(div){
div.innerHTML="<a href='#'></a>";
return div.firstChild&&typeof div.firstChild.getAttribute!==strundefined &&
div.firstChild.getAttribute("href")==="#";
}) ?
{} :
{
"href": function(elem){
return elem.getAttribute("href", 2);
},
"type": function(elem){
return elem.getAttribute("type");
}};
if(support.getByName){
Expr.find["ID"]=function(id, context){
if(typeof context.getElementById!==strundefined&&documentIsHTML){
var m=context.getElementById(id);
return m&&m.parentNode ? [m]:[];
}};
Expr.filter["ID"]=function(id){
var attrId=id.replace(runescape, funescape);
return function(elem){
return elem.getAttribute("id")===attrId;
};};
}else{
Expr.find["ID"]=function(id, context){
if(typeof context.getElementById!==strundefined&&documentIsHTML){
var m=context.getElementById(id);
return m ?
m.id===id||typeof m.getAttributeNode!==strundefined&&m.getAttributeNode("id").value===id ?
[m] :
undefined :
[];
}};
Expr.filter["ID"]=function(id){
var attrId=id.replace(runescape, funescape);
return function(elem){
var node=typeof elem.getAttributeNode!==strundefined&&elem.getAttributeNode("id");
return node&&node.value===attrId;
};};
}
Expr.find["TAG"]=support.getElementsByTagName ?
function(tag, context){
if(typeof context.getElementsByTagName!==strundefined){
return context.getElementsByTagName(tag);
}} :
function(tag, context){
var elem,
tmp=[],
i=0,
results=context.getElementsByTagName(tag);
if(tag==="*"){
while((elem=results[i++])){
if(elem.nodeType===1){
tmp.push(elem);
}}
return tmp;
}
return results;
};
Expr.find["NAME"]=support.getByName&&function(tag, context){
if(typeof context.getElementsByName!==strundefined){
return context.getElementsByName(name);
}};
Expr.find["CLASS"]=support.getElementsByClassName&&function(className, context){
if(typeof context.getElementsByClassName!==strundefined&&documentIsHTML){
return context.getElementsByClassName(className);
}};
rbuggyMatches=[];
rbuggyQSA=[ ":focus" ];
if((support.qsa=isNative(doc.querySelectorAll))){
assert(function(div){
div.innerHTML="<select><option selected=''></option></select>";
if(!div.querySelectorAll("[selected]").length){
rbuggyQSA.push("\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)");
}
if(!div.querySelectorAll(":checked").length){
rbuggyQSA.push(":checked");
}});
assert(function(div){
div.innerHTML="<input type='hidden' i=''/>";
if(div.querySelectorAll("[i^='']").length){
rbuggyQSA.push("[*^$]=" + whitespace + "*(?:\"\"|'')");
}
if(!div.querySelectorAll(":enabled").length){
rbuggyQSA.push(":enabled", ":disabled");
}
div.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
});
}
if((support.matchesSelector=isNative((matches=docElem.matchesSelector ||
docElem.mozMatchesSelector ||
docElem.webkitMatchesSelector ||
docElem.oMatchesSelector ||
docElem.msMatchesSelector)))){
assert(function(div){
support.disconnectedMatch=matches.call(div, "div");
matches.call(div, "[s!='']:x");
rbuggyMatches.push("!=", pseudos);
});
}
rbuggyQSA=new RegExp(rbuggyQSA.join("|"));
rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));
contains=isNative(docElem.contains)||docElem.compareDocumentPosition ?
function(a, b){
var adown=a.nodeType===9 ? a.documentElement:a,
bup=b&&b.parentNode;
return a===bup||!!(bup&&bup.nodeType===1&&(
adown.contains ?
adown.contains(bup) :
a.compareDocumentPosition&&a.compareDocumentPosition(bup) & 16
));
} :
function(a, b){
if(b){
while((b=b.parentNode)){
if(b===a){
return true;
}}
}
return false;
};
sortOrder=docElem.compareDocumentPosition ?
function(a, b){
if(a===b){
hasDuplicate=true;
return 0;
}
var compare=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b);
if(compare){
if(compare & 1 ||
(recompare&&b.compareDocumentPosition(a)===compare)){
if(a===doc||contains(preferredDoc, a)){
return -1;
}
if(b===doc||contains(preferredDoc, b)){
return 1;
}
return sortInput ?
(indexOf.call(sortInput, a) - indexOf.call(sortInput, b) ) :
0;
}
return compare & 4 ? -1:1;
}
return a.compareDocumentPosition ? -1:1;
} :
function(a, b){
var cur,
i=0,
aup=a.parentNode,
bup=b.parentNode,
ap=[ a ],
bp=[ b ];
if(a===b){
hasDuplicate=true;
return 0;
}else if(!aup||!bup){
return a===doc ? -1 :
b===doc ? 1 :
aup ? -1 :
bup ? 1 :
0;
}else if(aup===bup){
return siblingCheck(a, b);
}
cur=a;
while((cur=cur.parentNode)){
ap.unshift(cur);
}
cur=b;
while((cur=cur.parentNode)){
bp.unshift(cur);
}
while(ap[i]===bp[i]){
i++;
}
return i ?
siblingCheck(ap[i], bp[i]) :
ap[i]===preferredDoc ? -1 :
bp[i]===preferredDoc ? 1 :
0;
};
return document;
};
Sizzle.matches=function(expr, elements){
return Sizzle(expr, null, null, elements);
};
Sizzle.matchesSelector=function(elem, expr){
if(( elem.ownerDocument||elem)!==document){
setDocument(elem);
}
expr=expr.replace(rattributeQuotes, "='$1']");
if(support.matchesSelector&&documentIsHTML&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&!rbuggyQSA.test(expr)){
try {
var ret=matches.call(elem, expr);
if(ret||support.disconnectedMatch ||
elem.document&&elem.document.nodeType!==11){
return ret;
}} catch(e){}}
return Sizzle(expr, document, null, [elem]).length > 0;
};
Sizzle.contains=function(context, elem){
if(( context.ownerDocument||context)!==document){
setDocument(context);
}
return contains(context, elem);
};
Sizzle.attr=function(elem, name){
var val;
if(( elem.ownerDocument||elem)!==document){
setDocument(elem);
}
if(documentIsHTML){
name=name.toLowerCase();
}
if((val=Expr.attrHandle[ name ])){
return val(elem);
}
if(!documentIsHTML||support.attributes){
return elem.getAttribute(name);
}
return((val=elem.getAttributeNode(name))||elem.getAttribute(name) )&&elem[ name ]===true ?
name :
val&&val.specified ? val.value:null;
};
Sizzle.error=function(msg){
throw new Error("Syntax error, unrecognized expression: " + msg);
};
Sizzle.uniqueSort=function(results){
var elem,
duplicates=[],
j=0,
i=0;
hasDuplicate = !support.detectDuplicates;
recompare = !support.sortDetached;
sortInput = !support.sortStable&&results.slice(0);
results.sort(sortOrder);
if(hasDuplicate){
while((elem=results[i++])){
if(elem===results[ i ]){
j=duplicates.push(i);
}}
while(j--){
results.splice(duplicates[ j ], 1);
}}
return results;
};
function siblingCheck(a, b){
var cur=b&&a,
diff=cur&&(~b.sourceIndex||MAX_NEGATIVE) -(~a.sourceIndex||MAX_NEGATIVE);
if(diff){
return diff;
}
if(cur){
while((cur=cur.nextSibling)){
if(cur===b){
return -1;
}}
}
return a ? 1:-1;
}
function createInputPseudo(type){
return function(elem){
var name=elem.nodeName.toLowerCase();
return name==="input"&&elem.type===type;
};}
function createButtonPseudo(type){
return function(elem){
var name=elem.nodeName.toLowerCase();
return (name==="input"||name==="button")&&elem.type===type;
};}
function createPositionalPseudo(fn){
return markFunction(function(argument){
argument=+argument;
return markFunction(function(seed, matches){
var j,
matchIndexes=fn([], seed.length, argument),
i=matchIndexes.length;
while(i--){
if(seed[ (j=matchIndexes[i]) ]){
seed[j] = !(matches[j]=seed[j]);
}}
});
});
}
getText=Sizzle.getText=function(elem){
var node,
ret="",
i=0,
nodeType=elem.nodeType;
if(!nodeType){
for(; (node=elem[i]); i++){
ret +=getText(node);
}}else if(nodeType===1||nodeType===9||nodeType===11){
if(typeof elem.textContent==="string"){
return elem.textContent;
}else{
for(elem=elem.firstChild; elem; elem=elem.nextSibling){
ret +=getText(elem);
}}
}else if(nodeType===3||nodeType===4){
return elem.nodeValue;
}
return ret;
};
Expr=Sizzle.selectors={
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }},
preFilter: {
"ATTR": function(match){
match[1]=match[1].replace(runescape, funescape);
match[3]=(match[4]||match[5]||"").replace(runescape, funescape);
if(match[2]==="~="){
match[3]=" " + match[3] + " ";
}
return match.slice(0, 4);
},
"CHILD": function(match){
match[1]=match[1].toLowerCase();
if(match[1].slice(0, 3)==="nth"){
if(!match[3]){
Sizzle.error(match[0]);
}
match[4]=+(match[4] ? match[5] + (match[6]||1):2 *(match[3]==="even"||match[3]==="odd") );
match[5]=+(( match[7] + match[8])||match[3]==="odd");
}else if(match[3]){
Sizzle.error(match[0]);
}
return match;
},
"PSEUDO": function(match){
var excess,
unquoted = !match[5]&&match[2];
if(matchExpr["CHILD"].test(match[0]) ){
return null;
}
if(match[4]){
match[2]=match[4];
}else if(unquoted&&rpseudo.test(unquoted) &&
(excess=tokenize(unquoted, true)) &&
(excess=unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)){
match[0]=match[0].slice(0, excess);
match[2]=unquoted.slice(0, excess);
}
return match.slice(0, 3);
}},
filter: {
"TAG": function(nodeName){
if(nodeName==="*"){
return function(){ return true; };}
nodeName=nodeName.replace(runescape, funescape).toLowerCase();
return function(elem){
return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName;
};},
"CLASS": function(className){
var pattern=classCache[ className + " " ];
return pattern ||
(pattern=new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) &&
classCache(className, function(elem){
return pattern.test(elem.className||(typeof elem.getAttribute!==strundefined&&elem.getAttribute("class"))||"");
});
},
"ATTR": function(name, operator, check){
return function(elem){
var result=Sizzle.attr(elem, name);
if(result==null){
return operator==="!=";
}
if(!operator){
return true;
}
result +="";
return operator==="=" ? result===check :
operator==="!=" ? result!==check :
operator==="^=" ? check&&result.indexOf(check)===0 :
operator==="*=" ? check&&result.indexOf(check) > -1 :
operator==="$=" ? check&&result.slice(-check.length)===check :
operator==="~=" ?(" " + result + " ").indexOf(check) > -1 :
operator==="|=" ? result===check||result.slice(0, check.length + 1)===check + "-" :
false;
};},
"CHILD": function(type, what, argument, first, last){
var simple=type.slice(0, 3)!=="nth",
forward=type.slice(-4)!=="last",
ofType=what==="of-type";
return first===1&&last===0 ?
function(elem){
return !!elem.parentNode;
} :
function(elem, context, xml){
var cache, outerCache, node, diff, nodeIndex, start,
dir=simple!==forward ? "nextSibling":"previousSibling",
parent=elem.parentNode,
name=ofType&&elem.nodeName.toLowerCase(),
useCache = !xml&&!ofType;
if(parent){
if(simple){
while(dir){
node=elem;
while((node=node[ dir ])){
if(ofType ? node.nodeName.toLowerCase()===name:node.nodeType===1){
return false;
}}
start=dir=type==="only"&&!start&&"nextSibling";
}
return true;
}
start=[ forward ? parent.firstChild:parent.lastChild ];
if(forward&&useCache){
outerCache=parent[ expando ]||(parent[ expando ]={});
cache=outerCache[ type ]||[];
nodeIndex=cache[0]===dirruns&&cache[1];
diff=cache[0]===dirruns&&cache[2];
node=nodeIndex&&parent.childNodes[ nodeIndex ];
while((node=++nodeIndex&&node&&node[ dir ] ||
(diff=nodeIndex=0)||start.pop())){
if(node.nodeType===1&&++diff&&node===elem){
outerCache[ type ]=[ dirruns, nodeIndex, diff ];
break;
}}
}else if(useCache&&(cache=(elem[ expando ]||(elem[ expando ]={}))[ type ])&&cache[0]===dirruns){
diff=cache[1];
}else{
while((node=++nodeIndex&&node&&node[ dir ] ||
(diff=nodeIndex=0)||start.pop())){
if(( ofType ? node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){
if(useCache){
(node[ expando ]||(node[ expando ]={}))[ type ]=[ dirruns, diff ];
}
if(node===elem){
break;
}}
}}
diff -=last;
return diff===first||(diff % first===0&&diff / first >=0);
}};},
"PSEUDO": function(pseudo, argument){
var args,
fn=Expr.pseudos[ pseudo ]||Expr.setFilters[ pseudo.toLowerCase() ] ||
Sizzle.error("unsupported pseudo: " + pseudo);
if(fn[ expando ]){
return fn(argument);
}
if(fn.length > 1){
args=[ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
markFunction(function(seed, matches){
var idx,
matched=fn(seed, argument),
i=matched.length;
while(i--){
idx=indexOf.call(seed, matched[i]);
seed[ idx ] = !(matches[ idx ]=matched[i]);
}}) :
function(elem){
return fn(elem, 0, args);
};}
return fn;
}},
pseudos: {
"not": markFunction(function(selector){
var input=[],
results=[],
matcher=compile(selector.replace(rtrim, "$1") );
return matcher[ expando ] ?
markFunction(function(seed, matches, context, xml){
var elem,
unmatched=matcher(seed, null, xml, []),
i=seed.length;
while(i--){
if((elem=unmatched[i])){
seed[i] = !(matches[i]=elem);
}}
}) :
function(elem, context, xml){
input[0]=elem;
matcher(input, null, xml, results);
return !results.pop();
};}),
"has": markFunction(function(selector){
return function(elem){
return Sizzle(selector, elem).length > 0;
};}),
"contains": markFunction(function(text){
return function(elem){
return(elem.textContent||elem.innerText||getText(elem) ).indexOf(text) > -1;
};}),
"lang": markFunction(function(lang){
if(!ridentifier.test(lang||"")){
Sizzle.error("unsupported lang: " + lang);
}
lang=lang.replace(runescape, funescape).toLowerCase();
return function(elem){
var elemLang;
do {
if((elemLang=documentIsHTML ?
elem.lang :
elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){
elemLang=elemLang.toLowerCase();
return elemLang===lang||elemLang.indexOf(lang + "-")===0;
}} while((elem=elem.parentNode)&&elem.nodeType===1);
return false;
};}),
"target": function(elem){
var hash=window.location&&window.location.hash;
return hash&&hash.slice(1)===elem.id;
},
"root": function(elem){
return elem===docElem;
},
"focus": function(elem){
return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex);
},
"enabled": function(elem){
return elem.disabled===false;
},
"disabled": function(elem){
return elem.disabled===true;
},
"checked": function(elem){
var nodeName=elem.nodeName.toLowerCase();
return (nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected);
},
"selected": function(elem){
if(elem.parentNode){
elem.parentNode.selectedIndex;
}
return elem.selected===true;
},
"empty": function(elem){
for(elem=elem.firstChild; elem; elem=elem.nextSibling){
if(elem.nodeName > "@"||elem.nodeType===3||elem.nodeType===4){
return false;
}}
return true;
},
"parent": function(elem){
return !Expr.pseudos["empty"](elem);
},
"header": function(elem){
return rheader.test(elem.nodeName);
},
"input": function(elem){
return rinputs.test(elem.nodeName);
},
"button": function(elem){
var name=elem.nodeName.toLowerCase();
return name==="input"&&elem.type==="button"||name==="button";
},
"text": function(elem){
var attr;
return elem.nodeName.toLowerCase()==="input" &&
elem.type==="text" &&
((attr=elem.getAttribute("type"))==null||attr.toLowerCase()===elem.type);
},
"first": createPositionalPseudo(function(){
return [ 0 ];
}),
"last": createPositionalPseudo(function(matchIndexes, length){
return [ length - 1 ];
}),
"eq": createPositionalPseudo(function(matchIndexes, length, argument){
return [ argument < 0 ? argument + length:argument ];
}),
"even": createPositionalPseudo(function(matchIndexes, length){
var i=0;
for(; i < length; i +=2){
matchIndexes.push(i);
}
return matchIndexes;
}),
"odd": createPositionalPseudo(function(matchIndexes, length){
var i=1;
for(; i < length; i +=2){
matchIndexes.push(i);
}
return matchIndexes;
}),
"lt": createPositionalPseudo(function(matchIndexes, length, argument){
var i=argument < 0 ? argument + length:argument;
for(; --i >=0;){
matchIndexes.push(i);
}
return matchIndexes;
}),
"gt": createPositionalPseudo(function(matchIndexes, length, argument){
var i=argument < 0 ? argument + length:argument;
for(; ++i < length;){
matchIndexes.push(i);
}
return matchIndexes;
})
}};
for(i in { radio: true, checkbox: true, file: true, password: true, image: true }){
Expr.pseudos[ i ]=createInputPseudo(i);
}
for(i in { submit: true, reset: true }){
Expr.pseudos[ i ]=createButtonPseudo(i);
}
function tokenize(selector, parseOnly){
var matched, match, tokens, type,
soFar, groups, preFilters,
cached=tokenCache[ selector + " " ];
if(cached){
return parseOnly ? 0:cached.slice(0);
}
soFar=selector;
groups=[];
preFilters=Expr.preFilter;
while(soFar){
if(!matched||(match=rcomma.exec(soFar))){
if(match){
soFar=soFar.slice(match[0].length)||soFar;
}
groups.push(tokens=[]);
}
matched=false;
if((match=rcombinators.exec(soFar))){
matched=match.shift();
tokens.push({
value: matched,
type: match[0].replace(rtrim, " ")
});
soFar=soFar.slice(matched.length);
}
for(type in Expr.filter){
if((match=matchExpr[ type ].exec(soFar))&&(!preFilters[ type ] ||
(match=preFilters[ type ](match)))){
matched=match.shift();
tokens.push({
value: matched,
type: type,
matches: match
});
soFar=soFar.slice(matched.length);
}}
if(!matched){
break;
}}
return parseOnly ?
soFar.length :
soFar ?
Sizzle.error(selector) :
tokenCache(selector, groups).slice(0);
}
function toSelector(tokens){
var i=0,
len=tokens.length,
selector="";
for(; i < len; i++){
selector +=tokens[i].value;
}
return selector;
}
function addCombinator(matcher, combinator, base){
var dir=combinator.dir,
checkNonElements=base&&dir==="parentNode",
doneName=done++;
return combinator.first ?
function(elem, context, xml){
while((elem=elem[ dir ])){
if(elem.nodeType===1||checkNonElements){
return matcher(elem, context, xml);
}}
} :
function(elem, context, xml){
var data, cache, outerCache,
dirkey=dirruns + " " + doneName;
if(xml){
while((elem=elem[ dir ])){
if(elem.nodeType===1||checkNonElements){
if(matcher(elem, context, xml) ){
return true;
}}
}}else{
while((elem=elem[ dir ])){
if(elem.nodeType===1||checkNonElements){
outerCache=elem[ expando ]||(elem[ expando ]={});
if((cache=outerCache[ dir ])&&cache[0]===dirkey){
if((data=cache[1])===true||data===cachedruns){
return data===true;
}}else{
cache=outerCache[ dir ]=[ dirkey ];
cache[1]=matcher(elem, context, xml)||cachedruns;
if(cache[1]===true){
return true;
}}
}}
}};}
function elementMatcher(matchers){
return matchers.length > 1 ?
function(elem, context, xml){
var i=matchers.length;
while(i--){
if(!matchers[i](elem, context, xml) ){
return false;
}}
return true;
} :
matchers[0];
}
function condense(unmatched, map, filter, context, xml){
var elem,
newUnmatched=[],
i=0,
len=unmatched.length,
mapped=map!=null;
for(; i < len; i++){
if((elem=unmatched[i])){
if(!filter||filter(elem, context, xml) ){
newUnmatched.push(elem);
if(mapped){
map.push(i);
}}
}}
return newUnmatched;
}
function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector){
if(postFilter&&!postFilter[ expando ]){
postFilter=setMatcher(postFilter);
}
if(postFinder&&!postFinder[ expando ]){
postFinder=setMatcher(postFinder, postSelector);
}
return markFunction(function(seed, results, context, xml){
var temp, i, elem,
preMap=[],
postMap=[],
preexisting=results.length,
elems=seed||multipleContexts(selector||"*", context.nodeType ? [ context ]:context, []),
matcherIn=preFilter&&(seed||!selector) ?
condense(elems, preMap, preFilter, context, xml) :
elems,
matcherOut=matcher ?
postFinder||(seed ? preFilter:preexisting||postFilter) ?
[] :
results :
matcherIn;
if(matcher){
matcher(matcherIn, matcherOut, context, xml);
}
if(postFilter){
temp=condense(matcherOut, postMap);
postFilter(temp, [], context, xml);
i=temp.length;
while(i--){
if((elem=temp[i])){
matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ]=elem);
}}
}
if(seed){
if(postFinder||preFilter){
if(postFinder){
temp=[];
i=matcherOut.length;
while(i--){
if((elem=matcherOut[i])){
temp.push((matcherIn[i]=elem));
}}
postFinder(null, (matcherOut=[]), temp, xml);
}
i=matcherOut.length;
while(i--){
if((elem=matcherOut[i]) &&
(temp=postFinder ? indexOf.call(seed, elem):preMap[i]) > -1){
seed[temp] = !(results[temp]=elem);
}}
}}else{
matcherOut=condense(
matcherOut===results ?
matcherOut.splice(preexisting, matcherOut.length) :
matcherOut
);
if(postFinder){
postFinder(null, results, matcherOut, xml);
}else{
push.apply(results, matcherOut);
}}
});
}
function matcherFromTokens(tokens){
var checkContext, matcher, j,
len=tokens.length,
leadingRelative=Expr.relative[ tokens[0].type ],
implicitRelative=leadingRelative||Expr.relative[" "],
i=leadingRelative ? 1:0,
matchContext=addCombinator(function(elem){
return elem===checkContext;
}, implicitRelative, true),
matchAnyContext=addCombinator(function(elem){
return indexOf.call(checkContext, elem) > -1;
}, implicitRelative, true),
matchers=[ function(elem, context, xml){
return(!leadingRelative&&(xml||context!==outermostContext) )||(
(checkContext=context).nodeType ?
matchContext(elem, context, xml) :
matchAnyContext(elem, context, xml) );
} ];
for(; i < len; i++){
if((matcher=Expr.relative[ tokens[i].type ])){
matchers=[ addCombinator(elementMatcher(matchers), matcher) ];
}else{
matcher=Expr.filter[ tokens[i].type ].apply(null, tokens[i].matches);
if(matcher[ expando ]){
j=++i;
for(; j < len; j++){
if(Expr.relative[ tokens[j].type ]){
break;
}}
return setMatcher(
i > 1&&elementMatcher(matchers),
i > 1&&toSelector(tokens.slice(0, i - 1) ).replace(rtrim, "$1"),
matcher,
i < j&&matcherFromTokens(tokens.slice(i, j) ),
j < len&&matcherFromTokens((tokens=tokens.slice(j))),
j < len&&toSelector(tokens)
);
}
matchers.push(matcher);
}}
return elementMatcher(matchers);
}
function matcherFromGroupMatchers(elementMatchers, setMatchers){
var matcherCachedRuns=0,
bySet=setMatchers.length > 0,
byElement=elementMatchers.length > 0,
superMatcher=function(seed, context, xml, results, expandContext){
var elem, j, matcher,
setMatched=[],
matchedCount=0,
i="0",
unmatched=seed&&[],
outermost=expandContext!=null,
contextBackup=outermostContext,
elems=seed||byElement&&Expr.find["TAG"]("*", expandContext&&context.parentNode||context),
dirrunsUnique=(dirruns +=contextBackup==null ? 1:Math.random()||0.1);
if(outermost){
outermostContext=context!==document&&context;
cachedruns=matcherCachedRuns;
}
for(; (elem=elems[i])!=null; i++){
if(byElement&&elem){
j=0;
while((matcher=elementMatchers[j++])){
if(matcher(elem, context, xml) ){
results.push(elem);
break;
}}
if(outermost){
dirruns=dirrunsUnique;
cachedruns=++matcherCachedRuns;
}}
if(bySet){
if((elem = !matcher&&elem)){
matchedCount--;
}
if(seed){
unmatched.push(elem);
}}
}
matchedCount +=i;
if(bySet&&i!==matchedCount){
j=0;
while((matcher=setMatchers[j++])){
matcher(unmatched, setMatched, context, xml);
}
if(seed){
if(matchedCount > 0){
while(i--){
if(!(unmatched[i]||setMatched[i])){
setMatched[i]=pop.call(results);
}}
}
setMatched=condense(setMatched);
}
push.apply(results, setMatched);
if(outermost&&!seed&&setMatched.length > 0 &&
(matchedCount + setMatchers.length) > 1){
Sizzle.uniqueSort(results);
}}
if(outermost){
dirruns=dirrunsUnique;
outermostContext=contextBackup;
}
return unmatched;
};
return bySet ?
markFunction(superMatcher) :
superMatcher;
}
compile=Sizzle.compile=function(selector, group ){
var i,
setMatchers=[],
elementMatchers=[],
cached=compilerCache[ selector + " " ];
if(!cached){
if(!group){
group=tokenize(selector);
}
i=group.length;
while(i--){
cached=matcherFromTokens(group[i]);
if(cached[ expando ]){
setMatchers.push(cached);
}else{
elementMatchers.push(cached);
}}
cached=compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers) );
}
return cached;
};
function multipleContexts(selector, contexts, results){
var i=0,
len=contexts.length;
for(; i < len; i++){
Sizzle(selector, contexts[i], results);
}
return results;
}
function select(selector, context, results, seed){
var i, tokens, token, type, find,
match=tokenize(selector);
if(!seed){
if(match.length===1){
tokens=match[0]=match[0].slice(0);
if(tokens.length > 2&&(token=tokens[0]).type==="ID" &&
context.nodeType===9&&documentIsHTML &&
Expr.relative[ tokens[1].type ]){
context=(Expr.find["ID"](token.matches[0].replace(runescape, funescape), context)||[])[0];
if(!context){
return results;
}
selector=selector.slice(tokens.shift().value.length);
}
i=matchExpr["needsContext"].test(selector) ? 0:tokens.length;
while(i--){
token=tokens[i];
if(Expr.relative[ (type=token.type) ]){
break;
}
if((find=Expr.find[ type ])){
if((seed=find(
token.matches[0].replace(runescape, funescape),
rsibling.test(tokens[0].type)&&context.parentNode||context
))){
tokens.splice(i, 1);
selector=seed.length&&toSelector(tokens);
if(!selector){
push.apply(results, seed);
return results;
}
break;
}}
}}
}
compile(selector, match)(
seed,
context,
!documentIsHTML,
results,
rsibling.test(selector)
);
return results;
}
Expr.pseudos["nth"]=Expr.pseudos["eq"];
function setFilters(){}
setFilters.prototype=Expr.filters=Expr.pseudos;
Expr.setFilters=new setFilters();
support.sortStable=expando.split("").sort(sortOrder).join("")===expando;
setDocument();
[0, 0].sort(sortOrder);
support.detectDuplicates=hasDuplicate;
/*if(typeof define==="function"&&define.amd){
define(function(){ return Sizzle; });
}else{
window.Sizzle=Sizzle;
}*/
return {
select:          Sizzle,
matches:         Sizzle.matches,
matchesSelector: Sizzle.matchesSelector
};});//(window);
Ink.createModule('Ink.Util.Array', '1', [], function(){
'use strict';
var arrayProto=Array.prototype;
var InkArray={
isArray: Array.isArray||function (testedObject){
return {}.toString.call(testedObject)==='[object Array]';
},
groupBy: function (arr, options){
options=options||{};
var latestKey;
function outKey(item){
if(typeof options.key==='function'){
return options.key(item);
}else if(typeof options.key==='string'){
return item[options.key];
}else{
return item;
}}
function newGroup(key){
var ret=options.pairs ? [key, []]:[];
groups.push(ret);
keys.push(key);
return ret;
}
var keys=[];
var groups=[];
for (var i=0, len=arr.length; i < len; i++){
latestKey=outKey(arr[i]);
var pushTo;
if(options.adjacentGroups){
if(keys[keys.length - 1]===latestKey){
pushTo=groups[groups.length - 1];
}else{
pushTo=newGroup(latestKey);
}}else{
pushTo=groups[InkArray.keyValue(latestKey, keys, true)]||newGroup(latestKey);
}
if(!options.pairs){
pushTo.push(arr[i]);
}else{
pushTo[1].push(arr[i]);
}}
return groups;
},
reduce: function (array, callback, initial){
if(arrayProto.reduce){
return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));
}
var t=Object(array), len=t.length >>> 0, k=0, value;
if(arguments.length >=3){
value=initial;
}else{
while(k < len&&!(k in t)) k++;
if(k >=len)
throw new TypeError('Reduce of empty array with no initial value');
value=t[ k++ ];
}
for(; k < len ; k++){
if(k in t){
value=callback(value, t[k], k, t);
}}
return value;
},
inArray: function(value, arr){
if(typeof arr==='object'){
for (var i=0, f=arr.length; i < f; ++i){
if(arr[i]===value){
return true;
}}
}
return false;
},
sortMulti: function(arr, key){
if(typeof arr==='undefined'||arr.constructor!==Array){ return false; }
if(typeof key!=='string'){ return arr.sort(); }
if(arr.length > 0){
if(typeof(arr[0][key])==='undefined'){ return false; }
arr.sort(function(a, b){
var x=a[key];
var y=b[key];
return ((x < y) ? -1:((x > y) ? 1:0));
});
}
return arr;
},
keyValue: function(value, arr, first){
if(typeof value!=='undefined'&&typeof arr==='object'&&this.inArray(value, arr)){
var aKeys=[];
for (var i=0, f=arr.length; i < f; ++i){
if(arr[i]===value){
if(typeof first!=='undefined'&&first===true){
return i;
}else{
aKeys.push(i);
}}
}
return aKeys;
}
return false;
},
shuffle: function(arr){
if(typeof(arr)!=='undefined'&&arr.constructor!==Array){ return false; }
var total=arr.length,
tmp1=false,
rnd=false;
while (total--){
rnd=Math.floor(Math.random() * (total + 1));
tmp1=arr[total];
arr[total]=arr[rnd];
arr[rnd]=tmp1;
}
return arr;
},
forEach: function(array, callback, context){
if(arrayProto.forEach){
return arrayProto.forEach.call(array, callback, context);
}
for (var i=0, len=array.length >>> 0; i < len; i++){
callback.call(context, array[i], i, array);
}},
forEachObj: function(obj, callback, context){
InkArray.forEach(InkArray.keys(obj), function (item){
callback.call(context||null, obj[item], item, obj);
});
},
each: function (){
InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));
},
map: function (array, mapFn, context){
if(arrayProto.map){
return arrayProto.map.call(array, mapFn, context);
}
var mapped=new Array(len);
for (var i=0, len=array.length >>> 0; i < len; i++){
mapped[i]=mapFn.call(context, array[i], i, array);
}
return mapped;
},
filter: function (array, test, context){
if(arrayProto.filter){
return arrayProto.filter.call(array, test, context);
}
var filtered=[],
val=null;
for (var i=0, len=array.length; i < len; i++){
val=array[i];
if(test.call(context, val, i, array)){
filtered.push(val);
}}
return filtered;
},
some: function(arr, cb, context){
if(arr===null){
throw new TypeError('First argument is invalid.');
}
var t=Object(arr);
var len=t.length >>> 0;
if(typeof cb!=="function"){ throw new TypeError('Second argument must be a function.'); }
for (var i=0; i < len; i++){
if(i in t&&cb.call(context, t[i], i, t)){ return true; }}
return false;
},
intersect: function(arr1, arr2){
if(!arr1||!arr2||arr1 instanceof Array===false||arr2 instanceof Array===false){
return [];
}
var shared=[];
for (var i=0, I=arr1.length; i<I; ++i){
for (var j=0, J=arr2.length; j < J; ++j){
if(arr1[i]===arr2[j]){
shared.push(arr1[i]);
}}
}
return shared;
},
convert: function(arr){
return arrayProto.slice.call(arr||[], 0);
},
unique: function(arr){
if(!Array.prototype.lastIndexOf){
var newArr=[];
InkArray.forEach(InkArray.convert(arr), function(i){
if(!InkArray.inArray(i,newArr)){
newArr.push(i);
}});
return newArr;
}
return InkArray.filter(InkArray.convert(arr), function (e, i, arr){
return arr.lastIndexOf(e)===i;
});
},
range: function range(start, stop, step){
if(arguments.length===1){
stop=start;
start=0;
}
if(!step){
step=1;
}
var r=[];
var x;
if(step > 0){
for (x=start; x < stop; x +=step){
r.push(x);
}}else{
for (x=start; x > stop; x +=step){
r.push(x);
}}
return r;
},
insert: function(arr, idx, value){
arr.splice(idx, 0, value);
},
keys: function (obj){
if(Object.keys){
return Object.keys(obj);
}
var ret=[];
for (var k in obj) if(obj.hasOwnProperty(k)){
ret.push(k);
}
return ret;
},
remove: function(arr, from, rLen){
var output=[];
for(var i=0, iLen=arr.length; i < iLen; i++){
if(i >=from&&i < from + rLen){
continue;
}
output.push(arr[i]);
}
return output;
}};
return InkArray;
});
Ink.createModule('Ink.Util.BinPack', '1', [], function(){
'use strict';
var Packer=function(w, h){
this.init(w, h);
};
Packer.prototype={
init: function(w, h){
this.root={ x: 0, y: 0, w: w, h: h };},
fit: function(blocks){
var n, node, block;
for (n=0; n < blocks.length; ++n){
block=blocks[n];
if(node=this.findNode(this.root, block.w, block.h)){
block.fit=this.splitNode(node, block.w, block.h);
}}
},
findNode: function(root, w, h){
if(root.used){
return this.findNode(root.right, w, h)||this.findNode(root.down, w, h);
}
else if((w <=root.w)&&(h <=root.h)){
return root;
}else{
return null;
}},
splitNode: function(node, w, h){
node.used=true;
node.down={ x: node.x,     y: node.y + h, w: node.w,     h: node.h - h };
node.right={ x: node.x + w, y: node.y,     w: node.w - w, h: h          };
return node;
}};
var GrowingPacker=function(){};
GrowingPacker.prototype={
fit: function(blocks){
var n, node, block, len=blocks.length;
var w=len > 0 ? blocks[0].w:0;
var h=len > 0 ? blocks[0].h:0;
this.root={ x: 0, y: 0, w: w, h: h };
for (n=0; n < len ; n++){
block=blocks[n];
if(node=this.findNode(this.root, block.w, block.h)){
block.fit=this.splitNode(node, block.w, block.h);
}else{
block.fit=this.growNode(block.w, block.h);
}}
},
findNode: function(root, w, h){
if(root.used){
return this.findNode(root.right, w, h)||this.findNode(root.down, w, h);
}
else if((w <=root.w)&&(h <=root.h)){
return root;
}else{
return null;
}},
splitNode: function(node, w, h){
node.used=true;
node.down={ x: node.x,     y: node.y + h, w: node.w,     h: node.h - h };
node.right={ x: node.x + w, y: node.y,     w: node.w - w, h: h          };
return node;
},
growNode: function(w, h){
var canGrowDown=(w <=this.root.w);
var canGrowRight=(h <=this.root.h);
var shouldGrowRight=canGrowRight&&(this.root.h >=(this.root.w + w));
var shouldGrowDown=canGrowDown&&(this.root.w >=(this.root.h + h));
if(shouldGrowRight){
return this.growRight(w, h);
}
else if(shouldGrowDown){
return this.growDown(w, h);
}
else if(canGrowRight){
return this.growRight(w, h);
}
else if(canGrowDown){
return this.growDown(w, h);
}else{
return null;
}},
growRight: function(w, h){
this.root={
used: true,
x: 0,
y: 0,
w: this.root.w + w,
h: this.root.h,
down: this.root,
right: { x: this.root.w, y: 0, w: w, h: this.root.h }};
var node;
if(node=this.findNode(this.root, w, h)){
return this.splitNode(node, w, h);
}else{
return null;
}},
growDown: function(w, h){
this.root={
used: true,
x: 0,
y: 0,
w: this.root.w,
h: this.root.h + h,
down:  { x: 0, y: this.root.h, w: this.root.w, h: h },
right: this.root
};
var node;
if(node=this.findNode(this.root, w, h)){
return this.splitNode(node, w, h);
}else{
return null;
}}
};
var sorts={
random:  function(){ return Math.random() - 0.5; },
w:       function(a, b){ return b.w - a.w; },
h:       function(a, b){ return b.h - a.h; },
a:       function(a, b){ return b.area - a.area; },
max:     function(a, b){ return Math.max(b.w, b.h) - Math.max(a.w, a.h); },
min:     function(a, b){ return Math.min(b.w, b.h) - Math.min(a.w, a.h); },
height:  function(a, b){ return sorts.msort(a, b, ['h', 'w']);               },
width:   function(a, b){ return sorts.msort(a, b, ['w', 'h']);               },
area:    function(a, b){ return sorts.msort(a, b, ['a', 'h', 'w']);          },
maxside: function(a, b){ return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },
msort:   function(a, b, criteria){ 
var diff, n;
for (n=0; n < criteria.length; ++n){
diff=sorts[ criteria[n] ](a, b);
if(diff!==0){
return diff;
}}
return 0;
}};
var toString=function(){
return [this.w, ' x ', this.h].join('');
};
var BinPack={
binPack: function(o){
var i, f, bl;
for (i=0, f=o.blocks.length; i < f; ++i){
bl=o.blocks[i];
if(! ('area' in bl)){
bl.area=bl.w * bl.h;
}}
var packer=o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]):new GrowingPacker();
if(!o.sorter){ o.sorter='maxside'; }
o.blocks.sort(sorts[ o.sorter ]);
packer.fit(o.blocks);
var dims2=[packer.root.w, packer.root.h];
var fitted=[];
var unfitted=[];
for (i=0, f=o.blocks.length; i < f; ++i){
bl=o.blocks[i];
if(bl.fit){
fitted.push(bl);
}else{
bl.toString=toString;
unfitted.push(bl);
}}
var area=dims2[0] * dims2[1];
var fit=0;
for (i=0, f=fitted.length; i < f; ++i){
bl=fitted[i];
fit +=bl.area;
}
return {
dimensions: dims2,
filled:     fit / area,
blocks:     o.blocks,
fitted:     fitted,
unfitted:   unfitted
};}};
return BinPack;
});
Ink.createModule('Ink.Util.Cookie', '1', [], function(){
'use strict';
var Cookie={
get: function(name){
var cookie=document.cookie||false;
var _Cookie={};
if(cookie){
cookie=cookie.replace(new RegExp("; ", "g"), ';');
var aCookie=cookie.split(';');
var aItem=[];
if(aCookie.length > 0){
for(var i=0; i < aCookie.length; i++){
aItem=aCookie[i].split('=');
if(aItem.length===2){
_Cookie[aItem[0]]=decodeURIComponent(aItem[1]);
}}
}
if(name){
if(typeof(_Cookie[name])!=='undefined'){
return _Cookie[name];
}else{
return null;
}}
}
return _Cookie;
},
set: function(name, value, expires, path, domain, secure){
var sName;
if(!name||value===false||typeof(name)==='undefined'||typeof(value)==='undefined'){
return false;
}else{
sName=name+'='+encodeURIComponent(value);
}
var sExpires=false;
var sPath=false;
var sDomain=false;
var sSecure=false;
if(expires&&typeof(expires)!=='undefined'&&!isNaN(expires)){
var oDate=new Date();
var sDate=(parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));
var nDate=new Date(sDate);
var expiresString=nDate.toGMTString();
var re=new RegExp("([^\\s]+)(\\s\\d\\d)\\s(\\w\\w\\w)\\s(.*)");
expiresString=expiresString.replace(re, "$1$2-$3-$4");
sExpires='expires='+expiresString;
}else{
if(typeof(expires)!=='undefined'&&!isNaN(expires)&&Number(parseInt(expires, 10))===0){
sExpires='';
}else{
sExpires='expires=Thu, 01-Jan-2037 00:00:01 GMT';
}}
if(path&&typeof(path)!=='undefined'){
sPath='path='+path;
}else{
sPath='path=/';
}
if(domain){
sDomain='domain='+domain;
}else if(/\./.test(window.location.hostname)){
sDomain='domain='+window.location.hostname;
}
if(secure&&typeof(secure)!=='undefined'){
sSecure=secure;
}else{
sSecure=false;
}
document.cookie=sName +
'; ' + sExpires +
'; ' + sPath +
(sDomain ? '; ' + sDomain:'') +
'; ' + sSecure;
},
remove: function(cookieName, path, domain){
var expiresDate=-1;
this.set(cookieName, 'deleted', expiresDate, path, domain);
}};
return Cookie;
});
Ink.createModule('Ink.Util.Date', '1', [], function(){
'use strict';
var InkDate={
_months: function(index){
var _m=['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
return _m[index];
},
_iMonth:function(month){
if(Number(month) ){ return +month - 1; }
return {
'janeiro':0  ,
'jan':0  ,
'fevereiro':1  ,
'fev':1  ,
'março':2  ,
'mar':2  ,
'abril':3  ,
'abr':3  ,
'maio':4  ,
'mai':4  ,
'junho':5  ,
'jun':5  ,
'julho':6  ,
'jul':6  ,
'agosto':7  ,
'ago':7  ,
'setembro':8  ,
'set':8  ,
'outubro':9  ,
'out':9  ,
'novembro':10 ,
'nov':10 ,
'dezembro':11 ,
'dez':11
}[ month.toLowerCase() ];
} ,
_wDays: function(index){
var _d=['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];
return _d[index];
},
_iWeek: function(week){
if(Number(week) ){ return +week||7; }
return {
'segunda':1  ,
'seg':1  ,
'terça':2  ,
'ter':2  ,
'quarta':3  ,
'qua':3  ,
'quinta':4  ,
'qui':4  ,
'sexta':5  ,
'sex':5  ,
'sábado':6  ,
'sáb':6  ,
'domingo':7  ,
'dom':7
}[ week.toLowerCase() ];
},
_daysInMonth: function(_m,_y){
var nDays;
if(_m===1||_m===3||_m===5||_m===7||_m===8||_m===10||_m===12){
nDays=31;
}
else if(_m===4||_m===6||_m===9||_m===11){
nDays=30;
}else{
if((_y%400===0)||(_y%4===0&&_y%100!==0)){
nDays=29;
}else{
nDays=28;
}}
return nDays;
},
get: function(format, _date){
if(typeof(format)==='undefined'||format===''){
format="Y-m-d";
}
var iFormat=format.split("");
var result=new Array(iFormat.length);
var escapeChar="\\";
var jsDate;
if(typeof(_date)==='undefined'){
jsDate=new Date();
}else if(typeof(_date)==='number'){
jsDate=new Date(_date*1000);
}else{
jsDate=new Date(_date);
}
var jsFirstDay, jsThisDay, jsHour;
for (var i=0; i < iFormat.length; i++){
switch(iFormat[i]){
case escapeChar:
result[i]=iFormat[i+1];
i++;
break;
case "d":   
var jsDay=jsDate.getDate();
result[i]=(String(jsDay).length > 1) ? jsDay:"0" + jsDay;
break;
case "D":   
result[i]=this._wDays(jsDate.getDay()).substring(0, 3);
break;
case "j":  
result[i]=jsDate.getDate();
break;
case "l":   
result[i]=this._wDays(jsDate.getDay());
break;
case "N":  
result[i]=jsDate.getDay()||7;
break;
case "S":  
var temp=jsDate.getDate();
var suffixes=["st", "nd", "rd"];
var suffix="";
if(temp >=11&&temp <=13){
result[i]="th";
}else{
result[i]=(suffix=suffixes[String(temp).substr(-1) - 1]) ? (suffix):("th");
}
break;
case "w":    
result[i]=jsDate.getDay();
break;
case "z":    
jsFirstDay=Date.UTC(jsDate.getFullYear(), 0, 0);
jsThisDay=Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());
result[i]=Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));
break;
case "W":    
var jsYearStart=new Date(jsDate.getFullYear() , 0 , 1);
jsFirstDay=jsYearStart.getDay()||7;
var days=Math.floor(( jsDate - jsYearStart) /(24 * 60 * 60 * 1000) + 1);
result[ i ]=Math.ceil(( days -(8 - jsFirstDay) ) / 7) + 1;
break;
case "F":   
result[i]=this._months(jsDate.getMonth());
break;
case "m":   
var jsMonth=String(jsDate.getMonth() + 1);
result[i]=(jsMonth.length > 1) ? jsMonth:"0" + jsMonth;
break;
case "M":   
result[i]=this._months(jsDate.getMonth()).substring(0,3);
break;
case "n":   
result[i]=jsDate.getMonth() + 1;
break;
case "t":   
result[i]=this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());
break;
case "L":   
var jsYear=jsDate.getFullYear();
result[i]=(jsYear % 4) ? false:((jsYear % 100) ?  true:((jsYear % 400) ? false:true) );
break;
case "o":  
throw '"o" not implemented!';
case "Y":  
result[i]=jsDate.getFullYear();
break;
case "y":  
result[i]=String(jsDate.getFullYear()).substring(2);
break;
case "a":   
result[i]=(jsDate.getHours() < 12) ? "am":"pm";
break;
case "A":   
result[i]=(jsDate.getHours < 12) ? "AM":"PM";
break;
case "B":  
throw '"B" not implemented!';
case "g":   
jsHour=jsDate.getHours();
result[i]=(jsHour <=12) ? jsHour:(jsHour - 12);
break;
case "G":   
result[i]=String(jsDate.getHours());
break;
case "h":   
jsHour=String(jsDate.getHours());
jsHour=(jsHour <=12) ? jsHour:(jsHour - 12);
result[i]=(jsHour.length > 1) ? jsHour:"0" + jsHour;
break;
case "H":   
jsHour=String(jsDate.getHours());
result[i]=(jsHour.length > 1) ? jsHour:"0" + jsHour;
break;
case "i":   
var jsMinute=String(jsDate.getMinutes());
result[i]=(jsMinute.length > 1) ? jsMinute:"0" + jsMinute;
break;
case "s":   
var jsSecond=String(jsDate.getSeconds());
result[i]=(jsSecond.length > 1) ? jsSecond:"0" + jsSecond;
break;
case "u":  
throw '"u" not implemented!';
case "e": 
throw '"e" not implemented!';
case "I":   /*  "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */
jsFirstDay=new Date(jsDate.getFullYear(), 0, 1);
result[i]=(jsDate.getTimezoneOffset()!==jsFirstDay.getTimezoneOffset()) ? (1):(0);
break;
case "O":  
var jsMinZone=jsDate.getTimezoneOffset();
var jsMinutes=jsMinZone % 60;
jsHour=String(((jsMinZone - jsMinutes) / 60) * -1);
if(jsHour.charAt(0)!=="-"){
jsHour="+" + jsHour;
}
jsHour=(jsHour.length===3) ? (jsHour):(jsHour.replace(/([+\-])(\d)/, "$1" + 0 + "$2"));
result[i]=jsHour + jsMinutes + "0";
break;
case "P": 
throw '"P" not implemented!';
case "T": 
throw '"T" not implemented!';
case "Z": 
result[i]=jsDate.getTimezoneOffset() * 60;
break;
case "c": 
throw '"c" not implemented!';
case "r": 
var jsDayName=this._wDays(jsDate.getDay()).substr(0, 3);
var jsMonthName=this._months(jsDate.getMonth()).substr(0, 3);
result[i]=jsDayName + ", " + jsDate.getDate() + " " + jsMonthName + this.get(" Y H:i:s O",jsDate);
break;
case "U":  
result[i]=Math.floor(jsDate.getTime() / 1000);
break;
default:
result[i]=iFormat[i];
}}
return result.join('');
},
set:function(format , str_date){
if(typeof str_date==='undefined'){ return ; }
if(typeof format==='undefined'||format===''){ format="Y-m-d"; }
var iFormat=format.split("");
var result=new Array(iFormat.length);
var escapeChar="\\";
var mList;
var objIndex={
year:undefined ,
month:undefined ,
day:undefined ,
dayY:undefined ,
dayW:undefined ,
week:undefined ,
hour:undefined ,
hourD:undefined ,
min:undefined ,
sec:undefined ,
msec:undefined ,
ampm:undefined ,
diffM:undefined ,
diffH:undefined ,
date:undefined
};
var matches=0;
for(var i=0; i < iFormat.length; i++){
switch(iFormat[ i ]){
case escapeChar:
result[i]=iFormat[ i + 1 ];
i++;
break;
case "d":   
result[ i ]='(\\d{2})';
objIndex.day={ original:i , match:matches++ };
break;
case "j":  
result[ i ]='(\\d{1,2})';
objIndex.day={ original:i , match:matches++ };
break;
case "D":   
result[ i ]='([\\wá]{3})';
objIndex.dayW={ original:i , match:matches++ };
break;
case "l":   
result[i]='([\\wá]{5,7})';
objIndex.dayW={ original:i , match:matches++ };
break;
case "N":  
result[ i ]='(\\d)';
objIndex.dayW={ original:i , match:matches++ };
break;
case "w":    
result[ i ]='(\\d)';
objIndex.dayW={ original:i , match:matches++ };
break;
case "S":  
result[ i ]='\\w{2}';
break;
case "z":    
result[ i ]='(\\d{1,3})';
objIndex.dayY={ original:i , match:matches++ };
break;
case "W":    
result[ i ]='(\\d{1,2})';
objIndex.week={ original:i , match:matches++ };
break;
case "F":   
result[ i ]='([\\wç]{4,9})';
objIndex.month={ original:i , match:matches++ };
break;
case "M":   
result[ i ]='(\\w{3})';
objIndex.month={ original:i , match:matches++ };
break;
case "m":   
result[ i ]='(\\d{2})';
objIndex.month={ original:i , match:matches++ };
break;
case "n":   
result[ i ]='(\\d{1,2})';
objIndex.month={ original:i , match:matches++ };
break;
case "t":   
result[ i ]='\\d{2}';
break;
case "L":   
result[ i ]='\\w{4,5}';
break;
case "o":  
throw '"o" not implemented!';
case "Y":  
result[ i ]='(\\d{4})';
objIndex.year={ original:i , match:matches++ };
break;
case "y":  
result[ i ]='(\\d{2})';
if(typeof objIndex.year==='undefined'||iFormat[ objIndex.year.original ]!=='Y'){
objIndex.year={ original:i , match:matches++ };}
break;
case "a":   
result[ i ]='(am|pm)';
objIndex.ampm={ original:i , match:matches++ };
break;
case "A":   
result[ i ]='(AM|PM)';
objIndex.ampm={ original:i , match:matches++ };
break;
case "B":  
throw '"B" not implemented!';
case "g":   
result[ i ]='(\\d{1,2})';
objIndex.hourD={ original:i , match:matches++ };
break;
case "G":   
result[ i ]='(\\d{1,2})';
objIndex.hour={ original:i , match:matches++ };
break;
case "h":   
result[ i ]='(\\d{2})';
objIndex.hourD={ original:i , match:matches++ };
break;
case "H":   
result[ i ]='(\\d{2})';
objIndex.hour={ original:i , match:matches++ };
break;
case "i":   
result[ i ]='(\\d{2})';
objIndex.min={ original:i , match:matches++ };
break;
case "s":   
result[ i ]='(\\d{2})';
objIndex.sec={ original:i , match:matches++ };
break;
case "u":  
throw '"u" not implemented!';
case "e": 
throw '"e" not implemented!';
case "I":   /*  "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */
result[i]='\\d';
break;
case "O":  
result[ i ]='([-+]\\d{4})';
objIndex.diffH={ original:i , match:matches++ };
break;
case "P": 
throw '"P" not implemented!';
case "T": 
throw '"T" not implemented!';
case "Z": 
result[ i ]='(\\-?\\d{1,5})';
objIndex.diffM={ original:i , match:matches++ };
break;
case "c": 
throw '"c" not implemented!';
case "r": 
result[ i ]='([\\wá]{3}, \\d{1,2} \\w{3} \\d{4} \\d{2}:\\d{2}:\\d{2} [+\\-]\\d{4})';
objIndex.date={ original:i , match:matches++ };
break;
case "U":  
result[ i ]='(\\d{1,13})';
objIndex.date={ original:i , match:matches++ };
break;
default:
result[ i ]=iFormat[ i ];
}}
var pattr=new RegExp(result.join(''));
try {
mList=str_date.match(pattr);
if(!mList){ return; }}
catch(e){ return ; }
var _haveDatetime=typeof objIndex.date!=='undefined';
var _haveYear=typeof objIndex.year!=='undefined';
var _haveYDay=typeof objIndex.dayY!=='undefined';
var _haveDay=typeof objIndex.day!=='undefined';
var _haveMonth=typeof objIndex.month!=='undefined';
var _haveMonthDay=_haveMonth&&_haveDay;
var _haveOnlyDay  = !_haveMonth&&_haveDay;
var _haveWDay=typeof objIndex.dayW!=='undefined';
var _haveWeek=typeof objIndex.week!=='undefined';
var _haveWeekWDay=_haveWeek&&_haveWDay;
var _haveOnlyWDay = !_haveWeek&&_haveWDay;
var _validDate=_haveYDay||_haveMonthDay||!_haveYear&&_haveOnlyDay||_haveWeekWDay||!_haveYear&&_haveOnlyWDay;
var _noDate       = !_haveYear&&!_haveYDay&&!_haveDay&&!_haveMonth&&!_haveWDay&&!_haveWeek;
var _haveHour12=typeof objIndex.hourD!=='undefined'&&typeof objIndex.ampm!=='undefined';
var _haveHour24=typeof objIndex.hour!=='undefined';
var _haveHour=_haveHour12||_haveHour24;
var _haveMin=typeof objIndex.min!=='undefined';
var _haveSec=typeof objIndex.sec!=='undefined';
var _haveMSec=typeof objIndex.msec!=='undefined';
var _haveMoreM    = !_noDate||_haveHour;
var _haveMoreS=_haveMoreM||_haveMin;
var _haveDiffM=typeof objIndex.diffM!=='undefined';
var _haveDiffH=typeof objIndex.diffH!=='undefined';
var hour;
var min;
if(_haveDatetime){
if(iFormat[ objIndex.date.original ]==='U'){
return new Date( +mList[ objIndex.date.match + 1 ] * 1000);
}
var dList=mList[ objIndex.date.match + 1 ].match(/\w{3}, (\d{1,2}) (\w{3}) (\d{4}) (\d{2}):(\d{2}):(\d{2}) ([+\-]\d{4})/);
hour=+dList[ 4 ] + ( +dList[ 7 ].slice(0 , 3) );
min=+dList[ 5 ] +(dList[ 7 ].slice(0 , 1) + dList[ 7 ].slice(3) ) / 100 * 60;
return new Date(dList[ 3 ] , this._iMonth(dList[ 2 ]) , dList[ 1 ] , hour  , min , dList[ 6 ]);
}
var _d=new Date();
var year;
var month;
var day;
var sec;
var msec;
var gmt;
if(!_validDate&&!_noDate){ return ; }
if(_validDate){
if(_haveYear){
var _y=_d.getFullYear() - 50 + '';
year=mList[ objIndex.year.match + 1 ];
if(iFormat[ objIndex.year.original ]==='y'){
year=+_y.slice(0 , 2) +(year >=(_y).slice(2) ? 0:1) + year;
}}else{
year=_d.getFullYear();
}
if(_haveYDay){
month=0;
day=mList[ objIndex.dayY.match + 1 ];
}else if(_haveDay){
if(_haveMonth){
month=this._iMonth(mList[ objIndex.month.match + 1 ]);
}else{
month=_d.getMonth();
}
day=mList[ objIndex.day.match + 1 ];
}else{
month=0;
var week;
if(_haveWeek){
week=mList[ objIndex.week.match + 1 ];
}else{
week=this.get('W' , _d);
}
day=(week - 2) * 7 +(8 -(( new Date(year , 0 , 1) ).getDay()||7) ) + this._iWeek(mList[ objIndex.week.match + 1 ]);
}
if(month===0&&day > 31){
var aux=new Date(year , month , day);
month=aux.getMonth();
day=aux.getDate();
}}else{
year=_d.getFullYear();
month=_d.getMonth();
day=_d.getDate();
}
if(_haveHour12){ hour=+mList[ objIndex.hourD.match + 1 ] +(mList[ objIndex.ampm.match + 1 ]==='pm' ? 12:0); }
else if(_haveHour24){ hour=mList[ objIndex.hour.match + 1 ]; }
else if(_noDate){ hour=_d.getHours(); }else{ hour='00'; }
if(_haveMin){ min=mList[ objIndex.min.match + 1 ]; }
else if(!_haveMoreM){ min=_d.getMinutes(); }else{ min='00'; }
if(_haveSec){ sec=mList[ objIndex.sec.match + 1 ]; }
else if(!_haveMoreS){ sec=_d.getSeconds(); }else{ sec='00'; }
if(_haveMSec){ msec=mList[ objIndex.msec.match + 1 ]; }else{ msec='000'; }
if(_haveDiffH){ gmt=mList[ objIndex.diffH.match + 1 ]; }
else if(_haveDiffM){ gmt=String(-1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100).replace(/^(\d)/ , '+$1').replace(/(^[\-+])(\d{3}$)/ , '$10$2'); }else{ gmt='+0000'; }
return new Date(year, month, day, hour, min, sec);
}};
return InkDate;
});
Ink.createModule('Ink.Util.Dumper', '1', [], function(){
'use strict';
var Dumper={
_tab: '\xA0\xA0\xA0\xA0',
_formatParam: function(param){
var formated='';
switch(typeof(param)){
case 'string':
formated='(string) '+param;
break;
case 'number':
formated='(number) '+param;
break;
case 'boolean':
formated='(boolean) '+param;
break;
case 'object':
if(param!==null){
if(param.constructor===Array){
formated='Array \n{\n' + this._outputFormat(param, 0) + '\n}';
}else{
formated='Object \n{\n' + this._outputFormat(param, 0) + '\n}';
}}else{
formated='null';
}
break;
default:
formated=false;
}
return formated;
},
_getTabs: function(numberOfTabs){
var tabs='';
for(var _i=0; _i < numberOfTabs; _i++){
tabs +=this._tab;
}
return tabs;
},
_outputFormat: function(param, indent){
var formated='';
var _typeof=false;
for(var key in param){
if(param[key]!==null){
if(typeof(param[key])==='object'&&(param[key].constructor===Array||param[key].constructor===Object)){
if(param[key].constructor===Array){
_typeof='Array';
}else if(param[key].constructor===Object){
_typeof='Object';
}
formated +=this._tab + this._getTabs(indent) + '[' + key + ']=> <b>'+_typeof+'</b>\n';
formated +=this._tab + this._getTabs(indent) + '{\n';
formated +=this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\n';
}else if(param[key].constructor===Function){
continue;
}else{
formated=formated + this._tab + this._getTabs(indent) + '[' + key + ']=> ' + param[key] + '\n';
}}else{
formated=formated + this._tab + this._getTabs(indent) + '[' + key + ']=> null \n';
}}
return formated;
},
printDump: function(param, target){
if(!target||typeof(target)==='undefined'){
document.write('<pre>'+this._formatParam(param)+'</pre>');
}else{
if(typeof(target)==='string'){
document.getElementById(target).innerHTML='<pre>' + this._formatParam(param) + '</pre>';
}else if(typeof(target)==='object'){
target.innerHTML='<pre>'+this._formatParam(param)+'</pre>';
}else{
throw "TARGET must be an element or an element ID";
}}
},
returnDump: function(param){
return this._formatParam(param);
},
alertDump: function(param){
window.alert(this._formatParam(param).replace(/(<b>)(Array|Object)(<\/b>)/g, "$2"));
},
windowDump: function(param){
var dumperwindow='dumperwindow_'+(Math.random() * 10000);
var win=window.open('',
dumperwindow,
'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'
);
win.document.open();
win.document.write('<pre>'+this._formatParam(param)+'</pre>');
win.document.close();
win.focus();
}};
return Dumper;
});
Ink.createModule('Ink.Util.I18n', '1', [], function (){
'use strict';
var pattrText=/\{(?:(\{.*?})|(?:%s:)?(\d+)|(?:%s)?|([\w-]+))}/g;
var funcOrVal=function(ret , args){
if(typeof ret==='function'){
return ret.apply(this, args);
}else if(typeof ret!=='undefined'){
return ret;
}else{
return '';
}};
var I18n=function(dict , lang , testMode){
if(!(this instanceof I18n) ){ return new I18n(dict , lang , testMode); }
this.reset()
.lang(lang)
.testMode(testMode)
.append(dict||{ } , lang);
};
I18n.prototype={
reset: function(){
this._dicts=[ ];
this._dict={ };
this._testMode=false;
this._lang=this._gLang;
return this;
},
clone: function (){
var theClone=new I18n();
for (var i=0, len=this._dicts.length; i < len; i++){
theClone.append(this._dicts[i]);
}
theClone.testMode(this.testMode());
theClone.lang(this.lang());
return theClone;
},
append: function(dict){
this._dicts.push(dict);
this._dict=Ink.extendObj(this._dict , dict[ this._lang ]);
return this;
},
lang: function(lang){
if(!arguments.length){ return this._lang; }
if(lang&&this._lang!==lang){
this._lang=lang;
this._dict={ };
for(var i=0, l=this._dicts.length; i < l; i++){
this._dict=Ink.extendObj(this._dict , this._dicts[ i ][ lang ]||{ });
}}
return this;
},
testMode: function(newTestMode){
if(!arguments.length){ return !!this._testMode; }
if(newTestMode!==undefined){ this._testMode = !!newTestMode; }
return this;
},
getKey: function(key){
var ret;
var gLang=this._gLang;
var lang=this._lang;
if(key in this._dict){
ret=this._dict[ key ];
}else{
I18n.langGlobal(lang);
ret=this._gDict[ key ];
I18n.langGlobal(gLang);
}
return ret;
},
text: function(str ){
if(typeof str!=='string'){ return; }
var pars=Array.prototype.slice.call(arguments , 1);
var idx=0;
var isObj=typeof pars[ 0 ]==='object';
var original=this.getKey(str);
if(original===undefined){ original=this._testMode ? '[' + str + ']':str; }
if(typeof original==='number'){ original +=''; }
if(typeof original==='string'){
original=original.replace(pattrText , function(m , $1 , $2 , $3){
var ret =
$1            ? $1 :
$2            ? pars[ $2 -(isObj ? 0:1) ] :
$3&&pars[0] ? pars[ 0 ][ $3 ]||'' :
pars[ (idx++) +(isObj ? 1:0) ];
return funcOrVal(ret , [idx].concat(pars));
});
return original;
}
return (
typeof original==='function' ? original.apply(this , pars) :
original instanceof Array      ? funcOrVal(original[ pars[ 0 ] ] , pars) :
typeof original==='object'   ? funcOrVal(original[ pars[ 0 ] ] , pars) :
'');
},
ntext: function(strSin , strPlur , count){
var pars=Array.prototype.slice.apply(arguments);
var original;
if(pars.length===2&&typeof strPlur==='number'){
original=this.getKey(strSin);
if(!(original instanceof Array) ){ return ''; }
pars.splice(0 , 1);
original=original[ strPlur===1 ? 0:1 ];
}else{
pars.splice(0 , 2);
original=count===1 ? strSin:strPlur;
}
return this.text.apply(this , [ original ].concat(pars) );
},
ordinal: function(num){
if(num===undefined){ return ''; }
var lastDig=+num.toString().slice(-1);
var ordDict=this.getKey('_ordinals');
if(ordDict===undefined){ return ''; }
if(typeof ordDict==='string'){ return ordDict; }
var ret;
if(typeof ordDict==='function'){
ret=ordDict(num , lastDig);
if(typeof ret==='string'){ return ret; }}
if('exceptions' in ordDict){
ret=typeof ordDict.exceptions==='function' ? ordDict.exceptions(num , lastDig) :
num in ordDict.exceptions                ? funcOrVal(ordDict.exceptions[ num ] , [num , lastDig]) :
undefined;
if(typeof ret==='string'){ return ret; }}
if('byLastDigit' in ordDict){
ret=typeof ordDict.byLastDigit==='function' ? ordDict.byLastDigit(lastDig , num) :
lastDig in ordDict.byLastDigit            ? funcOrVal(ordDict.byLastDigit[ lastDig ] , [lastDig , num]) :
undefined;
if(typeof ret==='string'){ return ret; }}
if('default' in ordDict){
ret=funcOrVal(ordDict['default'] , [ num , lastDig ]);
if(typeof ret==='string'){ return ret; }}
return '';
},
alias: function(){
var ret=Ink.bind(I18n.prototype.text     , this);
ret.ntext=Ink.bind(I18n.prototype.ntext    , this);
ret.append=Ink.bind(I18n.prototype.append   , this);
ret.ordinal=Ink.bind(I18n.prototype.ordinal  , this);
ret.testMode=Ink.bind(I18n.prototype.testMode , this);
return ret;
}};
I18n.reset=function(){
I18n.prototype._gDicts=[ ];
I18n.prototype._gDict={ };
I18n.prototype._gLang='pt_PT';
};
I18n.reset();
I18n.appendGlobal=function(dict , lang){
if(lang){
if(!(lang in dict) ){
var obj={ };
obj[ lang ]=dict;
dict=obj;
}
if(lang!==I18n.prototype._gLang){ I18n.langGlobal(lang); }}
I18n.prototype._gDicts.push(dict);
Ink.extendObj(I18n.prototype._gDict , dict[ I18n.prototype._gLang ]);
};
I18n.langGlobal=function(lang){
if(!arguments.length){ return I18n.prototype._gLang; }
if(lang&&I18n.prototype._gLang!==lang){
I18n.prototype._gLang=lang;
I18n.prototype._gDict={ };
for(var i=0, l=I18n.prototype._gDicts.length; i < l; i++){
Ink.extendObj(I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ]||{ });
}}
};
return I18n;
});
Ink.createModule('Ink.Util.Json', '1', [], function(){
'use strict';
var function_call=Function.prototype.call;
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
function twoDigits(n){
var r='' + n;
if(r.length===1){
return '0' + r;
}else{
return r;
}}
var dateToISOString=Date.prototype.toISOString ?
Ink.bind(function_call, Date.prototype.toISOString) :
function(date){
return date.getUTCFullYear() +
'-' + twoDigits(date.getUTCMonth() + 1) +
'-' + twoDigits(date.getUTCDate()) +
'T' + twoDigits(date.getUTCHours()) +
':' + twoDigits(date.getUTCMinutes()) +
':' + twoDigits(date.getUTCSeconds()) +
'.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) +
'Z';
};
var InkJson={
_nativeJSON: window.JSON||null,
_convertToUnicode: false,
_escape: function (theString){
var _m={ '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"',  '\\': '\\\\' };
if(/["\\\x00-\x1f]/.test(theString)){
theString=theString.replace(/([\x00-\x1f\\"])/g, function(a, b){
var c=_m[b];
if(c){
return c;
}
c=b.charCodeAt();
return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
});
}
return theString;
},
_toUnicode: function (theString){
if(!this._convertToUnicode){
return this._escape(theString);
}else{
var unicodeString='';
var inInt=false;
var theUnicode=false;
var i=0;
var total=theString.length;
while(i < total){
inInt=theString.charCodeAt(i);
if((inInt >=32&&inInt <=126) ||
inInt===8 ||
inInt===9 ||
inInt===10 ||
inInt===12 ||
inInt===13 ||
inInt===32 ||
inInt===34 ||
inInt===47 ||
inInt===58 ||
inInt===92){
if(inInt===34||inInt===92||inInt===47){
theUnicode='\\'+theString.charAt(i);
}else if(inInt===8){
theUnicode='\\b';
}else if(inInt===9){
theUnicode='\\t';
}else if(inInt===10){
theUnicode='\\n';
}else if(inInt===12){
theUnicode='\\f';
}else if(inInt===13){
theUnicode='\\r';
}else{
theUnicode=theString.charAt(i);
}}else{
if(this._convertToUnicode){
theUnicode=theString.charCodeAt(i).toString(16)+''.toUpperCase();
while (theUnicode.length < 4){
theUnicode='0' + theUnicode;
}
theUnicode='\\u' + theUnicode;
}else{
theUnicode=theString.charAt(i);
}}
unicodeString +=theUnicode;
i++;
}
return unicodeString;
}},
_stringifyValue: function(param){
if(typeof param==='string'){
return '"' + this._toUnicode(param) + '"';
}else if(typeof param==='number'&&(isNaN(param)||!isFinite(param))){
return 'null';
}else if(typeof param==='undefined'||param===null){
return 'null';
}else if(typeof param.toJSON==='function'){
var t=param.toJSON();
if(typeof t==='string'){
return '"' + this._escape(t) + '"';
}else{
return this._escape(t.toString());
}}else if(typeof param==='number'||typeof param==='boolean'){
return '' + param;
}else if(typeof param==='function'){
return 'null';
}else if(param.constructor===Date){
return '"' + this._escape(dateToISOString(param)) + '"';
}else if(param.constructor===Array){
var arrayString='';
for (var i=0, len=param.length; i < len; i++){
if(i > 0){
arrayString +=',';
}
arrayString +=this._stringifyValue(param[i]);
}
return '[' + arrayString + ']';
}else{
var objectString='';
for (var k in param){
if({}.hasOwnProperty.call(param, k)){
if(objectString!==''){
objectString +=',';
}
objectString +='"' + this._escape(k) + '": ' + this._stringifyValue(param[k]);
}}
return '{' + objectString + '}';
}},
stringify: function(input, convertToUnicode){
this._convertToUnicode = !!convertToUnicode;
if(!this._convertToUnicode&&this._nativeJSON){
return this._nativeJSON.stringify(input);
}
return this._stringifyValue(input);
},
parse: function (text, reviver){
var j;
function walk(holder, key){
var k, v, value=holder[key];
if(value&&typeof value==='object'){
for (k in value){
if(Object.prototype.hasOwnProperty.call(value, k)){
v=walk(value, k);
if(v!==undefined){
value[k]=v;
}else{
delete value[k];
}}
}}
return reviver.call(holder, key, value);
}
text=String(text);
cx.lastIndex=0;
if(cx.test(text)){
text=text.replace(cx, function (a){
return '\\u' +
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
});
}
if(/^[\],:{}\s]*$/
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))){
j=eval('(' + text + ')');
return typeof reviver==='function' ?
walk({'': j}, '') :
j;
}
throw new SyntaxError('JSON.parse');
}};
return InkJson;
});
Ink.createModule('Ink.Util.String', '1', [], function(){
'use strict';
var InkUtilString={
_chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',
'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',
'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',
'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',
'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',
'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\"','ß','<',
'>','¢','£','¤','¥','¦','§','¨','©','ª','«',
'¬','\xad','®','¯','°','±','²','³','´','µ','¶',
'·','¸','¹','º','»','¼','½','¾'],
_entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',
'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',
'iacute','icirc','iuml','eth','ntilde','ograve','oacute',
'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',
'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',
'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',
'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',
'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',
'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',
'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',
'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',
'sup2','sup3','acute','micro','para','middot','cedil','sup1',
'ordm','raquo','frac14','frac12','frac34'],
_accentedChars:['à','á','â','ã','ä','å',
'è','é','ê','ë',
'ì','í','î','ï',
'ò','ó','ô','õ','ö',
'ù','ú','û','ü',
'ç','ñ',
'À','Á','Â','Ã','Ä','Å',
'È','É','Ê','Ë',
'Ì','Í','Î','Ï',
'Ò','Ó','Ô','Õ','Ö',
'Ù','Ú','Û','Ü',
'Ç','Ñ'],
_accentedRemovedChars:['a','a','a','a','a','a',
'e','e','e','e',
'i','i','i','i',
'o','o','o','o','o',
'u','u','u','u',
'c','n',
'A','A','A','A','A','A',
'E','E','E','E',
'I','I','I','I',
'O','O','O','O','O',
'U','U','U','U',
'C','N'],
_htmlUnsafeChars:{'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;',"'":'&apos;'},
ucFirst: function(string, firstWordOnly){
var replacer=firstWordOnly ? /(^|\s)(\w)(\S{2,})/:/(^|\s)(\w)(\S{2,})/g;
return string ? String(string).replace(replacer, function(_, $1, $2, $3){
return $1 + $2.toUpperCase() + $3.toLowerCase();
}):string;
},
trim: function(string){
if(typeof string==='string'){
return string.replace(/^\s+|\s+$|\n+$/g, '');
}
return string;
},
stripTags: function(string, allowed){
if(allowed&&typeof allowed==='string'){
var aAllowed=InkUtilString.trim(allowed).split(',');
var aNewAllowed=[];
var cleanedTag=false;
for(var i=0; i < aAllowed.length; i++){
if(InkUtilString.trim(aAllowed[i])!==''){
cleanedTag=InkUtilString.trim(aAllowed[i].replace(/(<|\>)/g, '').replace(/\s/, ''));
aNewAllowed.push('(<'+cleanedTag+'\\s[^>]+>|<(\\s|\\/)?(\\s|\\/)?'+cleanedTag+'>)');
}}
var strAllowed=aNewAllowed.join('|');
var reAllowed=new RegExp(strAllowed, "i");
var aFoundTags=string.match(new RegExp("<[^>]*>", "g"));
for(var j=0; j < aFoundTags.length; j++){
if(!aFoundTags[j].match(reAllowed)){
string=string.replace((new RegExp(aFoundTags[j], "gm")), '');
}}
return string;
}else{
return string.replace(/<[^\>]+\>/g, '');
}},
htmlEntitiesEncode: function(string){
if(string&&string.replace){
var re=false;
for (var i=0; i < InkUtilString._chars.length; i++){
re=new RegExp(InkUtilString._chars[i], "gm");
string=string.replace(re, '&' + InkUtilString._entities[i] + ';');
}}
return string;
},
htmlEntitiesDecode: function(string){
if(string&&string.replace){
var re=false;
for (var i=0; i < InkUtilString._entities.length; i++){
re=new RegExp("&"+InkUtilString._entities[i]+";", "gm");
string=string.replace(re, InkUtilString._chars[i]);
}
string=string.replace(/&#[^;]+;?/g, function($0){
if($0.charAt(2)==='x'){
return String.fromCharCode(parseInt($0.substring(3), 16));
}else{
return String.fromCharCode(parseInt($0.substring(2), 10));
}});
}
return string;
},
utf8Encode: function(string){
string=string.replace(/\r\n/g,"\n");
var utfstring="";
for (var n=0; n < string.length; n++){
var c=string.charCodeAt(n);
if(c < 128){
utfstring +=String.fromCharCode(c);
}
else if((c > 127)&&(c < 2048)){
utfstring +=String.fromCharCode((c >> 6) | 192);
utfstring +=String.fromCharCode((c & 63) | 128);
}else{
utfstring +=String.fromCharCode((c >> 12) | 224);
utfstring +=String.fromCharCode(((c >> 6) & 63) | 128);
utfstring +=String.fromCharCode((c & 63) | 128);
}}
return utfstring;
},
shortString: function(str,n){
var words=str.split(' ');
var resultstr='';
for(var i=0; i < words.length; i++){
if((resultstr + words[i] + ' ').length>=n){
resultstr +='&hellip;';
break;
}
resultstr +=words[i] + ' ';
}
return resultstr;
},
truncateString: function(str, length){
if(str.length - 1 > length){
return str.substr(0, length - 1) + "\u2026";
}else{
return str;
}},
utf8Decode: function(string){
var ret="";
var i=0, c=0, c2=0, c3=0;
while(i < string.length){
c=string.charCodeAt(i);
if(c < 128){
ret +=String.fromCharCode(c);
i++;
}
else if((c > 191)&&(c < 224)){
c2=string.charCodeAt(i+1);
ret +=String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i +=2;
}else{
c2=string.charCodeAt(i+1);
c3=string.charCodeAt(i+2);
ret +=String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i +=3;
}}
return ret;
},
removeAccentedChars: function(string){
var newString=string;
var re=false;
for (var i=0; i < InkUtilString._accentedChars.length; i++){
re=new RegExp(InkUtilString._accentedChars[i], "gm");
newString=newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');
}
return newString;
},
substrCount: function(haystack,needle){
return haystack ? haystack.split(needle).length - 1:0;
},
evalJSON: function(strJSON, sanitize){
if((typeof sanitize==='undefined'||sanitize===null)||InkUtilString.isJSON(strJSON)){
try {
if(typeof(JSON)!=="undefined"&&typeof(JSON.parse)!=='undefined'){
return JSON.parse(strJSON);
}
return eval('('+strJSON+')');
} catch(e){
throw new Error('ERROR: Bad JSON string...');
}}
},
isJSON: function(str){
str=str.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
},
htmlEscapeUnsafe: function(str){
var chars=InkUtilString._htmlUnsafeChars;
return str!==null ? String(str).replace(/[<>&'"]/g,function(c){return chars[c];}):str;
},
normalizeWhitespace: function(str){
return str!==null ? InkUtilString.trim(String(str).replace(/\s+/g,' ')):str;
},
toUnicode: function(str){
if(typeof str==='string'){
var unicodeString='';
var inInt=false;
var theUnicode=false;
var total=str.length;
var i=0;
while(i < total){
inInt=str.charCodeAt(i);
if((inInt >=32&&inInt <=126) ||
inInt===8 ||
inInt===9 ||
inInt===10 ||
inInt===12 ||
inInt===13 ||
inInt===32 ||
inInt===34 ||
inInt===47 ||
inInt===58 ||
inInt===92){
if(inInt===8){
theUnicode='\\b';
}else if(inInt===9){
theUnicode='\\t';
}else if(inInt===10){
theUnicode='\\n';
}else if(inInt===12){
theUnicode='\\f';
}else if(inInt===13){
theUnicode='\\r';
}else{
theUnicode=str.charAt(i);
}}else{
theUnicode=str.charCodeAt(i).toString(16)+''.toUpperCase();
while (theUnicode.length < 4){
theUnicode='0' + theUnicode;
}
theUnicode='\\u' + theUnicode;
}
unicodeString +=theUnicode;
i++;
}
return unicodeString;
}},
escape: function(c){
var hex=(c).charCodeAt(0).toString(16).split('');
if(hex.length < 3){
while (hex.length < 2){ hex.unshift('0'); }
hex.unshift('x');
}else{
while (hex.length < 4){ hex.unshift('0'); }
hex.unshift('u');
}
hex.unshift('\\');
return hex.join('');
},
unescape: function(es){
var idx=es.lastIndexOf('0');
idx=idx===-1 ? 2:Math.min(idx, 2);
var hexNum=es.substring(idx);
var num=parseInt(hexNum, 16);
return String.fromCharCode(num);
},
escapeText: function(txt, whiteList){
if(whiteList===undefined){
whiteList=['[', ']', '\'', ','];
}
var txt2=[];
var c, C;
for (var i=0, f=txt.length; i < f; ++i){
c=txt[i];
C=c.charCodeAt(0);
if(C < 32||C > 126&&whiteList.indexOf(c)===-1){
c=InkUtilString.escape(c);
}
txt2.push(c);
}
return txt2.join('');
},
escapedCharRegex: /(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})/g,
unescapeText: function(txt){
var m;
while (m=InkUtilString.escapedCharRegex.exec(txt)){
m=m[0];
txt=txt.replace(m, InkUtilString.unescape(m));
InkUtilString.escapedCharRegex.lastIndex=0;
}
return txt;
},
strcmp: function(str1, str2){
return ((str1===str2) ? 0:((str1 > str2) ? 1:-1));
},
packetize: function(str, maxLen){
var len=str.length;
var parts=new Array(Math.ceil(len / maxLen));
var chars=str.split('');
var sz, i=0;
while (len){
sz=Math.min(maxLen, len);
parts[i++]=chars.splice(0, sz).join('');
len -=sz;
}
return parts;
}};
return InkUtilString;
});
Ink.createModule('Ink.Util.Url', '1', [], function(){
'use strict';
var Url={
_keyStr:'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
getUrl: function(){
return window.location.href;
},
genQueryString: function(uri, params){
var hasQuestionMark=uri.indexOf('?')!==-1;
var sep, pKey, pValue, parts=[uri];
for (pKey in params){
if(params.hasOwnProperty(pKey)){
if(!hasQuestionMark){
sep='?';
hasQuestionMark=true;
}else{
sep='&';
}
pValue=params[pKey];
if(typeof pValue!=='number'&&!pValue){
pValue='';
}
parts=parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);
}}
return parts.join('');
},
getQueryString: function(str){
var url;
if(str&&typeof(str)!=='undefined'){
url=str;
}else{
url=this.getUrl();
}
var aParams={};
if(url.match(/\?(.+)/i)){
var queryStr=url.replace(/^(.*)\?([^\#]+)(\#(.*))?/g, "$2");
if(queryStr.length > 0){
var aQueryStr=queryStr.split(/[;&]/);
for(var i=0; i < aQueryStr.length; i++){
var pairVar=aQueryStr[i].split('=');
aParams[decodeURIComponent(pairVar[0])]=(typeof(pairVar[1])!=='undefined'&&pairVar[1]) ? decodeURIComponent(pairVar[1]):false;
}}
}
return aParams;
},
getAnchor: function(str){
var url;
if(str&&typeof(str)!=='undefined'){
url=str;
}else{
url=this.getUrl();
}
var anchor=false;
if(url.match(/#(.+)/)){
anchor=url.replace(/([^#]+)#(.*)/, "$2");
}
return anchor;
},
getAnchorString: function(string){
var url;
if(string&&typeof(string)!=='undefined'){
url=string;
}else{
url=this.getUrl();
}
var aParams={};
if(url.match(/#(.+)/i)){
var anchorStr=url.replace(/^([^#]+)#(.*)?/g, "$2");
if(anchorStr.length > 0){
var aAnchorStr=anchorStr.split(/[;&]/);
for(var i=0; i < aAnchorStr.length; i++){
var pairVar=aAnchorStr[i].split('=');
aParams[decodeURIComponent(pairVar[0])]=(typeof(pairVar[1])!=='undefined'&&pairVar[1]) ? decodeURIComponent(pairVar[1]):false;
}}
}
return aParams;
},
parseUrl: function(url){
var aURL={};
if(url&&typeof url==='string'){
if(url.match(/^([^:]+):\/\//i)){
var re=/^([^:]+):\/\/([^\/]*)\/?([^\?#]*)\??([^#]*)#?(.*)/i;
if(url.match(re)){
aURL.scheme=url.replace(re, "$1");
aURL.host=url.replace(re, "$2");
aURL.path='/'+url.replace(re, "$3");
aURL.query=url.replace(re, "$4")||false;
aURL.fragment=url.replace(re, "$5")||false;
}}else{
var re1=new RegExp("^([^\\?]+)\\?([^#]+)#(.*)", "i");
var re2=new RegExp("^([^\\?]+)\\?([^#]+)#?", "i");
var re3=new RegExp("^([^\\?]+)\\??", "i");
if(url.match(re1)){
aURL.scheme=false;
aURL.host=false;
aURL.path=url.replace(re1, "$1");
aURL.query=url.replace(re1, "$2");
aURL.fragment=url.replace(re1, "$3");
}else if(url.match(re2)){
aURL.scheme=false;
aURL.host=false;
aURL.path=url.replace(re2, "$1");
aURL.query=url.replace(re2, "$2");
aURL.fragment=false;
}else if(url.match(re3)){
aURL.scheme=false;
aURL.host=false;
aURL.path=url.replace(re3, "$1");
aURL.query=false;
aURL.fragment=false;
}}
if(aURL.host){
var regPort=/^(.*?)\\:(\\d+)$/i;
if(aURL.host.match(regPort)){
var tmpHost1=aURL.host;
aURL.host=tmpHost1.replace(regPort, "$1");
aURL.port=tmpHost1.replace(regPort, "$2");
}else{
aURL.port=false;
}
if(aURL.host.match(/@/i)){
var tmpHost2=aURL.host;
aURL.host=tmpHost2.split('@')[1];
var tmpUserPass=tmpHost2.split('@')[0];
if(tmpUserPass.match(/\:/)){
aURL.user=tmpUserPass.split(':')[0];
aURL.pass=tmpUserPass.split(':')[1];
}else{
aURL.user=tmpUserPass;
aURL.pass=false;
}}
}}
return aURL;
},
format: function (urlObj){
var protocol='';
var host='';
var path='';
var frag='';
var query='';
if(typeof urlObj.protocol==='string'){
protocol=urlObj.protocol + '//';  // here it comes with the colon
}else if(typeof urlObj.scheme==='string'){
protocol=urlObj.scheme + '://';
}
host=urlObj.host||urlObj.hostname||'';
path=urlObj.path||'';
if(typeof urlObj.query==='string'){
query=urlObj.query;
}else if(typeof urlObj.search==='string'){
query=urlObj.search.replace(/^\?/, '');
}
if(typeof urlObj.fragment==='string'){
frag=urlObj.fragment;
}else if(typeof urlObj.hash==='string'){
frag=urlObj.hash.replace(/#$/, '');
}
return [
protocol,
host,
path,
query&&'?' + query,
frag&&'#' + frag
].join('');
},
currentScriptElement: function(match){
var aScripts=document.getElementsByTagName('script');
if(typeof(match)==='undefined'){
if(aScripts.length > 0){
return aScripts[(aScripts.length - 1)];
}else{
return false;
}}else{
var curScript=false;
var re=new RegExp(""+match+"", "i");
for(var i=0, total=aScripts.length; i < total; i++){
curScript=aScripts[i];
if(re.test(curScript.src)){
return curScript;
}}
return false;
}}
};
return Url;
});
Ink.createModule('Ink.Util.Validator', '1', [], function(){
'use strict';
var Validator={
_countryCodes:[
'AO',
'CV',
'MZ',
'TL',
'PT'
],
_internacionalPT: 351,
_indicativosPT: {
21: 'lisboa',
22: 'porto',
231: 'mealhada',
232: 'viseu',
233: 'figueira da foz',
234: 'aveiro',
235: 'arganil',
236: 'pombal',
238: 'seia',
239: 'coimbra',
241: 'abrantes',
242: 'ponte de sôr',
243: 'santarém',
244: 'leiria',
245: 'portalegre',
249: 'torres novas',
251: 'valença',
252: 'vila nova de famalicão',
253: 'braga',
254: 'peso da régua',
255: 'penafiel',
256: 'são joão da madeira',
258: 'viana do castelo',
259: 'vila real',
261: 'torres vedras',
262: 'caldas da raínha',
263: 'vila franca de xira',
265: 'setúbal',
266: 'évora',
268: 'estremoz',
269: 'santiago do cacém',
271: 'guarda',
272: 'castelo branco',
273: 'bragança',
274: 'proença-a-nova',
275: 'covilhã',
276: 'chaves',
277: 'idanha-a-nova',
278: 'mirandela',
279: 'moncorvo',
281: 'tavira',
282: 'portimão',
283: 'odemira',
284: 'beja',
285: 'moura',
286: 'castro verde',
289: 'faro',
291: 'funchal, porto santo',
292: 'corvo, faial, flores, horta, pico',
295: 'angra do heroísmo, graciosa, são jorge, terceira',
296: 'ponta delgada, são miguel, santa maria',
91:'rede móvel 91 (Vodafone / Yorn)',
93:'rede móvel 93 (Optimus)',
96:'rede móvel 96 (TMN)',
92:'rede móvel 92 (TODOS)',
707: 'número único',
760: 'número único',
800: 'número grátis',
808: 'chamada local',
30:  'voip'
},
_internacionalCV: 238,
_indicativosCV: {
2: 'fixo',
91: 'móvel 91',
95: 'móvel 95',
97: 'móvel 97',
98: 'móvel 98',
99: 'móvel 99'
},
_internacionalAO: 244,
_indicativosAO: {
2: 'fixo',
91: 'móvel 91',
92: 'móvel 92'
},
_internacionalMZ: 258,
_indicativosMZ: {
2: 'fixo',
82: 'móvel 82',
84: 'móvel 84'
},
_internacionalTL: 670,
_indicativosTL: {
3: 'fixo',
7: 'móvel 7'
},
_characterGroups: {
numbers: ['0-9'],
asciiAlpha: ['a-zA-Z'],
latin1Alpha: ['a-zA-Z', '\u00C0-\u00FF'],
unicodeAlpha: ['a-zA-Z', '\u00C0-\u00FF', '\u0100-\u1FFF', '\u2C00-\uD7FF'],
space: [' '],
dash: ['-'],
underscore: ['_'],
nicknamePunctuation: ['_.-'],
singleLineWhitespace: ['\t '],
newline: ['\n'],
whitespace: ['\t\n\u000B\f\r\u00A0 '],
asciiPunctuation: ['\u0021-\u002F', '\u003A-\u0040', '\u005B-\u0060', '\u007B-\u007E'],
latin1Punctuation: ['\u0021-\u002F', '\u003A-\u0040', '\u005B-\u0060', '\u007B-\u007E', '\u00A1-\u00BF', '\u00D7', '\u00F7'],
unicodePunctuation: ['\u0021-\u002F', '\u003A-\u0040', '\u005B-\u0060', '\u007B-\u007E', '\u00A1-\u00BF', '\u00D7', '\u00F7', '\u2000-\u206F', '\u2E00-\u2E7F', '\u3000-\u303F']
},
createRegExp: function (groups){
var re='^[';
for (var key in groups) if(groups.hasOwnProperty(key)){
if(!(key in Validator._characterGroups)){
throw new Error('group ' + key + ' is not a valid character group');
}else if(groups[key]){
re +=Validator._characterGroups[key].join('');
}}
if(re==='^['){
return new RegExp('$^');
}
return new RegExp(re + ']*?$');
},
checkCharacterGroups: function (s, groups){
return Validator.createRegExp(groups).test(s);
},
unicode: function (s, options){
return Validator.checkCharacterGroups(s, Ink.extendObj({
unicodeAlpha: true}, options));
},
latin1: function (s, options){
return Validator.checkCharacterGroups(s, Ink.extendObj({
latin1Alpha: true}, options));
},
ascii: function (s, options){
return Validator.checkCharacterGroups(s, Ink.extendObj({
asciiAlpha: true}, options));
},
number: function (numb, options){
numb=numb + '';
options=Ink.extendObj({
decimalSep: '.',
thousandSep: '',
negative: true,
decimalPlaces: null,
maxDigits: null,
max: null,
min: null,
returnNumber: false
}, options||{});
if(options.thousandSep){
numb=numb.replace(new RegExp('\\' + options.thousandSep, 'g'), '');
options.thousandSep='';
return Validator.number(numb, options);
}
if(options.negative===false){
options.min=0;
options.negative=true;
return Validator.number(numb, options);
}
if(options.decimalSep!=='.'){
numb=numb.replace(new RegExp('\\' + options.decimalSep, 'g'), '.');
}
if(!/^(-)?(\d+)?(\.\d+)?$/.test(numb)||numb===''){
return false;
}
var split;
if(options.decimalSep&&numb.indexOf(options.decimalSep)!==-1){
split=numb.split(options.decimalSep);
if(options.decimalPlaces!==null &&
split[1].length > options.decimalPlaces){
return false;
}}else{
split=['' + numb, ''];
}
if(options.maxDigits!==null){
if(split[0].replace(/-/g, '').length > options.maxDigits){
return split;
}}
var ret=parseFloat(numb);
if(options.maxExcl!==null&&ret >=options.maxExcl ||
options.minExcl!==null&&ret <=options.minExcl){
return false;
}
if(options.max!==null&&ret > options.max ||
options.min!==null&&ret < options.min){
return false;
}
if(options.returnNumber){
return ret;
}else{
return true;
}},
/**
* Checks if a year is Leap "Bissexto"
*
* @method _isLeapYear
* @param {Number} year Year to be checked
* @return {Boolean} True if it is a leap year.
* @private
* @static
* @example
*     Ink.requireModules(['Ink.Util.Validator_1'], function(InkValidator){
*         console.log(InkValidator._isLeapYear(2004) );
*         console.log(InkValidator._isLeapYear(2006) );
*     });
*/
_isLeapYear: function(year){
var yearRegExp=/^\d{4}$/;
if(yearRegExp.test(year)){
return ((year%4) ? false: ((year%100) ? true:((year%400)? false:true)));
}
return false;
},
_dateParsers: {
'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/},
'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\d{4})(\/)(\d{1,2})(\/)(\d{1,2})$/},
'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\d{2})(\-)(\d{1,2})(\-)(\d{1,2})$/},
'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\d{2})(\/)(\d{1,2})(\/)(\d{1,2})$/},
'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\d{1,2})(\-)(\d{1,2})(\-)(\d{4})$/},
'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\d{1,2})(\/)(\d{1,2})(\/)(\d{4})$/},
'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\d{1,2})(\-)(\d{1,2})(\-)(\d{2})$/},
'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\d{1,2})(\/)(\d{1,2})(\/)(\d{2})$/}},
/**
* Gets the number of days in a given month of a given year
*
* @method _daysInMonth
* @param {Number} _m Month (1 to 12)
* @param {Number} _y Year
* @return {Number} Returns the number of days in a given month of a given year
* @private
* @static
* @example
*     Ink.requireModules(['Ink.Util.Validator_1'], function(InkValidator){
*         console.log(InkValidator._daysInMonth(2, 2004) );
*         console.log(InkValidator._daysInMonth(2, 2006) );
*     });
*/
_daysInMonth: function(_m,_y){
var nDays=0;
_m=parseInt(_m, 10);
_y=parseInt(_y, 10);
if(_m===1||_m===3||_m===5||_m===7||_m===8||_m===10||_m===12){
nDays=31;
}else if(_m===4||_m===6||_m===9||_m===11){
nDays=30;
}else if(_m===2){
if((_y%400===0)||(_y%4===0&&_y%100!==0)){
nDays=29;
}else{
nDays=28;
}}
return nDays;
},
/**
* Checks if a date is valid
*
* @method _isValidDate
* @param {Number} year Year fragment of your date.
* @param {Number} month Month fragment of your date.
* @param {Number} day Day fragment of your date.
* @return {Boolean} True if valid
* @private
* @static
* @example
*     Ink.requireModules(['Ink.Util.Validator_1'], function(InkValidator){
*         console.log(InkValidator._isValidDate(2004, 2, 29) );
*         console.log(InkValidator._isValidDate(2006, 2, 29) );
*     });
*/
_isValidDate: function(year, month, day){
var yearRegExp=/^\d{4}$/;
var validOneOrTwo=/^\d{1,2}$/;
if(yearRegExp.test(year)&&validOneOrTwo.test(month)&&validOneOrTwo.test(day)){
if(month>=1&&month<=12&&day>=1&&this._daysInMonth(month,year)>=day){
return true;
}}
return false;
},
email: function(email){
var emailValido=new RegExp("^[_a-z0-9-]+((\\.|\\+)[_a-z0-9-]+)*@([\\w]*-?[\\w]*\\.)+[a-z]{2,4}$", "i");
return !!emailValido.test(email);
},
mail: function (mail){ return Validator.email(mail); },
url: function(url, full){
if(typeof full==="undefined"||full===false){
var reHTTP=new RegExp("(^(http\\:\\/\\/|https\\:\\/\\/)(.+))", "i");
if(reHTTP.test(url)===false){
url='http://'+url;
}}
var reUrl=new RegExp("^(http:\\/\\/|https:\\/\\/)([\\w]*(-?[\\w]*)*\\.)+[a-z]{2,4}", "i");
if(reUrl.test(url)===false){
return false;
}else{
return true;
}},
isPTPhone: function(phone){
phone=phone.toString();
var aInd=[];
for(var i in this._indicativosPT){
if(typeof(this._indicativosPT[i])==='string'){
aInd.push(i);
}}
var strInd=aInd.join('|');
var re351=/^(00351|\+351)/;
if(re351.test(phone)){
phone=phone.replace(re351, "");
}
var reSpecialChars=/(\s|\-|\.)+/g;
phone=phone.replace(reSpecialChars, '');
var reInt=/[\d]{9}/i;
if(phone.length===9&&reInt.test(phone)){
var reValid=new RegExp("^("+strInd+")");
if(reValid.test(phone)){
return true;
}}
return false;
},
isPortuguesePhone: function(phone){
return this.isPTPhone(phone);
},
isCVPhone: function(phone){
phone=phone.toString();
var aInd=[];
for(var i in this._indicativosCV){
if(typeof(this._indicativosCV[i])==='string'){
aInd.push(i);
}}
var strInd=aInd.join('|');
var re238=/^(00238|\+238)/;
if(re238.test(phone)){
phone=phone.replace(re238, "");
}
var reSpecialChars=/(\s|\-|\.)+/g;
phone=phone.replace(reSpecialChars, '');
var reInt=/[\d]{7}/i;
if(phone.length===7&&reInt.test(phone)){
var reValid=new RegExp("^("+strInd+")");
if(reValid.test(phone)){
return true;
}}
return false;
},
isAOPhone: function(phone){
phone=phone.toString();
var aInd=[];
for(var i in this._indicativosAO){
if(typeof(this._indicativosAO[i])==='string'){
aInd.push(i);
}}
var strInd=aInd.join('|');
var re244=/^(00244|\+244)/;
if(re244.test(phone)){
phone=phone.replace(re244, "");
}
var reSpecialChars=/(\s|\-|\.)+/g;
phone=phone.replace(reSpecialChars, '');
var reInt=/[\d]{9}/i;
if(phone.length===9&&reInt.test(phone)){
var reValid=new RegExp("^("+strInd+")");
if(reValid.test(phone)){
return true;
}}
return false;
},
isMZPhone: function(phone){
phone=phone.toString();
var aInd=[];
for(var i in this._indicativosMZ){
if(typeof(this._indicativosMZ[i])==='string'){
aInd.push(i);
}}
var strInd=aInd.join('|');
var re258=/^(00258|\+258)/;
if(re258.test(phone)){
phone=phone.replace(re258, "");
}
var reSpecialChars=/(\s|\-|\.)+/g;
phone=phone.replace(reSpecialChars, '');
var reInt=/[\d]{8,9}/i;
if((phone.length===9||phone.length===8)&&reInt.test(phone)){
var reValid=new RegExp("^("+strInd+")");
if(reValid.test(phone)){
if(phone.indexOf('2')===0&&phone.length===8){
return true;
}else if(phone.indexOf('8')===0&&phone.length===9){
return true;
}}
}
return false;
},
isTLPhone: function(phone){
phone=phone.toString();
var aInd=[];
for(var i in this._indicativosTL){
if(typeof(this._indicativosTL[i])==='string'){
aInd.push(i);
}}
var strInd=aInd.join('|');
var re670=/^(00670|\+670)/;
if(re670.test(phone)){
phone=phone.replace(re670, "");
}
var reSpecialChars=/(\s|\-|\.)+/g;
phone=phone.replace(reSpecialChars, '');
var reInt=/[\d]{7}/i;
if(phone.length===7&&reInt.test(phone)){
var reValid=new RegExp("^("+strInd+")");
if(reValid.test(phone)){
return true;
}}
return false;
},
isPhone: function(){
var index;
if(arguments.length===0){
return false;
}
var phone=arguments[0];
if(arguments.length>1){
if(arguments[1].constructor===Array){
var func;
for(index=0; index<arguments[1].length; index++){
if(typeof(func=this['is' + arguments[1][index].toUpperCase() + 'Phone'])==='function'){
if(func(phone)){
return true;
}}else{
throw "Invalid Country Code!";
}}
}else if(typeof(this['is' + arguments[1].toUpperCase() + 'Phone'])==='function'){
return this['is' + arguments[1].toUpperCase() + 'Phone'](phone);
}else{
throw "Invalid Country Code!";
}}else{
for(index=0; index<this._countryCodes.length; index++){
if(this['is' + this._countryCodes[index] + 'Phone'](phone)){
return true;
}}
}
return false;
},
codPostal: function(cp1, cp2, returnBothResults){
var cPostalSep=/^(\s*\-\s*|\s+)$/;
var trim=/^\s+|\s+$/g;
var cPostal4=/^[1-9]\d{3}$/;
var cPostal3=/^\d{3}$/;
var parserCPostal=/^(.{4})(.*)(.{3})$/;
cp1=cp1.replace(trim,'');
if(typeof(cp2)!=='undefined'){
cp2=cp2.replace(trim,'');
if(cPostal4.test(cp1)&&cPostal3.test(cp2)){
if(returnBothResults){
return [true, true];
}else{
return true;
}}
}else{
if(cPostal4.test(cp1)){
if(returnBothResults){
return [true,false];
}else{
return true;
}}
var cPostal=cp1.match(parserCPostal);
if(cPostal!==null&&cPostal4.test(cPostal[1])&&cPostalSep.test(cPostal[2])&&cPostal3.test(cPostal[3])){
if(returnBothResults){
return [true,false];
}else{
return true;
}}
}
if(returnBothResults){
return [false,false];
}else{
return false;
}},
isDate: function(format, dateStr){
if(typeof(this._dateParsers[format])==='undefined'){
return false;
}
var yearIndex=this._dateParsers[format].year;
var monthIndex=this._dateParsers[format].month;
var dayIndex=this._dateParsers[format].day;
var dateParser=this._dateParsers[format].parser;
var separator=this._dateParsers[format].sep;
/* Trim Deactivated
* var trim=/^\w+|\w+$/g;
* dateStr=dateStr.replace(trim,"");
*/
var data=dateStr.match(dateParser);
if(data!==null){
/* Trim Deactivated
* for(i=1;i<=data.length;i++){
*   data[i]=data[i].replace(trim,"");
*}
*/
if(data[2]===data[4]&&data[2]===separator){
var _y=((data[yearIndex].length===2) ? "20" + data[yearIndex].toString():data[yearIndex]);
if(this._isValidDate(_y,data[monthIndex].toString(),data[dayIndex].toString())){
return true;
}}
}
return false;
},
isColor: function(str){
var match, valid=false,
keyword=/^[a-zA-Z]+$/,
hexa=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,
rgb=/^rgb\(\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*\)$/,
rgba=/^rgba\(\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*,\s*(1(\.0)?|0(\.[0-9])?)\s*\)$/,
hsl=/^hsl\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*\)$/,
hsla=/^hsla\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})(%)?\s*,\s*([0-9]{1,3})(%)?\s*,\s*(1(\.0)?|0(\.[0-9])?)\s*\)$/;
if(keyword.test(str) ||
hexa.test(str)
){
return true;
}
var i;
if((match=rgb.exec(str))!==null||(match=rgba.exec(str))!==null){
i=match.length;
while(i--){
if((i===2||i===4||i===6)&&typeof match[i]!=="undefined"&&match[i]!==""){
if(typeof match[i-1]!=="undefined"&&match[i-1] >=0&&match[i-1] <=100){
valid=true;
}else{
return false;
}}
if(i===1||i===3||i===5&&(typeof match[i+1]==="undefined"||match[i+1]==="")){
if(typeof match[i]!=="undefined"&&match[i] >=0&&match[i] <=255){
valid=true;
}else{
return false;
}}
}}
if((match=hsl.exec(str))!==null||(match=hsla.exec(str))!==null){
i=match.length;
while(i--){
if(i===3||i===5){
if(typeof match[i-1]!=="undefined"&&typeof match[i]!=="undefined"&&match[i]!=="" &&
match[i-1] >=0&&match[i-1] <=100){
valid=true;
}else{
return false;
}}
if(i===1){
if(typeof match[i]!=="undefined"&&match[i] >=0&&match[i] <=360){
valid=true;
}else{
return false;
}}
}}
return valid;
},
isIP: function(value, ipType){
if(typeof value!=='string'){
return false;
}
ipType=(ipType||'ipv4').toLowerCase();
switch(ipType){
case 'ipv4':
return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);
case 'ipv6':
return (/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/).test(value);
default:
return false;
}},
_creditCardSpecs: {
'default': {
'length': '13,14,15,16,17,18,19',
'prefix': /^.+/,
'luhn': true
},
'american express': {
'length': '15',
'prefix': /^3[47]/,
'luhn':true
},
'diners club': {
'length': '14,16',
'prefix': /^36|55|30[0-5]/,
'luhn':true
},
'discover': {
'length': '16',
'prefix': /^6(?:5|011)/,
'luhn':true
},
'jcb': {
'length': '15,16',
'prefix': /^3|1800|2131/,
'luhn':true
},
'maestro': {
'length': '16,18',
'prefix': /^50(?:20|38)|6(?:304|759)/,
'luhn':true
},
'mastercard': {
'length': '16',
'prefix': /^5[1-5]/,
'luhn':true
},
'visa': {
'length': '13,16',
'prefix': /^4/,
'luhn':true
}},
_luhn: function (num){
num=parseInt(num,10);
if((typeof num!=='number')&&(num % 1!==0)){
return false;
}
num=num+'';
var length=num.length;
var i;
var checksum=0;
for (i=length - 1; i >=0; i -=2){
checksum +=parseInt(num.substr(i, 1),10);
}
for (i=length - 2; i >=0; i -=2){
var dbl=parseInt(num.substr(i, 1) * 2,10);
checksum +=(dbl >=10) ? (dbl - 9):dbl;
}
return (checksum % 10===0);
},
isCreditCard: function(num, creditCardType){
if(/\d+/.test(num)===false){
return false;
}
if(typeof creditCardType==='undefined'){
creditCardType='default';
}
else if(creditCardType instanceof Array){
var i, ccLength=creditCardType.length;
for(i=0; i < ccLength; i++){
if(this.isCreditCard(num, creditCardType[i])){
return true;
}}
return false;
}
creditCardType=creditCardType.toLowerCase();
if(typeof this._creditCardSpecs[creditCardType]==='undefined'){
return false;
}
var length=num.length+'';
if(this._creditCardSpecs[creditCardType]['length'].split(",").indexOf(length)===-1){
return false;
}
if(!this._creditCardSpecs[creditCardType]['prefix'].test(num)){
return false;
}
if(this._creditCardSpecs[creditCardType]['luhn']===false){
return true;
}
return this._luhn(num);
},
getEANCheckDigit: function(digits){
var sum=0, size, i;
digits=String(digits);
while (digits.length<12){
digits='00000' + digits;
}
size=digits.length;
for (i=(size - 1); i >=0; i--){
sum +=((i % 2) * 2 + 1) * Number(digits.charAt(i));
}
return (10 - (sum % 10));
},
isEAN: function (code, eanType){
if(eanType===undefined){ eanType='ean-13'; }
switch(eanType){
case 'ean-13':
if(code.length!==13){ return false; }
break;
case 'ean-8':
if(code.length!==8){ return false; }
break;
default:
return false;
}
var digits=code.substr(0, code.length -1);
var givenCheck=code.charAt(code.length - 1);
var check=Validator.getEANCheckDigit(digits);
return String(check)===givenCheck;
}};
return Validator;
});
Ink.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css){
'use strict';
var animationPrefix=(function (el){
return ('animationName' in el.style) ? 'animation' :
('webkitAnimationName' in el.style) ? 'webkitAnimation':null;
}(document.createElement('div')));
var animationEndEventName={
animation: 'animationend',
webkitAnimation: 'webkitAnimationEnd'
}[animationPrefix];
function Animate(){
Common.BaseUIComponent.apply(this, arguments);
}
Animate._name='Animate_1';
Animate._optionDefinition={
trigger: ['Element', null],
duration: ['String', 'slow'],
animation: ['String'],
removeClass: ['Boolean', true],
onEnd: ['Function', function (){}]
};
Animate.prototype._init=function (){
if(!isNaN(parseInt(this._options.duration, 10))){
this._options.duration=parseInt(this._options.duration, 10);
}
if(this._options.trigger){
InkEvent.observe(this._options.trigger, 'click', Ink.bind(function (){
this.animate();
}, this));
}else{
this.animate();
}};
Animate.prototype.animate=function (){
Animate.animate(this._element, this._options.animation, this._options);
};
Ink.extendObj(Animate, {
_animationPrefix: animationPrefix,
animationSupported: !!animationPrefix,
animationEndEventName: animationEndEventName,
animate: function (element, animation, options){
element=Common.elOrSelector(element);
if(typeof options==='number'||typeof options==='string'){
options={ duration: options };}else if(!options){
options={};}
if(typeof arguments[3]==='function'){
options.onEnd=arguments[3];
}
if(typeof options.duration!=='number'&&typeof options.duration!=='string'){
options.duration=400;
}
if(!Animate.animationSupported){
if(options.onEnd){
setTimeout(function (){
options.onEnd(null);
}, 0);
}
return;
}
if(typeof options.duration==='number'){
element.style[animationPrefix + 'Duration']=options.duration + 'ms';
}else if(typeof options.duration==='string'){
Css.addClassName(element, options.duration);
}
Css.addClassName(element, ['animated', animation]);
function onAnimationEnd(event){
if(event.target!==element){ return; }
if(event.animationName!==animation){ return; }
if(options.onEnd){ options.onEnd(event); }
if(options.removeClass){
Css.removeClassName(element, animation);
}
if(typeof options.duration==='string'){
Css.removeClassName(element, options.duration);
}
element.removeEventListener(animationEndEventName, onAnimationEnd, false);
}
element.addEventListener(animationEndEventName, onAnimationEnd, false);
}});
Common.createUIComponent(Animate);
return Animate;
});
Ink.createModule('Ink.UI.Carousel', '1',
['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],
function(Common, InkEvent, Css, InkElement, Pagination, Browser){
'use strict';
function limitRange(n, min, max){
return Math.min(max, Math.max(min, n));
}
var requestAnimationFrame=window.requestAnimationFrame ||
function (cb){ return setTimeout(cb, 1000 / 30); };
function Carousel(){
Common.BaseUIComponent.apply(this, arguments);
}
Carousel._name='Carousel_1';
Carousel._optionDefinition={
autoAdvance:    ['Integer', 0],
axis:           ['String', 'x'],
initialPage:    ['Integer', 0],
spaceAfterLastSlide: ['Boolean', true],
keyboardSupport:['Boolean', false],
pagination:     ['String', null],
onChange:       ['Function', null],
onInit:         ['Function', function (){}],
swipe:          ['Boolean', true]
};
Carousel.prototype={
_validate: function(){
var ulEl=Ink.s('ul.stage', this._element);
if(!ulEl){
return new Error('Carousel must contain a ul.stage element!')
}},
_init: function (){
this._handlers={
paginationChange: Ink.bindMethod(this, '_onPaginationChange'),
windowResize:     InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)
};
InkEvent.observe(window, 'resize', this._handlers.windowResize);
this._isY=(this._options.axis==='y');
var ulEl=Ink.s('ul.stage', this._element);
ulEl.style.width='100%';
this._ulEl=ulEl;
InkElement.removeTextNodeChildren(ulEl);
if(this._options.pagination==null){
this._currentPage=this._options.initialPage;
}
this.refit();
if(this._isY){
this._ulEl.style.whiteSpace='normal';
}
if(this._options.swipe){
InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));
InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));
InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));
}
this._setUpPagination();
this._setUpAutoAdvance();
this._options.onInit.call(this, this);
},
refit: function(){
var _isY=this._isY;
var size=function (elm, perpendicular){
if(!elm){ return 0; }
if(!perpendicular){
return InkElement.outerDimensions(elm)[_isY ? 1:0];
}else{
return InkElement.outerDimensions(elm)[_isY ? 0:1];
}};
this._liEls=Ink.ss('li.slide', this._ulEl);
var numSlides=this._liEls.length;
var contRect=this._ulEl.getBoundingClientRect();
this._ctnLength=_isY ? contRect.bottom - contRect.top:contRect.right - contRect.left;
this._elLength=size(this._liEls[0]);
this._slidesPerPage=Math.floor(this._ctnLength / this._elLength)||1;
if(!isFinite(this._slidesPerPage)){ this._slidesPerPage=1; }
var numPages=Math.ceil(numSlides / this._slidesPerPage);
var numPagesChanged=this._numPages!==numPages;
this._numPages=numPages;
this._deltaLength=this._slidesPerPage * this._elLength;
this._IE7();
if(this._pagination&&numPagesChanged){
this._pagination.setSize(this._numPages);
}
this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));
},
_setUpPagination: function (){
if(this._options.pagination){
if(Common.isDOMElement(this._options.pagination) ||
typeof this._options.pagination==='string'){
this._pagination=new Pagination(this._options.pagination, {
size:     this._numPages,
onChange: this._handlers.paginationChange
});
}else{
this._pagination=this._options.pagination;
this._pagination.setOnChange(this._handlers.paginationChange);
this._pagination.setSize(this._numPages);
}
this._pagination.setCurrent(this._options.initialPage||0);
}else{
this._currentPage=this._options.initialPage||0;
}},
_setUpAutoAdvance: function (){
if(!this._options.autoAdvance){ return; }
this.autoAdvance(this._options.autoAdvance);
},
autoAdvance: function (ms){
if(this._autoAdvanceSto){ return; }
var self=this;
function autoAdvance(){
self.nextPage(true );
self._autoAdvanceSto=setTimeout(autoAdvance, ms);
}
this._autoAdvanceSto=setTimeout(autoAdvance, ms);
},
stopAutoAdvance: function (){
if(!this._autoAdvanceSto){ return; }
clearTimeout(this._autoAdvanceSto);
this._autoAdvanceSto=null;
},
_IE7: function (){
if(Browser.IE&&'' + Browser.version.split('.')[0]==='7'){
var slides=Ink.ss('li.slide', this._ulEl);
var stl=function (prop, val){slides[i].style[prop]=val; };
for (var i=0, len=slides.length; i < len; i++){
stl('position', 'absolute');
stl(this._isY ? 'top':'left', (i * this._elLength) + 'px');
}}
},
_onTouchStart: function (event){
if(event.touches.length > 1){ return; }
this._swipeData={
x: InkEvent.pointerX(event),
y: InkEvent.pointerY(event)
};
var ulRect=this._ulEl.getBoundingClientRect();
this._swipeData.firstUlPos=ulRect[this._isY ? 'top':'left'];
this._swipeData.inUlX=this._swipeData.x - ulRect.left;
this._swipeData.inUlY=this._swipeData.y - ulRect.top;
setTransitionProperty(this._ulEl, 'none');
this._touchMoveIsFirstTouchMove=true;
},
_onTouchMove: function (event){
if(event.touches.length > 1){ return;  }
var pointerX=InkEvent.pointerX(event);
var pointerY=InkEvent.pointerY(event);
var deltaY=this._swipeData.y - pointerY;
var deltaX=this._swipeData.x - pointerX;
if(this._touchMoveIsFirstTouchMove){
var aDeltaY=Math.abs(deltaY);
var aDeltaX=Math.abs(deltaX);
this._touchMoveIsFirstTouchMove=undefined;
this._scrolling=this._isY ?
aDeltaX > aDeltaY :
aDeltaY > aDeltaX ;
if(!this._scrolling){
this._onAnimationFrame();
}}
if(!this._scrolling&&this._swipeData){
InkEvent.stopDefault(event);
this._swipeData.pointerDelta=this._isY ? deltaY:deltaX;
this._swipeData.pointerPos=this._isY ? pointerY:pointerX;
}},
_onAnimationFrame: function (){
var swipeData=this._swipeData;
if(!swipeData||this._scrolling||this._touchMoveIsFirstTouchMove){ return; }
var elRect=this._element.getBoundingClientRect();
var newPos;
if(!this._isY){
newPos=swipeData.pointerPos - swipeData.inUlX - elRect.left;
}else{
newPos=swipeData.pointerPos - swipeData.inUlY - elRect.top;
}
this._ulEl.style[this._isY ? 'top':'left']=newPos + 'px';
requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));
},
_onTouchEnd: function (event){
if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){
var snapToNext=0.1;
var pointerDelta=this._swipeData.pointerDelta;
var curPage=this.getPage();
var progressInPages=pointerDelta / this._elLength / this._slidesPerPage;
if(Math.abs(progressInPages) > snapToNext){
curPage +=Math[ pointerDelta < 0 ? 'floor':'ceil' ](progressInPages);
}
curPage=limitRange(curPage, 0, this._numPages - 1);
if(!isNaN(curPage)){
this.setPage(curPage);
}
InkEvent.stopDefault(event);
}
setTransitionProperty(this._ulEl, null );
this._swipeData=null;
this._touchMoveIsFirstTouchMove=undefined;
this._scrolling=undefined;
},
_onPaginationChange: function(pgn){
this._setPage(pgn.getCurrent());
},
getPage: function (){
if(this._pagination){
return this._pagination.getCurrent();
}else{
return this._currentPage||0;
}},
getPagination: function (){
return this._pagination||null;
},
setPage: function (page, wrap){
if(wrap){
page=page % this._numPages;
if(page < 0){ page=this._numPages - page; }}
page=limitRange(page, 0, this._numPages - 1);
if(page===this._currentPage){
if(this._swipeData){
this._setPage(page);
}
return;
}
if(this._pagination){
this._pagination.setCurrent(page);
}else{
this._setPage(page);
}},
_setPage: function (page){
var _lengthToGo=page * this._deltaLength;
var isLastPage=page===(this._numPages - 1);
if(!this._options.spaceAfterLastSlide&&isLastPage&&page > 0){
var _itemsInLastPage=this._liEls.length - (page * this._slidesPerPage);
if(_itemsInLastPage < this._slidesPerPage){
_lengthToGo=((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);
}}
this._ulEl.style[ this._isY ? 'top':'left'] =
['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');
if(this._options.onChange){
this._options.onChange.call(this, page);
}
this._currentPage=page;
},
nextPage: function (wrap){
this.setPage(this.getPage() + 1, wrap);
},
previousPage: function (wrap){ this.setPage(this.getPage() - 1, wrap); },
getSlidesPerPage: function(){
return this._slidesPerPage;
},
getTotalPages: function(){
return this._numPages;
},
getStageElm: function(){
return this._ulEl;
},
getSlidesList: function(){
return this._liEls;
},
getTotalSlides: function(){
return this.getSlidesList().length;
}};
function setTransitionProperty(el, newTransition){
el.style.transitionProperty =
el.style.oTransitionProperty =
el.style.msTransitionProperty =
el.style.mozTransitionProperty =
el.style.webkitTransitionProperty=newTransition;
}
Common.createUIComponent(Carousel);
return Carousel;
});
Ink.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement){
'use strict';
/**
* Subscribes clicks on the document.body.
* Whenever an element with the classes ".ink-close" or ".ink-dismiss" is clicked, this module finds an ancestor ".ink-alert" or ".ink-alert-block" element and removes it from the DOM.
* This module should be created only once per page.
*
* @class Ink.UI.Close
* @constructor
* @example
*     <script>*         Ink.requireModules(['Ink.UI.Close_1'],function(Close){
*             new Close();
*         });
*</script>
*
* @sample Ink_UI_Close_1.html
*/
function Close(){
InkEvent.observe(document.body, 'click', function(ev){
var el=InkEvent.element(ev);
el=InkElement.findUpwardsByClass(el, 'ink-close') ||
InkElement.findUpwardsByClass(el, 'ink-dismiss');
if(!el){
return;
}
var toRemove=InkElement.findUpwardsByClass(el, 'ink-alert') ||
InkElement.findUpwardsByClass(el, 'ink-alert-block') ||
el;
if(toRemove){
InkEvent.stopDefault(ev);
InkElement.remove(toRemove);
}});
}
Close._name='Close_1';
return Close;
});
Ink.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url){
'use strict';
var nothing={} ;
var keys=Object.keys||function (obj){
var ret=[];
for (var k in obj) if(obj.hasOwnProperty(k)){
ret.push(k);
}
return ret;
};
var es6WeakMapSupport='WeakMap' in window;
var instances=es6WeakMapSupport ? new WeakMap():null;
var _reg=[];
var domRegistry={
get: function get(el){
return es6WeakMapSupport ?
instances.get(el) :
_reg[el.getAttribute('__InkInstance')];
},
set: function set(el, thing){
if(es6WeakMapSupport){
instances.set(el, thing);
}else{
el.setAttribute('__InkInstance', _reg.push(thing) - 1);
}}
};
var Common={
Layouts: {
TINY: 'tiny',
SMALL:  'small',
MEDIUM: 'medium',
LARGE:  'large',
XLARGE: 'xlarge'
},
isDOMElement: InkElement.isDOMElement,
isInteger: function(n){
return (typeof n==='number'&&n % 1===0);
},
elOrSelector: function(elOrSelector, fieldName){
if(!Common.isDOMElement(elOrSelector)){
var t=Selector.select(elOrSelector);
if(t.length===0){
Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.');
return null;
}
return t[0];
}
return elOrSelector;
},
elsOrSelector: function(elsOrSelector, fieldName, required){
var ret;
if(typeof elsOrSelector==='string'){
ret=Selector.select(elsOrSelector);
}else if(Common.isDOMElement(elsOrSelector)){
ret=[elsOrSelector];
}else if(elsOrSelector&&typeof elsOrSelector==='object'&&typeof elsOrSelector.length==='number'){
ret=elsOrSelector;
}
if(ret&&ret.length){
return ret;
}else{
if(required){
throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.');
}else{
return [];
}}
},
options: function (fieldId, defaults, overrides, element){
if(typeof fieldId!=='string'){
element=overrides;
overrides=defaults;
defaults=fieldId;
fieldId='';
}
overrides=overrides||{};
var out={};
var dataAttrs=element ? InkElement.data(element):{};
var fromDataAttrs;
var type;
var lType;
var defaultVal;
var invalidStr=function (str){
if(fieldId){ str=fieldId + ': "' + ('' + str).replace(/"/, '\\"') + '"'; }
return str;
};
var quote=function (str){
return '"' + ('' + str).replace(/"/, '\\"') + '"';
};
var invalidThrow=function (str){
throw new Error(invalidStr(str));
};
var invalid=function (str){
Ink.error(invalidStr(str) + '. Ignoring option.');
};
function optionValue(key){
type=defaults[key][0];
lType=type.toLowerCase();
defaultVal=defaults[key].length===2 ? defaults[key][1]:nothing;
if(!type){
invalidThrow('Ink.UI.Common.options: Always specify a type!');
}
if(!(lType in Common._coerce_funcs)){
invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));
}
if(!defaults[key].length||defaults[key].length > 2){
invalidThrow('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.');
}
if(key in dataAttrs){
fromDataAttrs=Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);
}else{
fromDataAttrs=nothing;
}
if(fromDataAttrs!==nothing){
if(!Common._options_validate(fromDataAttrs, lType)){
invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));
return defaultVal;
}else{
return fromDataAttrs;
}}else if(key in overrides){
return overrides[key];
}else if(defaultVal!==nothing){
return defaultVal;
}else{
invalidThrow('Option ' + key + ' is required!');
}}
for (var key in defaults){
if(defaults.hasOwnProperty(key)){
out[key]=optionValue(key);
}}
return out;
},
_coerce_from_string: function (type, val, paramName, fieldId){
if(type in Common._coerce_funcs){
return Common._coerce_funcs[type](val, paramName, fieldId);
}else{
return val;
}},
_options_validate: function (val, type){
if(type in Common._options_validate_types){
return Common._options_validate_types[type].call(Common, val);
}else{
return false;
}},
_coerce_funcs: (function (){
var ret={
element: function (val){
return Common.elOrSelector(val, '');
},
elements: function (val){
return Common.elsOrSelector(val, '', false );
},
object: function (val){ return val; },
number: function (val){ return parseFloat(val); },
'boolean': function (val){
return !(val==='false'||val===''||val===null);
},
string: function (val){ return val; },
'function': function (val, paramName, fieldId){
Ink.error(fieldId + ': You cannot specify the option "' + paramName + '" through data-attributes because it\'s a function');
return nothing;
}};
ret['float']=ret.integer=ret.number;
return ret;
}()),
_options_validate_types: (function (){
var types={
string: function (val){
return typeof val==='string';
},
number: function (val){
return typeof val==='number'&&!isNaN(val)&&isFinite(val);
},
integer: function (val){
return val===Math.round(val);
},
element: function (val){
return Common.isDOMElement(val);
},
elements: function (val){
return val&&typeof val==='object'&&typeof val.length==='number'&&val.length;
},
'boolean': function (val){
return typeof val==='boolean';
},
object: function (){ return true; }};
types['float']=types.number;
return types;
}()),
clone: function(o){
try {
return JSON.parse(JSON.stringify(o));
} catch (ex){
throw new Error('Given object cannot have loops!');
}},
/**
* Gets an element's one-base index relative to its parent.
*
* Deprecated. Use Ink.Dom.Element.parentIndexOf instead.
*
* @method childIndex
* @deprecated
* @static
* @param  {Element}     childEl     Valid DOM Element.
* @return {Number}                     Numerical position of an element relatively to its parent.
* @example
*     <!-- Imagine the following HTML: -->
*     <ul>
*       <li>One</li>
*       <li>Two</li>
*       <li id="test">Three</li>
*       <li>Four</li>
*     </ul>
*
*     <script>*         var testLi=Ink.s('#test');
*         Ink.UI.Common.childIndex(testLi);
*</script>
*/
childIndex: InkElement.parentIndexOf,
ajaxJSON: function(endpoint, params, cb){
new Ajax(
endpoint,
{
evalJS:         'force',
method:         'POST',
parameters:     params,
onSuccess:  function(r){
try {
r=r.responseJSON;
if(r.status!=='ok'){
throw 'server error: ' + r.message;
}
cb(null, r);
} catch (ex){
cb(ex);
}},
onFailure: function(){
cb('communication failure');
}}
);
},
currentLayout: function(){
var i, f, k, v, el, detectorEl=Selector.select('#ink-layout-detector')[0];
if(!detectorEl){
detectorEl=document.createElement('div');
detectorEl.id='ink-layout-detector';
for (k in Common.Layouts){
if(Common.Layouts.hasOwnProperty(k)){
v=Common.Layouts[k];
el=document.createElement('div');
el.className='show-' + v + ' hide-all';
el.setAttribute('data-ink-layout', v);
detectorEl.appendChild(el);
}}
document.body.appendChild(detectorEl);
}
for (i=0, f=detectorEl.children.length; i < f; ++i){
el=detectorEl.children[i];
if(Css.getStyle(el, 'display')==='block'){
return el.getAttribute('data-ink-layout');
}}
return 'large';
},
hashSet: function(o){
if(typeof o!=='object'){ throw new TypeError('o should be an object!'); }
var hashParams=Url.getAnchorString();
hashParams=Ink.extendObj(hashParams, o);
window.location.hash=Url.genQueryString('', hashParams).substring(1);
},
/**
* Removes children nodes from a given object.
* This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.
*
* @method cleanChildren
* @static
* @param  {Element} parentEl Valid DOM Element
* @return {void}
* @public
* @example
*     <!-- Imagine the following HTML: -->
*     <ul id="myUl">
*       <li>One</li>
*       <li>Two</li>
*       <li>Three</li>
*       <li>Four</li>
*     </ul>
*
*     <script>*     Ink.UI.Common.cleanChildren(Ink.s('#myUl') );
*</script>
*
*     <!-- After running it, the HTML changes to: -->
*     <ul id="myUl"></ul>
*/
cleanChildren: function(parentEl){
if(!Common.isDOMElement(parentEl)){
throw new Error('Please provide a valid DOMElement');
}
InkElement.clear(parentEl);
},
/**
* Stores the id and/or classes of an element in an object.
*
* @method storeIdAndClasses
* @static
* @param  {Element}    fromEl    Valid DOM Element to get the id and classes from.
* @param  {Object}     inObj     Object where the id and classes will be saved.
* @return {void}
* @public
* @example
*     <div id="myDiv" class="aClass"></div>
*
*     <script>*         var storageObj={};
*         Ink.UI.Common.storeIdAndClasses(Ink.s('#myDiv'), storageObj);
*
*         {
*           _id: 'myDiv',
*           _classes: 'aClass'
*         }
*</script>
*/
storeIdAndClasses: function(fromEl, inObj){
if(!Common.isDOMElement(fromEl)){
throw 'Please provide a valid Element as first parameter';
}
var id=fromEl.id;
if(id){
inObj._id=id;
}
var classes=fromEl.className;
if(classes){
inObj._classes=classes;
}},
/**
* Sets the id and className properties of an element based
*
* @method restoreIdAndClasses
* @static
* @param  {Element}    toEl    Valid DOM Element to set the id and classes on.
* @param  {Object}     inObj   Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`
* @return {void}
* @public
* @example
*     <div></div>
*
*     <script>*         var storageObj={
*           _id: 'myDiv',
*           _classes: 'aClass'
*         };
*
*         Ink.UI.Common.storeIdAndClasses(Ink.s('div'), storageObj);
*</script>
*
*     <!-- After the code runs the div element changes to: -->
*     <div id="myDiv" class="aClass"></div>
*/
restoreIdAndClasses: function(toEl, inObj){
if(!Common.isDOMElement(toEl)){
throw 'Please provide a valid Element as first parameter';
}
if(inObj._id&&toEl.id!==inObj._id){
toEl.id=inObj._id;
}
if(inObj._classes&&toEl.className.indexOf(inObj._classes)===-1){
if(toEl.className){ toEl.className +=' ' + inObj._classes; }else{                toEl.className=inObj._classes; }}
if(inObj._instanceId&&!toEl.getAttribute('data-instance')){
toEl.setAttribute('data-instance', inObj._instanceId);
}},
_warnDoubleInstantiation: function (elm, newInstance){
var instances=Common.getInstance(elm);
if(getName(newInstance)===''){ return; }
if(!instances){ return; }
var nameWithoutVersion=getName(newInstance);
if(!nameWithoutVersion){ return; }
for (var i=0, len=instances.length; i < len; i++){
if(nameWithoutVersion===getName(instances[i])){
Ink.warn('Creating more than one ' + nameWithoutVersion + ' for the same element.',
'(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');
return false;
}}
function getName(thing){
return ((thing.constructor&&(thing.constructor._name)) ||
thing._name ||
'').replace(/_.*?$/, '');
}
return true;
},
registerInstance: function(inst, el){
if(!inst){ return; }
if(!el){ el=inst._element; }
if(!Common.isDOMElement(el)){ throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }
if(Common._warnDoubleInstantiation(el, inst)===false){
return false;
}
var instances=domRegistry.get(el);
if(!instances){
instances=[];
domRegistry.set(el, instances);
}
instances.push(inst);
return true;
},
unregisterInstance: function(inst){
if(!inst||!inst._element){ return; }
var instances=domRegistry.get(inst._element);
for (var i=0, len=instances.length; i < len; i++){
if(instances[i]===inst){
instances.splice(i, 1);
}}
},
getInstance: function(el, UIComponent){
var givenEl=el;
el=Common.elOrSelector(el);
if(!Common.isDOMElement(el)){
Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');
return [];
}
var instances=domRegistry.get(el);
if(!instances){
instances=[];
}
if(typeof UIComponent!=='function'){
return instances;
}
for (var i=0, len=instances.length; i < len; i++){
if(instances[i] instanceof UIComponent){
return instances[i];
}}
return null;
},
getInstanceFromSelector: function(selector){
return Common.getInstance(selector);
},
getInstanceIds: function(){
if(_reg.length > 0) return _reg;
var res=[];
for (var id in instances){
if(instances.hasOwnProperty(id)){
res.push(id);
}}
return res;
},
getInstances: function(){
if(_reg.length > 0) return _reg;
var res=[];
for (var id in instances){
if(instances.hasOwnProperty(id)){
res.push(instances[id]);
}}
return res;
},
destroyComponent: function(){
Common.unregisterInstance(this);
this._element.parentNode.removeChild(this._element);
}};
function warnStub(){
if(!this||this===window||typeof this.constructor!=='function'){ return; }
Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');
}
function stub(prototype, obj){
for (var k in prototype) if(prototype.hasOwnProperty(k)){
if(k==='constructor'){ continue; }
if(typeof obj[k]==='function'){
obj[k]=warnStub;
}}
}
function BaseUIComponent(element, options){
var constructor=this.constructor;
var _name=constructor._name;
if(!this||this===window){
throw new Error('Use "new InkComponent()" instead of "InkComponent()"');
}
if(this&&!(this instanceof BaseUIComponent)){
throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');
}
if(!element&&!constructor._componentOptions.elementIsOptional){
Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to "new ' + _name + '()"'));
return;
}else{
this._element=Common.elsOrSelector(element,
_name + ': An element with the selector "' + element + '" was not found!')[0];
}
if(!this._element&&!constructor._componentOptions.elementIsOptional){
isValidInstance=false;
Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to "new ' + _name + '".'));
}
this._options=Common.options(_name, constructor._optionDefinition, options, this._element);
var isValidInstance=BaseUIComponent._validateInstance(this)===true;
if(isValidInstance&&typeof this._init==='function'){
try {
this._init.apply(this, arguments);
} catch(e){
isValidInstance=false;
Ink.error(e);
}}
if(!isValidInstance){
BaseUIComponent._stubInstance(this, constructor, _name);
}else if(this._element){
Common.registerInstance(this);
}}
BaseUIComponent._validateInstance=function (instance){
var err;
if(typeof instance._validate!=='function'){ return true; }
try {
err=instance._validate();
} catch (e){
err=e;
}
if(err instanceof Error){
instance._validationError=err;
return false;
}
return true;
};
BaseUIComponent._stubInstance=function (instance, constructor, name){
stub(constructor.prototype, instance);
stub(BaseUIComponent.prototype, instance);
Ink.warn(name + ' was not correctly created. ' + (instance._validationError||''));
};
BaseUIComponent.getInstance=function (elOrSelector){
elOrSelector=Common.elOrSelector(elOrSelector);
return Common.getInstance(elOrSelector, this );
};
Ink.extendObj(BaseUIComponent.prototype, {
getOption: function (name){
if(this.constructor&&!(name in this.constructor._optionDefinition)){
Ink.error('"' + name + '" is not an option for ' + this.constructor._name);
return undefined;
}
return this._options[name];
},
setOption: function (name, value){
if(this.constructor&&!(name in this.constructor._optionDefinition)){
Ink.error('"' + name + ' is not an option for ' + this.constructor._name);
return;
}
this._options[name]=value;
},
getElement: function (){
return this._element;
}});
Common.BaseUIComponent=BaseUIComponent;
Common.createUIComponent=function createUIComponent(theConstructor, options){
theConstructor._componentOptions=options||{};
function assert(test, msg){
if(!test){
throw new Error('Ink.UI_1.createUIComponent: ' + msg);
}}
function assertProp(prop, propType, message){
var propVal=theConstructor[prop];
assert(typeof propVal!=='undefined',
theConstructor + ' doesn\'t have a "' + prop + '" property. ' + message);
assert(propType&&typeof propVal===propType,
'typeof ' + theConstructor + '.' + prop + ' is not "' + propType + '". ' + message);
}
assert(typeof theConstructor==='function',
'constructor argument is not a function!');
assertProp('_name', 'string', 'This property is used for error ' +
'messages. Set it to the full module path and version (Ink.My.Module_1).');
assertProp('_optionDefinition', 'object', 'This property contains the ' +
'option names, types and defaults. See Ink.UI.Common.options() for reference.');
var _oldProto=theConstructor.prototype;
if(typeof Object.create==='function'){
theConstructor.prototype=Object.create(BaseUIComponent.prototype);
}else{
theConstructor.prototype=(function hideF(){
function F(){}
F.prototype=BaseUIComponent.prototype;
return new F();
}());
}
Ink.extendObj(theConstructor.prototype, _oldProto);
theConstructor.prototype.constructor=theConstructor;
Ink.extendObj(theConstructor, BaseUIComponent);
};
return Common;
});
Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Util.I18n_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate, I18n){
'use strict';
function clamp(n, min, max){
if(n > max){ n=max; }
if(n < min){ n=min; }
return n;
}
function dateishFromYMDString(YMD){
var split=YMD.split('-');
return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);
}
function keys(obj){
if(Object.keys){
return Object.keys(obj);
}
var ret=[];
for (var key in obj){
if(obj.hasOwnProperty(key)){
ret.push(key);
}}
return ret;
}
function dateishFromYMD(year, month, day){
return {_year: year, _month: month, _day: day};}
function dateishFromDate(date){
return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};}
function getDecade(year){
return Math.floor(year / 10) * 10;
}
var datePickerI18n=new I18n({
pt_PT: {
'datepicker.clean':       'Limpar',
'datepicker.close':       'Fechar',
'datepicker.format':      'dd-mm-yyyy',
'datepicker.of':          ' de ',
'datepicker.next_button': '»',
'datepicker.prev_button': '«',
'datepicker.months': {
1:'Janeiro',
2:'Fevereiro',
3:'Março',
4:'Abril',
5:'Maio',
6:'Junho',
7:'Julho',
8:'Agosto',
9:'Setembro',
10:'Outubro',
11:'Novembro',
12:'Dezembro'
},
'datepicker.week_days': {
0:'Domingo',
1:'Segunda-feira',
2:'Terça-feira',
3:'Quarta-feira',
4:'Quinta-feira',
5:'Sexta-feira',
6:'Sábado'
}},
en_US: {
'datepicker.clean':       'Clear',
'datepicker.close':       'Close',
'datepicker.format':      'dd-mm-yyyy',
'datepicker.of':          ' of ',
'datepicker.next_button': '»',
'datepicker.prev_button': '«',
'datepicker.months': {
1:'January',
2:'February',
3:'March',
4:'April',
5:'May',
6:'June',
7:'July',
8:'August',
9:'September',
10:'October',
11:'November',
12:'December'
},
'datepicker.week_days': {
0:'Sunday',
1:'Monday',
2:'Tuesday',
3:'Wednesday',
4:'Thursday',
5:'Friday',
6:'Saturday'
}}
}, 'en_US');
function DatePicker(){
Common.BaseUIComponent.apply(this, arguments);
}
DatePicker._name='DatePicker_1';
DatePicker._optionDefinition={
autoOpen:        ['Boolean', false],
pickerField:     ['Element', null],
containerElement:['Element', null],
cssClass:        ['String', 'wcv-calendar bottom'],
dateRange:       ['String', null],
displayInSelect: ['Boolean', false],
dayField:        ['Element', null],
monthField:      ['Element', null],
yearField:       ['Element', null],
createSelectOptions: ['Boolean', false],
format:          ['String', 'yyyy-mm-dd'],
onFocus:         ['Boolean', true],
onMonthSelected: ['Function', null],
onSetDate:       ['Function', null],
onYearSelected:  ['Function', null],
position:        ['String', 'right'],
showClean:       ['Boolean', true],
showClose:       ['Boolean', true],
shy:             ['Boolean', true],
startDate:       ['String', null],
startWeekDay:    ['Number', 1],
validDayFn:      ['Function', null],
validMonthFn:    ['Function', null],
validYearFn:     ['Function', null],
nextValidDateFn: ['Function', null],
prevValidDateFn: ['Function', null],
yearRange:       ['String', null],
lang:            ['String', null],
month:       ['Object', null],
wDay:        ['Object', null],
nextLinkText:['String', null],
prevLinkText:['String', null],
ofText:      ['String', null],
cleanText:   ['String', null],
closeText:   ['String', null]
};
DatePicker.prototype={
_init: function(){
this.i18n=datePickerI18n.clone();
if(this._options.lang){
this.i18n.lang(this._options.lang);
}
var lang=this._options.lang||datePickerI18n.lang();
var dict={};
dict[lang]={};
if(this._options.month){
dict[lang]['datepicker.months']=this._options.month; }
if(this._options.wDay){
dict[lang]['datepicker.week_days']=this._options.wDay; }
if(this._options.nextLinkText){
dict[lang]['datepicker.next_button']=this._options.nextLinkText; }
if(this._options.prevLinkText){
dict[lang]['datepicker.prev_button']=this._options.prevLinkText; }
if(this._options.ofText){
dict[lang]['datepicker.of']=this._options.ofText; }
if(this._options.cleanText){
dict[lang]['datepicker.clean']=this._options.cleanText; }
if(this._options.closeText){
dict[lang]['datepicker.close']=this._options.closeText; }
if(keys(dict[lang]).length){
this.i18n.append(dict);
}
this._options.format=this._dateParsers[ this._options.format ]||this._options.format;
this._hoverPicker=false;
this._picker=this._options.pickerField||null;
this._setMinMax(this._options.dateRange||this._options.yearRange);
if(this._options.startDate){
this.setDate(this._options.startDate);
}else if(this._element&&this._element.value){
this.setDate(this._element.value);
}else{
this.setDate(new Date());
}
if(this._options.startWeekDay < 0||this._options.startWeekDay > 6){
Ink.warn('Ink.UI.DatePicker_1: option "startWeekDay" must be between 0 (sunday) and 6 (saturday)');
this._options.startWeekDay=clamp(this._options.startWeekDay, 0, 6);
}
if(this._options.displayInSelect&&this._options.createSelectOptions){
this._createSelectOptions();
}
Ink.extendObj(this._options,this._lang||{});
this._render();
this._listenToContainerObjectEvents();
},
_validate: function (){
if(this._options.displayInSelect &&
!(this._options.dayField&&this._options.monthField&&this._options.yearField)){
throw new Error(
'Ink.UI.DatePicker: displayInSelect option enabled.'+
'Please specify dayField, monthField and yearField selectors.');
}},
_render: function(){
this._containerObject=document.createElement('div');
this._containerObject.className=this._options.cssClass + ' wcv-datepicker-calendar hide-all';
this._renderSuperTopBar();
var calendarTop=document.createElement("div");
calendarTop.className='wcv-calendar-top';
this._monthDescContainer=document.createElement("div");
this._monthDescContainer.className='wcv-calendar-month_desc';
this._monthPrev=document.createElement('div');
this._monthPrev.className='wcv-calendar-prev';
this._monthPrev.appendChild(InkElement.create('a', {
href: '#prev',
className: 'change_month_prev',
setHTML: this.i18n.text('datepicker.prev_button')
}));
this._monthNext=document.createElement('div');
this._monthNext.className='wcv-calendar-next';
this._monthNext.appendChild(InkElement.create('a', {
href: '#next',
className: 'change_month_next',
setHTML: this.i18n.text('datepicker.next_button')
}));
calendarTop.appendChild(this._monthPrev);
calendarTop.appendChild(this._monthDescContainer);
calendarTop.appendChild(this._monthNext);
this._monthContainer=document.createElement("div");
this._monthContainer.className='wcv-calendar-month';
this._containerObject.appendChild(calendarTop);
this._containerObject.appendChild(this._monthContainer);
this._monthSelector=this._renderMonthSelector();
this._containerObject.appendChild(this._monthSelector);
this._yearSelector=document.createElement('ul');
this._yearSelector.className='wcv-calendar-year-selector';
this._containerObject.appendChild(this._yearSelector);
if(!this._options.onFocus||this._options.displayInSelect){
if(!this._options.pickerField){
this._picker=InkElement.create('a', {
href: '#open_cal',
setHTML: 'open',
insertBottom: this._element.parentNode,
className: 'wcv-datepicker-picker-field'
});
}else{
this._picker=Common.elOrSelector(this._options.pickerField, 'pickerField');
}}
this._appendDatePickerToDom();
this._renderMonth();
this._monthChanger=InkElement.create('a', {
href: '#monthchanger',
className: 'wcv-calendar-lwcv-month',
setTextContent: this.i18n.getKey('datepicker.months')[this._month + 1]
});
this._ofText=InkElement.create('span', {
className: 'wcv-calendar-of-text',
setTextContent: this.i18n.text('datepicker.of')
});
this._yearChanger=InkElement.create('a', {
href: '#yearchanger',
className: 'wcv-calendar-lwcv-year',
setTextContent: this._year
});
this._monthDescContainer.appendChild(this._monthChanger);
this._monthDescContainer.appendChild(this._ofText);
this._monthDescContainer.appendChild(this._yearChanger);
if(!this._options.inline){
this._addOpenCloseEvents();
}else{
this.show();
}
this._addDateChangeHandlersToInputs();
},
_addDateChangeHandlersToInputs: function (){
var fields=this._element;
if(this._options.displayInSelect){
fields=[
this._options.dayField,
this._options.monthField,
this._options.yearField];
}
Event.observeMulti(fields ,'change', Ink.bindEvent(function(){
this._updateDate();
this._showDefaultView();
this.setDate();
if(this._options.onSetDate){
this._options.onSetDate(this , { date:this.getDate() });
}
if(!this._inline&&!this._hoverPicker){
this._hide(true);
}},this));
},
show: function (){
this._updateDate();
this._renderMonth();
Css.removeClassName(this._containerObject, 'hide-all');
},
_addOpenCloseEvents: function (){
var opener=this._picker||this._element;
Event.observe(opener, 'click', Ink.bindEvent(function(e){
Event.stopDefault(e);
this.show();
},this));
if(this._options.autoOpen){
this.show();
}
if(!this._options.displayInSelect){
Event.observe(opener, 'blur', Ink.bindEvent(function(){
if(!this._hoverPicker){
this._hide(true);
}},this));
}
if(this._options.shy){
Event.observe(document,'click',Ink.bindEvent(function(e){
var target=Event.element(e);
var cannotBe=[
this._options.dayField,
this._options.monthField,
this._options.yearField,
this._picker,
this._containerObject,
this._element
];
for (var i=0, len=cannotBe.length; i < len; i++){
if(cannotBe[i]&&(InkElement.descendantOf(cannotBe[i], target)||cannotBe[i]===target)){
return;
}}
this._hide(true);
},this));
}},
_renderMonthSelector: function (){
var selector=document.createElement('ul');
selector.className='wcv-calendar-month-selector';
var ulSelector=document.createElement('ul');
for(var mon=1; mon<=12; mon++){
ulSelector.appendChild(this._renderMonthButton(mon));
if(mon % 4===0){
selector.appendChild(ulSelector);
ulSelector=document.createElement('ul');
}}
return selector;
},
_renderMonthButton: function (mon){
var liMonth=document.createElement('li');
liMonth.appendChild(InkElement.create('a', {
'data-cal-month': mon,
setTextContent: this.i18n.getKey('datepicker.months')[mon].substring(0, 3)
}));
return liMonth;
},
_appendDatePickerToDom: function (){
if(this._options.containerElement){
var appendTarget =
Common.elOrSelector(this._options.containerElement);
appendTarget.appendChild(this._containerObject);
}
var parentIsControl=Selector.matchesSelector(this._element.parentNode,
'.wcv-form .control-group .control, .wcv-form .control-group .control > *');
if(parentIsControl){
this._wrapper=this._element.parentNode;
this._wrapperIsControl=true;
}else{
this._wrapper=InkElement.create('div', { className: 'wcv-datepicker-wrapper' });
InkElement.wrap(this._element, this._wrapper);
}
InkElement.insertAfter(this._containerObject, this._element);
},
_renderSuperTopBar: function (){
if((!this._options.showClose)||(!this._options.showClean)){ return; }
this._superTopBar=document.createElement("div");
this._superTopBar.className='wcv-calendar-top-options';
if(this._options.showClean){
this._superTopBar.appendChild(InkElement.create('a', {
className: 'clean',
setHTML: this.i18n.text('datepicker.clean')
}));
}
if(this._options.showClose){
this._superTopBar.appendChild(InkElement.create('a', {
className: 'close',
setHTML: this.i18n.text('datepicker.close')
}));
}
this._containerObject.appendChild(this._superTopBar);
},
_listenToContainerObjectEvents: function (){
Event.observe(this._containerObject, 'mouseover' ,Ink.bindEvent(function(e){
Event.stopDefault(e);
this._hoverPicker=true;
},this));
Event.observe(this._containerObject, 'mouseout', Ink.bindEvent(function(e){
Event.stopDefault(e);
this._hoverPicker=false;
},this));
Event.observe(this._containerObject, 'click', Ink.bindEvent(this._onClick, this));
},
_onClick: function(e){
var elem=Event.element(e);
if(Css.hasClassName(elem, 'wcv-calendar-off')){
Event.stopDefault(e);
return null;
}
Event.stopDefault(e);
this._onRelativeChangerClick(elem);
this._onAbsoluteChangerClick(elem);
if(Css.hasClassName(elem, 'wcv-calendar-lwcv-month')){
this._showMonthSelector();
}else if(Css.hasClassName(elem, 'wcv-calendar-lwcv-year')){
this._showYearSelector();
}else if(Css.hasClassName(elem, 'clean')){
this._clean();
}else if(Css.hasClassName(elem, 'close')){
this._hide(false);
}
this._updateDescription();
},
_onRelativeChangerClick: function (elem){
var changeYear={
change_year_next: 1,
change_year_prev: -1
};
var changeMonth={
change_month_next: 1,
change_month_prev: -1
};
if(elem.className in changeMonth){
this._updateCal(changeMonth[elem.className]);
}else if(elem.className in changeYear){
this._showYearSelector(changeYear[elem.className]);
}},
_onAbsoluteChangerClick: function (elem){
var elemData=InkElement.data(elem);
if(Number(elemData.calDay)){
this.setDate(new Date(this._year, this._month, elemData.calDay), elem);
if(this._options.shy){
this._hide();
}else{
this._updateCal();
}}else if(Number(elemData.calMonth)){
this._month=Number(elemData.calMonth) - 1;
this._showDefaultView();
this._updateCal();
}else if(Number(elemData.calYear)){
this._changeYear(Number(elemData.calYear));
}},
_changeYear: function (year){
year=+year;
if(!isNaN(year)){
this._year=year;
if(typeof this._options.onYearSelected==='function'){
this._options.onYearSelected(this, {
'year': this._year
});
}
this._showMonthSelector();
}},
_clean: function (){
if(this._options.displayInSelect){
this._options.yearField.selectedIndex=0;
this._options.monthField.selectedIndex=0;
this._options.dayField.selectedIndex=0;
}else{
this._element.value='';
}},
_hide: function(blur){
blur=blur===undefined ? true:blur;
if(blur===false||(blur&&this._options.shy)){
Css.addClassName(this._containerObject, 'hide-all');
}},
_setMinMax: function(dateRange){
var self=this;
var noMinLimit={
_year: -Number.MAX_VALUE,
_month: 0,
_day: 1
};
var noMaxLimit={
_year: Number.MAX_VALUE,
_month: 11,
_day: 31
};
function noLimits(){
self._min=noMinLimit;
self._max=noMaxLimit;
}
if(!dateRange){ return noLimits(); }
var dates=dateRange.split(':');
var rDate=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;
InkArray.each([
{name: '_min', date: dates[0], noLim: noMinLimit},
{name: '_max', date: dates[1], noLim: noMaxLimit}
], Ink.bind(function (data){
var lim=data.noLim;
if(data.date.toUpperCase()==='NOW'){
var now=new Date();
lim=dateishFromDate(now);
}else if(data.date.toUpperCase()==='EVER'){
lim=data.noLim;
}else if(rDate.test(data.date) ){
lim=dateishFromYMDString(data.date);
lim._month=clamp(lim._month, 0, 11);
lim._day=clamp(lim._day, 1, this._daysInMonth(lim._year, lim._month + 1));
}
this[data.name]=lim;
}, this));
var valid=this._dateCmp(this._max, this._min)!==-1;
if(!valid){
noLimits();
}},
_fitDateToRange: function(date){
if(!this._isValidDate(date) ){
date=dateishFromDate(new Date());
}
if(this._dateCmp(date, this._min)===-1){
return Ink.extendObj({}, this._min);
}else if(this._dateCmp(date, this._max)===1){
return Ink.extendObj({}, this._max);
}
return Ink.extendObj({}, date);
},
_dateWithinRange: function (date){
if(!arguments.length){
date=this;
}
return  (!this._dateAboveMax(date) &&
(!this._dateBelowMin(date)));
},
_dateAboveMax: function (date){
return this._dateCmp(date, this._max)===1;
},
_dateBelowMin: function (date){
return this._dateCmp(date, this._min)===-1;
},
_dateCmp: function (self, oth){
return this._dateCmpUntil(self, oth, '_day');
},
_dateCmpUntil: function (self, oth, depth){
var props=['_year', '_month', '_day'];
var i=-1;
do {
i++;
if(self[props[i]] > oth[props[i]]){ return 1; }
else if(self[props[i]] < oth[props[i]]){ return -1; }} while (props[i]!==depth &&
self[props[i + 1]]!==undefined&&oth[props[i + 1]]!==undefined);
return 0;
},
_createSelectOptions: function (){
var dayField=this._options.dayField;
var monthField=this._options.monthField;
var yearField=this._options.yearField;
InkElement.setHTML(monthField, '');
InkElement.setHTML(yearField, '');
InkElement.fillSelect(monthField, InkArray.map([
'Janeiro', 'Fevereiro', 'Março', 'Abril',
'Maio', 'Junho', 'Julho', 'Agosto',
'Setembro', 'Outubro', 'Novembro', 'Dezembro'
], function (monthName, i){ return [ i + 1, monthName ]; }), true);
InkElement.fillSelect(yearField, InkArray.range(1900, 2000), true);
function updateDays(){
var daysInMonth =
new Date(+yearField.value,
monthField.value - 1  + 1 ,
0 
).getDate();
InkElement.setHTML(dayField, '');
InkElement.fillSelect(dayField, InkArray.range(1, daysInMonth + 1), true);
}
Event.observeMulti([monthField, yearField], 'change', updateDays);
updateDays();
},
_showDefaultView: function(){
this._yearSelector.style.display='none';
this._monthSelector.style.display='none';
this._monthPrev.childNodes[0].className='change_month_prev';
this._monthNext.childNodes[0].className='change_month_next';
if(!this._getPrevMonth()){
this._monthPrev.childNodes[0].className='action_inactive';
}
if(!this._getNextMonth()){
this._monthNext.childNodes[0].className='action_inactive';
}
this._monthContainer.style.display='block';
},
_updateDate: function(){
var dataParsed;
if(!this._options.displayInSelect&&this._element.value){
dataParsed=this._parseDate(this._element.value);
}else if(this._options.displayInSelect){
dataParsed={
_year: this._options.yearField[this._options.yearField.selectedIndex].value,
_month: this._options.monthField[this._options.monthField.selectedIndex].value - 1,
_day: this._options.dayField[this._options.dayField.selectedIndex].value
};}
if(dataParsed){
dataParsed=this._fitDateToRange(dataParsed);
this._year=dataParsed._year;
this._month=dataParsed._month;
this._day=dataParsed._day;
}
this._setDate();
this._updateDescription();
this._renderMonth();
},
_updateDescription: function(){
InkElement.setTextContent(this._monthChanger, this.i18n.getKey('datepicker.months')[this._month + 1]);
InkElement.setTextContent(this._ofText, this.i18n.text('datepicker.of'));
InkElement.setTextContent(this._yearChanger, this._year);
},
_showYearSelector: function(inc){
this._incrementViewingYear(inc);
var firstYear=this._year - (this._year % 10);
var thisYear=firstYear - 1;
InkElement.setHTML(this._yearSelector, '');
var yearUl=InkElement.create('ul');
this._yearSelector.appendChild(yearUl);
if(thisYear > this._min._year){
var prevYearLi=InkElement.create('li');
prevYearLi.appendChild(InkElement.create('a', {
href: '#year_prev',
className: 'change_year_prev',
setHTML: this.i18n.text('datepicker.prev_button')
}));
yearUl.appendChild(prevYearLi);
}else{
yearUl.appendChild(InkElement.create('li', { setHTML: '&nbsp;' }));
}
for (var i=1; i < 11; i++){
if(i % 4===0){
yearUl=InkElement.create('ul');
this._yearSelector.appendChild(yearUl);
}
thisYear=firstYear + i - 1;
yearUl.appendChild(this._getYearButton(thisYear));
}
if(thisYear < this._max._year){
var nextYearLi=InkElement.create('li');
nextYearLi.appendChild(InkElement.create('a', {
href: '#year_next',
className: 'change_year_next',
setHTML: this.i18n.text('datepicker.next_button')
}));
yearUl.appendChild(nextYearLi);
}else{
yearUl.appendChild(InkElement.create('li', { setHTML: '&nbsp;' }));
}
this._monthPrev.childNodes[0].className='action_inactive';
this._monthNext.childNodes[0].className='action_inactive';
this._monthSelector.style.display='none';
this._monthContainer.style.display='none';
this._yearSelector.style.display='block';
},
_incrementViewingYear: function (inc){
if(!inc){ return; }
var year=+this._year + inc*10;
year=year - year % 10;
if(year > this._max._year||year + 9 < this._min._year){
return;
}
this._year=+this._year + inc*10;
},
_getYearButton: function (thisYear){
var className='';
if(!this._acceptableYear({ _year: thisYear })){
className='wcv-calendar-off';
}else if(thisYear===this._year){
className='wcv-calendar-on';
}
var li=InkElement.create('li');
li.appendChild(InkElement.create('a', {
href: '#',
'data-cal-year': thisYear,
className: className,
setTextContent: thisYear
}));
return li;
},
_showMonthSelector: function (){
this._yearSelector.style.display='none';
this._monthContainer.style.display='none';
this._monthPrev.childNodes[0].className='action_inactive';
this._monthNext.childNodes[0].className='action_inactive';
this._addMonthClassNames();
this._monthSelector.style.display='block';
},
_parseDate: function(dateStr){
var date=InkDate.set(this._options.format , dateStr);
if(date){
return dateishFromDate(date);
}
return null;
},
_isValidDate: function(date){
var yearRegExp=/^\d{4}$/;
var validOneOrTwo=/^\d{1,2}$/;
return (
yearRegExp.test(date._year)     &&
validOneOrTwo.test(date._month) &&
validOneOrTwo.test(date._day)   &&
+date._month + 1 >=1  &&
+date._month + 1 <=12 &&
+date._day       >=1  &&
+date._day       <=this._daysInMonth(date._year, date._month + 1)
);
},
_isDate: function(format, dateStr){
try {
if(typeof format==='undefined'){
return false;
}
var date=InkDate.set(format , dateStr);
if(date&&this._isValidDate(dateishFromDate(date))){
return true;
}} catch (ex){}
return false;
},
_acceptableDay: function (date){
return this._acceptableDateComponent(date, 'validDayFn');
},
_acceptableMonth: function (date){
return this._acceptableDateComponent(date, 'validMonthFn');
},
_acceptableYear: function (date){
return this._acceptableDateComponent(date, 'validYearFn');
},
_acceptableDateComponent: function (date, userCb){
if(this._options[userCb]){
return this._callUserCallbackBool(this._options[userCb], date);
}else{
return this._dateWithinRange(date);
}},
_writeDateInFormat:function(){
return InkDate.get(this._options.format , this.getDate());
},
setDate: function(dateString , objClicked){
if(dateString&&typeof dateString.getDate==='function'){
dateString=[ dateString.getFullYear(),
dateString.getMonth() + 1, dateString.getDate() ].join('-');
}
if(/\d{4}-\d{1,2}-\d{1,2}/.test(dateString) ){
var auxDate=dateString.split('-');
this._year=+auxDate[ 0 ];
this._month=+auxDate[ 1 ] - 1;
this._day=+auxDate[ 2 ];
}
this._setDate(objClicked);
},
getDate: function (){
if(!this._day){
throw 'Ink.UI.DatePicker: Still picking a date. Cannot getDate now!';
}
return new Date(this._year, this._month, this._day);
},
_setDate:function(objClicked){
if(objClicked){
var data=InkElement.data(objClicked);
this._day=(+data.calDay)||this._day;
if(this._options.onSetDate){
this._options.onSetDate(this , { date:this.getDate() });
}}
var dt=this._fitDateToRange(this);
this._year=dt._year;
this._month=dt._month;
this._day=dt._day;
if(!this._options.displayInSelect){
var formattedDate=this._writeDateInFormat();
if(formattedDate!==this._element.value){
this._element.value=formattedDate;
}}else{
this._options.dayField.value=this._day;
this._options.monthField.value=this._month + 1;
this._options.yearField.value=this._year;
}},
_updateCal: function(inc){
if(typeof this._options.onMonthSelected==='function'){
this._options.onMonthSelected(this, {
'year': this._year,
'month':this._month
});
}
if(inc&&this._updateMonth(inc)===null){
return;
}
this._renderMonth();
},
_daysInMonth: function(_y,_m){
var exceptions={
2: ((_y % 400===0)||(_y % 4===0&&_y % 100!==0)) ? 29:28,
4: 30,
6: 30,
9: 30,
11: 30
};
return exceptions[_m]||31;
},
_updateMonth: function(incValue){
var date;
if(incValue > 0){
date=this._getNextMonth();
}else if(incValue < 0){
date=this._getPrevMonth();
}
if(!date){ return null; }
this._year=date._year;
this._month=date._month;
this._day=date._day;
},
_getNextMonth: function (date){
return this._tryLeap(date, 'Month', 'next', function (d){
d._month +=1;
if(d._month > 11){
d._month=0;
d._year +=1;
}
return d;
});
},
_getPrevMonth: function (date){
return this._tryLeap(date, 'Month', 'prev', function (d){
d._month -=1;
if(d._month < 0){
d._month=11;
d._year -=1;
}
return d;
});
},
_getPrevYear: function (date){
return this._tryLeap(date, 'Year', 'prev', function (d){
d._year -=1;
return d;
});
},
_getNextYear: function (date){
return this._tryLeap(date, 'Year', 'next', function (d){
d._year +=1;
return d;
});
},
_tryLeap: function (date, atomName, directionName, advancer){
date=date||{ _year: this._year, _month: this._month, _day: this._day };
var maxOrMin=directionName==='prev' ? '_min':'_max';
var boundary=this[maxOrMin];
if(this._dateCmpUntil(date, boundary, atomName)===0){
return null;
}
var leapUserCb=this._options[directionName + 'ValidDateFn'];
if(leapUserCb){
return this._callUserCallbackDate(leapUserCb, date);
}else{
date=advancer(date);
}
var daysInThisMonth=this._daysInMonth(date._year, date._month + 1);
if(date._day > daysInThisMonth){
date._day=daysInThisMonth;
}
date=this._fitDateToRange(date);
return this['_acceptable' + atomName](date) ? date:null;
},
_getNextDecade: function (date){
date=date||{ _year: this._year, _month: this._month, _day: this._day };
var decade=this._getCurrentDecade(date);
if(decade + 10 > this._max._year){ return null; }
return decade + 10;
},
_getPrevDecade: function (date){
date=date||{ _year: this._year, _month: this._month, _day: this._day };
var decade=this._getCurrentDecade(date);
if(getDecade(decade - 10) < getDecade(this._min._year)){ return null; }
return decade - 10;
},
_getCurrentDecade: function (year){
year=year ? (year._year||year):this._year;
return getDecade(this._year);
},
_callUserCallbackBase: function (cb, date){
return cb.call(this, date._year, date._month + 1, date._day);
},
_callUserCallbackBool: function (cb, date){
return !!this._callUserCallbackBase(cb, date);
},
_callUserCallbackDate: function (cb, date){
var ret=this._callUserCallbackBase(cb, date);
return ret ? dateishFromDate(ret):null;
},
_dateParsers: {
'yyyy-mm-dd':'Y-m-d' ,
'yyyy/mm/dd':'Y/m/d' ,
'yy-mm-dd':'y-m-d' ,
'yy/mm/dd':'y/m/d' ,
'dd-mm-yyyy':'d-m-Y' ,
'dd/mm/yyyy':'d/m/Y' ,
'dd-mm-yy':'d-m-y' ,
'dd/mm/yy':'d/m/y' ,
'mm/dd/yyyy':'m/d/Y' ,
'mm-dd-yyyy':'m-d-Y'
},
_renderMonth: function(){
var month=this._month;
var year=this._year;
this._showDefaultView();
InkElement.setHTML(this._monthContainer, '');
this._monthContainer.appendChild(this._getMonthCalendarHeader(this._options.startWeekDay));
this._monthContainer.appendChild(this._getDayButtons(year, month));
},
_getFirstDayIndex: function (year, month){
var wDayFirst=(new Date(year , month , 1)).getDay();
var startWeekDay=this._options.startWeekDay||0;
var result=wDayFirst - startWeekDay;
result %=7;
if(result < 0){
result +=7;
}
return result;
},
_getDayButtons: function (year, month){
var daysInMonth=this._daysInMonth(year, month + 1);
var ret=document.createDocumentFragment();
var ul=InkElement.create('ul');
ret.appendChild(ul);
var firstDayIndex=this._getFirstDayIndex(year, month);
for (var i=0; i < firstDayIndex; i ++){
ul.appendChild(InkElement.create('li', {
className: 'wcv-calendar-empty',
setHTML: '&nbsp;'
}));
}
for (var day=1; day <=daysInMonth; day++){
if((day - 1 + firstDayIndex) % 7===0){
ul=InkElement.create('ul');
ret.appendChild(ul);
}
ul.appendChild(this._getDayButton(year, month, day));
}
return ret;
},
_getDayButton: function (year, month, day){
var attrs={};
var date=dateishFromYMD(year, month, day);
if(!this._acceptableDay(date)){
attrs.className='wcv-calendar-off';
}else{
attrs['data-cal-day']=day;
if(this._day&&this._dateCmp(date, this)===0){
attrs.className='wcv-calendar-on';
}}
attrs.setTextContent=day;
var dayButton=InkElement.create('li');
dayButton.appendChild(InkElement.create('a', attrs));
return dayButton;
},
_getMonthCalendarHeader: function (startWeekDay){
var header=InkElement.create('ul', {
className: 'wcv-calendar-header'
});
var wDay;
for(var i=0; i<7; i++){
wDay=(startWeekDay + i) % 7;
header.appendChild(InkElement.create('li', {
setTextContent: this.i18n.getKey('datepicker.week_days')[wDay].substring(0, 1)
}));
}
return header;
},
_addMonthClassNames: function(parent){
InkArray.forEach((parent||this._monthSelector).getElementsByTagName('a'),
Ink.bindMethod(this, '_addMonthButtonClassNames'));
},
_addMonthButtonClassNames: function (btn){
var data=InkElement.data(btn);
if(!data.calMonth){ throw 'not a calendar month button!'; }
var month=+data.calMonth - 1;
if(month===this._month){
Css.addClassName(btn, 'wcv-calendar-on');
Css.removeClassName(btn, 'wcv-calendar-off');
}else{
Css.removeClassName(btn, 'wcv-calendar-on');
var toDisable = !this._acceptableMonth({_year: this._year, _month: month});
Css.addRemoveClassName(btn, 'wcv-calendar-off', toDisable);
}},
setI18n: function (i18n){
if(i18n.clone){
i18n=i18n.clone();
}
this.i18n=i18n;
},
getI18n: function (){
return this.i18n||datePickerI18n;
},
setLanguage: function (language){
if(!this.i18n){
this.setI18n(datePickerI18n);
}
this.i18n.lang(language);
},
getLanguage: function (){
return this.i18n ? this.i18n.lang():datePickerI18n.lang();
},
showMonth: function(){
this._renderMonth();
},
isMonthRendered: function(){
var header=Selector.select('.wcv-calendar-header', this._containerObject)[0];
return ((Css.getStyle(header.parentNode,'display')!=='none') &&
(Css.getStyle(header.parentNode.parentNode,'display')!=='none'));
},
destroy: function (){
InkElement.unwrap(this._element);
InkElement.remove(this._wrapper);
InkElement.remove(this._containerObject);
Common.unregisterInstance.call(this);
}};
Common.createUIComponent(DatePicker);
return DatePicker;
});
Ink.createModule('Ink.UI.DragDrop', 1, ['Ink.Dom.Element_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Util.Array_1', 'Ink.UI.Common_1', 'Ink.Dom.Selector_1'], function(InkElement, InkEvent, InkCss, InkArray, UICommon, Selector){
'use strict';
function findElementUnderMouse(opt){
opt.exceptFor.style.display='none';
var ret=document.elementFromPoint(opt.x,
opt.y);
opt.exceptFor.style.display='';
return ret;
}
function DragDrop(){
UICommon.BaseUIComponent.apply(this, arguments);
}
DragDrop._name='DragDrop_1';
DragDrop._optionDefinition={
dragItem:       ['String', '.drag-item'],
dragHandle:     ['String', '.drag-handle'],
dropZone:       ['String', '.drop-zone'],
ignoreDrag:     ['String', '.drag-ignore'],
draggedCloneClass: ['String', 'drag-cloned-item'],
placeholderClass: ['String', 'drag-placeholder-item'],
onDrag:         ['Function', null],
onDrop:         ['Function', null]
};
DragDrop.prototype={
_init: function(){
this._dragActive=false;
this._draggedElm=null;
this._clonedElm=null;
this._placeholderElm=null;
this._originalDrop=null;
this._mouseDelta=[0, 0];
this._addEvents();
},
_addEvents: function(){
InkEvent.on(this._element, 'mousedown touchstart', Ink.bindEvent(this._onMouseDown, this));
},
_onMouseDown: function(event){
var tgt=InkEvent.element(event);
var draggedElm=InkElement.findUpwardsBySelector(tgt, this._options.dragItem);
var elmIgnoreDraggable=InkElement.findUpwardsBySelector(tgt, this._options.ignoreDrag);
if(draggedElm&&!elmIgnoreDraggable){
var handleElm=Ink.s(this._options.dragHandle, draggedElm);
if(handleElm&&InkElement.findUpwardsBySelector(tgt, this._options.dragHandle)){
this._dragActive=true;
}else if(!handleElm){
this._dragActive=true;
}
if(this._dragActive){
InkEvent.stopDefault(event);
this._startDrag(event, draggedElm);
}}
},
_startDrag: function(event, draggedElm){
this._clonedElm=draggedElm.cloneNode(true);
this._placeholderElm=draggedElm.cloneNode(false);
InkCss.addClassName(this._clonedElm, this._options.draggedCloneClass);
this._clonedElm.removeAttribute('id');
InkCss.addClassName(this._placeholderElm, this._options.placeholderClass);
this._placeholderElm.removeAttribute('id');
var rect=draggedElm.getBoundingClientRect();
var dragElmDims=[
rect.right - rect.left,
rect.bottom - rect.top
];
this._clonedElm.style.width=dragElmDims[0] + 'px';
this._clonedElm.style.height=dragElmDims[1] + 'px';
this._placeholderElm.style.width=dragElmDims[0] + 'px';
this._placeholderElm.style.height=dragElmDims[1] + 'px';
this._placeholderElm.style.visibility='hidden';
this._clonedElm.style.position='fixed';
this._clonedElm.style.zIndex='1000';
this._clonedElm.style.left=rect.left + 'px';
this._clonedElm.style.top=rect.top + 'px';
var mousePos=InkEvent.pointer(event);
var dragElmPos=InkElement.offset(draggedElm);
this._mouseDelta=[
(mousePos.x - dragElmPos[0]),
(mousePos.y - dragElmPos[1])
];
this._clonedElm.style.opacity='0.6';
draggedElm.parentNode.insertBefore(this._clonedElm, draggedElm);
this._draggedElm=draggedElm;
draggedElm.parentNode.insertBefore(this._placeholderElm, draggedElm);
InkCss.addClassName(draggedElm, 'hide-all');
var hasOnDrag=typeof this._options.onDrag==='function';
var hasOnDrop=typeof this._options.onDrop==='function';
if(hasOnDrag||hasOnDrop){
var dragEvent={
dragItem: this._draggedElm,
dropZone: this.getDropZone(this._draggedElm)
};
if(hasOnDrag){
this._options.onDrag.call(this, dragEvent);
}
if(hasOnDrop){
this._originalDrop=dragEvent.dropZone;
}}
var mouseMoveThrottled=InkEvent.throttle(this._onMouseMove, 50, {
preventDefault: true,
bind: this
});
InkEvent.on(document, 'mousemove.inkdraggable touchmove.inkdraggable', mouseMoveThrottled);
InkEvent.on(document, 'mouseup.inkdraggable touchend.inkdraggable',
Ink.bindEvent(this._onMouseUp, this));
},
_onMouseMove: function(event){
if(!this._dragActive){ return; }
var mousePos=InkEvent.pointer(event);
var scrollLeft=InkElement.scrollWidth();
var scrollTop=InkElement.scrollHeight();
this._clonedElm.style.left =
(mousePos.x - this._mouseDelta[0] - scrollLeft) + 'px';
this._clonedElm.style.top =
(mousePos.y - this._mouseDelta[1] - scrollTop) + 'px';
var elUnderMouse=findElementUnderMouse({
x: mousePos.x - scrollLeft,
y: mousePos.y - scrollTop,
exceptFor: this._clonedElm
});
var dropZoneUnderMouse =
this.getDropZone(elUnderMouse);
var isMyDropZone=dropZoneUnderMouse&&(
InkElement.isAncestorOf(this._element, dropZoneUnderMouse) ||
this._element===dropZoneUnderMouse);
if(dropZoneUnderMouse&&isMyDropZone){
var otherDragItem =
InkElement.findUpwardsBySelector(elUnderMouse, this._options.dragItem);
if(otherDragItem&&this.isDragItem(otherDragItem)){
this._insertPlaceholder(otherDragItem);
}else if(this._dropZoneIsEmpty(dropZoneUnderMouse)){
dropZoneUnderMouse.appendChild(this._placeholderElm);
}}
},
isDragItem: function (elm){
return (
Selector.matchesSelector(elm, this._options.dragItem) &&
elm!==this._draggedElm &&
elm!==this._placeholderElm &&
elm!==this._clonedElm);
},
_dropZoneIsEmpty: function (dropZone){
var dragItems=Ink.ss(this._options.dragItem, dropZone);
return !InkArray.some(dragItems, Ink.bindMethod(this, 'isDragItem'));
},
_onMouseUp: function(){
if(!this._dragActive){ return; }
InkElement.insertBefore(this._draggedElm, this._placeholderElm);
InkElement.remove(this._placeholderElm);
InkElement.remove(this._clonedElm);
InkCss.removeClassName(this._draggedElm, 'hide-all');
InkEvent.off(document, '.inkdraggable');
this._dragActive=false;
if(typeof this._options.onDrop==='function'){
this._options.onDrop.call(this, {
origin: this._originalDrop,
dragItem: this._draggedElm,
dropZone: this.getDropZone(this._draggedElm)
});
}
this._placeholderElm=null;
this._clonedElm=null;
this._draggedElm=null;
this._originalDrop=null;
},
getDropZone: function (dragItem){
var ret=InkElement.findUpwardsBySelector(dragItem, this._options.dropZone)||this._element;
if(InkElement.isAncestorOf(this._element, ret)||ret===this._element){
return ret;
}
return null;
},
getDraggedElement: function (){
if(!this.dragActive){
return null;
}
return this._draggedElm;
},
_insertPlaceholder: function(elm){
var goesAfter=true;
if(!InkArray.inArray(this._placeholderElm, InkElement.previousSiblings(elm))){
goesAfter=false;
}
if(goesAfter){
InkElement.insertAfter(this._placeholderElm, elm);
}else{
InkElement.insertBefore(this._placeholderElm, elm);
}},
destroy: function (){
if(this._dragActive){
InkEvent.off(document, '.inkdraggable');
}
UICommon.destroyComponent.call(this);
}};
UICommon.createUIComponent(DragDrop);
return DragDrop;
});
Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function(InkElement, InkEvent, Css, Browser, Selector, Common){
'use strict';
var x=0,
y=1;
function between (val, min, max){
val=Math.min(val, max);
val=Math.max(val, min);
return val;
}
function Draggable(){
Common.BaseUIComponent.apply(this, arguments);
}
Draggable._name='Draggable_1';
Draggable._optionDefinition={
constraint:         ['String', false],
constraintElm:      ['Element', false],
top:                ['Number', false],
right:              ['Number', false],
bottom:             ['Number', false],
left:               ['Number', false],
handle:             ['Element', false],
revert:             ['Boolean', false],
cursor:             ['String', 'move'],
zIndex:             ['Number', 9999],
fps:                ['Number', 0],
droppableProxy:     ['Element', false],
mouseAnchor:        ['String', undefined],
dragClass:          ['String', 'drag'],
skipChildren:       ['Boolean', true],
onStart:            ['Function', false],
onEnd:              ['Function', false],
onDrag:             ['Function', false],
onChange:           ['Function', false]
};
Draggable.prototype={
_init: function(){
var o=this._options;
this.constraintElm=o.constraintElm&&Common.elOrSelector(o.constraintElm);
this.handle=false;
this.elmStartPosition=false;
this.active=false;
this.dragged=false;
this.prevCoords=false;
this.placeholder=false;
this.position=false;
this.zindex=false;
this.firstDrag=true;
if(o.fps){
this.deltaMs=1000 / o.fps;
this.lastRunAt=0;
}
this.handlers={};
this.handlers.start=Ink.bindEvent(this._onStart,this);
this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this);
this.handlers.drag=Ink.bindEvent(this._onDrag,this);
this.handlers.end=Ink.bindEvent(this._onEnd,this);
this.handlers.selectStart=function(event){    InkEvent.stop(event);    return false;    };
this.handle=(this._options.handle) ?
Common.elOrSelector(this._options.handle) :
this._element;
this.handle.style.cursor=o.cursor;
InkEvent.observe(this.handle, 'touchstart', this.handlers.start);
InkEvent.observe(this.handle, 'mousedown', this.handlers.start);
if(Browser.IE){
InkEvent.observe(this._element, 'selectstart', this.handlers.selectStart);
}},
destroy: function(){
InkEvent.stopObserving(this.handle, 'touchstart', this.handlers.start);
InkEvent.stopObserving(this.handle, 'mousedown', this.handlers.start);
if(Browser.IE){
InkEvent.stopObserving(this._element, 'selectstart', this.handlers.selectStart);
}},
_getCoords: function(e){
var ps=[InkElement.scrollWidth(), InkElement.scrollHeight()];
return {
x: (e.touches ? e.touches[0].clientX:e.clientX) + ps[x],
y: (e.touches ? e.touches[0].clientY:e.clientY) + ps[y]
};},
_cloneStyle: function(src, dst){
dst.className=src.className;
dst.style.borderWidth='0';
dst.style.padding='0';
dst.style.position='absolute';
dst.style.width=InkElement.elementWidth(src)        + 'px';
dst.style.height=InkElement.elementHeight(src)    + 'px';
dst.style.left=InkElement.elementLeft(src)        + 'px';
dst.style.top=InkElement.elementTop(src)        + 'px';
dst.style.cssFloat=Css.getStyle(src, 'float');
dst.style.display=Css.getStyle(src, 'display');
},
_onStart: function(e){
if(!this.active&&InkEvent.isLeftClick(e)||typeof e.button==='undefined'){
var tgtEl=InkEvent.element(e);
if(this._options.skipChildren&&tgtEl!==this.handle){    return;    }
InkEvent.stop(e);
Css.addClassName(this._element, this._options.dragClass);
this.elmStartPosition=[
InkElement.elementLeft(this._element),
InkElement.elementTop(this._element)
];
var pos=[
parseInt(Css.getStyle(this._element, 'left'), 10),
parseInt(Css.getStyle(this._element, 'top'),  10)
];
var dims=InkElement.elementDimensions(this._element);
this.originalPosition=[ pos[x] ? pos[x]: null, pos[y] ? pos[y]:null ];
this.delta=this._getCoords(e);
this.active=true;
this.position=Css.getStyle(this._element, 'position');
this.zindex=Css.getStyle(this._element, 'zIndex');
var div=document.createElement('div');
div.style.position=this.position;
div.style.width=dims[x] + 'px';
div.style.height=dims[y] + 'px';
div.style.marginTop=Css.getStyle(this._element, 'margin-top');
div.style.marginBottom=Css.getStyle(this._element, 'margin-bottom');
div.style.marginLeft=Css.getStyle(this._element, 'margin-left');
div.style.marginRight=Css.getStyle(this._element, 'margin-right');
div.style.borderWidth='0';
div.style.padding='0';
div.style.cssFloat=Css.getStyle(this._element, 'float');
div.style.display=Css.getStyle(this._element, 'display');
div.style.visibility='hidden';
this.delta2=[ this.delta.x - this.elmStartPosition[x], this.delta.y - this.elmStartPosition[y] ];
if(this._options.mouseAnchor){
var parts=this._options.mouseAnchor.split(' ');
var ad=[dims[x], dims[y]];
if(parts[0]==='left'){    ad[x]=0;    }else if(parts[0]==='center'){    ad[x]=parseInt(ad[x]/2, 10);    }
if(parts[1]==='top'){     ad[y]=0;    }else if(parts[1]==='center'){    ad[y]=parseInt(ad[y]/2, 10);    }
this.applyDelta=[this.delta2[x] - ad[x], this.delta2[y] - ad[y]];
}
var dragHandlerName=this._options.fps ? 'dragFacade':'drag';
this.placeholder=div;
if(this._options.onStart){        this._options.onStart(this._element, e);        }
if(this._options.droppableProxy){
this.proxy=document.createElement('div');
dims=[
window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,
window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight
];
var fs=this.proxy.style;
fs.width=dims[x] + 'px';
fs.height=dims[y] + 'px';
fs.position='fixed';
fs.left='0';
fs.top='0';
fs.zIndex=this._options.zIndex + 1;
fs.backgroundColor='#FF0000';
Css.setOpacity(this.proxy, 0);
var firstEl=document.body.firstChild;
while (firstEl&&firstEl.nodeType!==1){    firstEl=firstEl.nextSibling;    }
document.body.insertBefore(this.proxy, firstEl);
InkEvent.observe(this.proxy, 'mousemove', this.handlers[dragHandlerName]);
InkEvent.observe(this.proxy, 'touchmove', this.handlers[dragHandlerName]);
}else{
InkEvent.observe(document, 'mousemove', this.handlers[dragHandlerName]);
}
this._element.style.position='absolute';
this._element.style.zIndex=this._options.zIndex;
this._element.parentNode.insertBefore(this.placeholder, this._element);
this._onDrag(e);
InkEvent.observe(document, 'mouseup',      this.handlers.end);
InkEvent.observe(document, 'touchend',     this.handlers.end);
return false;
}},
_onDragFacade: function(e){
var now=+new Date();
if(!this.lastRunAt||now > this.lastRunAt + this.deltaMs){
this.lastRunAt=now;
this._onDrag(e);
}},
_onDrag: function(e){
if(this.active){
InkEvent.stop(e);
this.dragged=true;
var mouseCoords=this._getCoords(e),
mPosX=mouseCoords.x,
mPosY=mouseCoords.y,
o=this._options,
newX=false,
newY=false;
if(this.prevCoords&&mPosX!==this.prevCoords.x||mPosY!==this.prevCoords.y){
if(o.onDrag){        o.onDrag(this._element, e);        }
this.prevCoords=mouseCoords;
newX=this.elmStartPosition[x] + mPosX - this.delta.x;
newY=this.elmStartPosition[y] + mPosY - this.delta.y;
var draggableSize=InkElement.elementDimensions(this._element);
if(this.constraintElm){
var offset=InkElement.offset(this.constraintElm);
var size=InkElement.elementDimensions(this.constraintElm);
var constTop=offset[y] + (o.top||0),
constBottom=offset[y] + size[y] - (o.bottom||0),
constLeft=offset[x] + (o.left||0),
constRight=offset[x] + size[x] - (o.right||0);
newY=between(newY, constTop, constBottom - draggableSize[y]);
newX=between(newX, constLeft, constRight - draggableSize[x]);
}else if(o.constraint){
var right=o.right===false ? InkElement.pageWidth() - draggableSize[x]:o.right,
left=o.left===false ? 0:o.left,
top=o.top===false ? 0:o.top,
bottom=o.bottom===false ? InkElement.pageHeight() - draggableSize[y]:o.bottom;
if(o.constraint==='horizontal'||o.constraint==='both'){
newX=between(newX, left, right);
}
if(o.constraint==='vertical'||o.constraint==='both'){
newY=between(newY, top, bottom);
}}
var Droppable=Ink.getModule('Ink.UI.Droppable_1');
if(this.firstDrag){
if(Droppable){    Droppable.updateAll();    }
this.firstDrag=false;
}
if(newX){        this._element.style.left=newX + 'px';        }
if(newY){        this._element.style.top=newY + 'px';        }
if(Droppable){
var mouseCoords2=this._options.mouseAnchor ?
{x: mPosX - this.applyDelta[x], y: mPosY - this.applyDelta[y]} :
mouseCoords;
Droppable.action(mouseCoords2, 'drag', e, this._element);
}
if(o.onChange){    o.onChange(this);    }}
}},
_onEnd: function(e){
InkEvent.stopObserving(document, 'mousemove', this.handlers.drag);
InkEvent.stopObserving(document, 'touchmove', this.handlers.drag);
if(this._options.fps){
this._onDrag(e);
}
Css.removeClassName(this._element, this._options.dragClass);
if(this.active&&this.dragged){
if(this._options.droppableProxy){
document.body.removeChild(this.proxy);
}
if(this.pt){
InkElement.remove(this.pt);
this.pt=undefined;
}
if(this.placeholder){
InkElement.remove(this.placeholder);
}
if(this._options.revert){
this._element.style.position=this.position;
if(this.zindex!==null){
this._element.style.zIndex=this.zindex;
}else{
this._element.style.zIndex='auto';
}
this._element.style.left=(this.originalPosition[x]) ? this.originalPosition[x] + 'px':'';
this._element.style.top=(this.originalPosition[y]) ? this.originalPosition[y] + 'px':'';
}
if(this._options.onEnd){
this._options.onEnd(this._element, e);
}
var Droppable=Ink.getModule('Ink.UI.Droppable_1');
if(Droppable){
Droppable.action(this._getCoords(e), 'drop', e, this._element);
}
this.position=false;
this.zindex=false;
this.firstDrag=true;
}
this.active=false;
this.dragged=false;
}};
Common.createUIComponent(Draggable);
return Draggable;
});
Ink.createModule('Ink.UI.Drawer', '1', ['Ink.UI.Common_1', 'Ink.Dom.Loaded_1', 'Ink.Dom.Selector_1', 'Ink.Dom.Element_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function(Common, Loaded, Selector, Element, Event, Css){
'use strict';
var sFocusableElms=[
'[tabindex]:not([tabindex="-1"])',
'input',
'select',
'textarea',
'button',
'object',
'a[href]',
'area'
].join(',');
var onlyWrapper=null;
function pageWideFocusListener(callback){
if(!document.addEventListener){ return; }
if(onlyWrapper){
_removePageWideFocusListener();
}
var mouseIsDown=false;
onlyWrapper=function (ev){
if(ev.type==='mousedown'||ev.type==='mouseup'){
mouseIsDown=ev.type==='mousedown';
return;
}
if(mouseIsDown){ return; }
callback(ev.target);
};
document.addEventListener('focus', onlyWrapper, true);
document.addEventListener('mousedown', onlyWrapper, true);
document.addEventListener('mouseup', onlyWrapper, true);
}
function _removePageWideFocusListener(){
if(!document.addEventListener){ return; }
if(!onlyWrapper){ return; }
document.removeEventListener('focus', onlyWrapper, true);
document.removeEventListener('mousedown', onlyWrapper, true);
document.removeEventListener('mouseup', onlyWrapper, true);
onlyWrapper=null;
}
function focusFirstFocusableElementInside(container){
var withTabIndex=Ink.ss('[tabindex]', container);
var lowestTabIndex=null;
var lowestTabIndexElm=null;
for (var i=0; i < withTabIndex.length; i++){
var ind=+withTabIndex[i].tabIndex;
if(!ind ){
withTabIndex.splice(i, 1);
}
if(lowestTabIndex===null||ind < lowestTabIndex){
lowestTabIndex=ind;
lowestTabIndexElm=withTabIndex[i];
}}
if(lowestTabIndexElm){
lowestTabIndexElm.focus();
return true;
}
var firstFocusable=Ink.s(sFocusableElms, container);
if(firstFocusable){
firstFocusable.focus();
return true;
}
return false;
}
function elNotFound(el){
return 'Ink.UI.Drawer_1: Could not find the "' +
el + '" element on this page. Please make sure it exists.';
}
var transitionSupport=(function (div){
var transitions={
'WebkitTransitionProperty': 'webkitTransitionEnd',
'transitionProperty': 'transitionend'
};
for (var t in transitions){
if(transitions.hasOwnProperty(t)){
if(div.style[t]!==undefined){
return { styleProp: t, eventName: transitions[t] };}}
}
return false;
}(document.createElement('div')));
function Drawer(el, options){
if(!Common.isDOMElement(el)){
options=el;
}
Common.BaseUIComponent.apply(this, [document.body, options]);
}
Drawer.transitionSupport=transitionSupport;
Drawer._name='Drawer_1';
Drawer._optionDefinition={
parentSelector:     ['String', '.ink-drawer'],
leftDrawer:         ['String', '.left-drawer'],
leftTrigger:        ['String', '.left-drawer-trigger'],
rightDrawer:        ['String', '.right-drawer'],
rightTrigger:       ['String', '.right-drawer-trigger'],
contentDrawer:      ['String', '.content-drawer'],
mode:               ['String', 'push'],
sides:              ['String', 'both']
};
Drawer.prototype={
/**
* Displays off-canvas content which can be triggered by clicking elements with the 'left-drawer-trigger' and 'right-drawer-trigger', respectively.
* The left drawer has the 'left-drawer' class, and the right drawer has the 'right-drawer' class. The content drawer (EG your `<div id="main">`) must have the 'content-drawer' class. For more, see the example below, or try the sample.
* @class Ink.UI.Drawer_1
* @constructor
*
* @param {Object}      [options]                       Configuration options.
* @xparam {String}     [options.parentSelector='.ink-drawer']       The class you are using in your wrapper (in the example below, it's the `body` tag.)
* @xparam {String}     [options.leftDrawer='.left-drawer']          Selector for the left drawer element. This element is placed outside the screen and shown when you click the `leftTrigger` element.
* @xparam {String}     [options.leftTrigger='.left-drawer-trigger'] Selector for the left drawer trigger(s). When you click this trigger, the `leftDrawer` is shown.
* @xparam {String}     [options.rightDrawer='.right-drawer']        Right drawer selector. (see `options.leftDrawer`)
* @xparam {String}     [options.rightTrigger='.right-drawer-trigger'] Right trigger selector (see `options.leftTrigger`)
* @xparam {String}     [options.contentDrawer='.content-drawer']    Selector for the content drawer.
* @param {String}      [options.mode='push']                        This can be 'push' or 'over'.
* @param {String}      [options.sides='both']                       Can be 'left', 'right', or 'both'. Controls what sides have a drawer.
*
* @example
* <body class="ink-drawer">
*     <div class="left-drawer">
*         Right drawer content...
*     </div>
*     <div class="right-drawer">
*         Left drawer content...
*     </div>
*     <div id="main-content" class="content-drawer ink-grid">
*         <a class="left-drawer-trigger" href="">Open left drawer</a>
*         <a class="right-drawer-trigger" href="">Open right drawer</a>
*         Content...
*     </div>
* </body>
*
* <script>*     Ink.requireModules(['Ink.UI.Drawer_1'], function (Drawer){
*         new Drawer();
*     });
*</script>
*/
_init: function (){
this._contentDrawers=Ink.ss(this._options.contentDrawer);
this._leftDrawer=Ink.s(this._options.leftDrawer);
this._leftTriggers=Ink.ss(this._options.leftTrigger);
this._rightDrawer=Ink.s(this._options.rightDrawer);
this._rightTriggers=Ink.ss(this._options.rightTrigger);
Css.addClassName(document.body, 'ink-drawer');
if(this._contentDrawers.length===0){
throw new Error('Ink.UI.Drawer_1: Could not find any "' +
this._options.contentDrawer + '" elements on this page. ' +
'Please make sure you have at least one.');
}
switch (this._options.sides){
case 'both':
this._triggers =
this._options.leftTrigger + ', ' +
this._options.rightTrigger + ', ' +
this._options.contentDrawer;
break;
case 'left':
this._triggers =
this._options.leftTrigger + ', ' +
this._options.contentDrawer;
break;
case 'right':
this._triggers =
this._options.rightTrigger + ', ' +
this._options.contentDrawer;
break;
}
var atLeastOneSide=false;
var errorMsg=null;
function validateSide(side){
if(side.drawer&&side.triggers.length){
atLeastOneSide=true;
}else{
errorMsg=side.drawer ? elNotFound(side.drawerOption):elNotFound(side.triggerOption);
}}
if(this._options.sides==='left'||this._options.sides==='both'){
validateSide({
name: 'left',
drawer: this._leftDrawer,
drawerOption: this._options.leftDrawer,
triggers: this._leftTriggers,
triggerOption: this._options.leftTrigger
});
}
if(this._options.sides==='right'||this._options.sides==='both'){
validateSide({
name: 'right',
drawer: this._rightDrawer,
drawerOption: this._options.rightDrawer,
triggers: this._rightTriggers,
triggerOption: this._options.rightTrigger
});
}
if(!atLeastOneSide){
Ink.warn(errorMsg);
}
this._isOpen=false;
this._direction=undefined;
this._handlers={
click:     Ink.bindEvent(this._onClick, this),
afterTransition: Ink.bindEvent(this._afterTransition, this)
};
this._addEvents();
},
_onClick: function(ev){
var clickedTrigger =
Element.findUpwardsBySelector(ev.currentTarget, this._options.leftTrigger) ? 'left' :
Element.findUpwardsBySelector(ev.currentTarget, this._options.rightTrigger) ? 'right':null;
if(clickedTrigger){
this._onTriggerClicked(ev, clickedTrigger);
return;
}
if(this._isOpen){
var clickedInContent=Element.findUpwardsBySelector(ev.currentTarget, this._options.contentDrawer);
var clickedInLink=Element.isLink(ev.target);
if(clickedInContent||clickedInLink){
this.close();
}
if(clickedInContent){
ev.preventDefault();
}}
},
_onTriggerClicked: function (ev, side){
if(this._isOpen){
this.close();
}else{
this.open(side);
}
ev.preventDefault();
},
_afterTransition: function(){
if(!this._isOpen){
Css.removeClassName(this._getRecentDrawer(), 'show');
}},
_addEvents: function(){
Event.on(document.body, 'click', this._triggers + ', a[href*="#"]', this._handlers.click);
},
_getRecentDrawer: function (){
return  this._direction==='left'  ? this._leftDrawer :
this._direction==='right' ? this._rightDrawer:null;
},
open: function(direction){
this._isOpen=true;
this._direction=direction;
var drawerEl=this._getRecentDrawer();
Css.addClassName(drawerEl ,'show');
setTimeout(Ink.bind(function(){
Css.addClassName(document.body, [this._options.mode, direction]);
},this), 0);
if(transitionSupport&&this._transitionWillOccur(drawerEl)){
Event.one(drawerEl,
transitionSupport.eventName,
function (){
Css.removeClassName(drawerEl, 'show');
var uselessValue=+drawerEl.offsetWidth;
Css.addClassName(drawerEl, 'show');
});
}
var lastFocused=document.activeElement;
var didFocus=focusFirstFocusableElementInside(drawerEl);
pageWideFocusListener(Ink.bind(function (target){
var insideDrawer=Element.isAncestorOf(drawerEl, target);
if(insideDrawer){ return; }
this.close();
_removePageWideFocusListener();
if(didFocus&&lastFocused){
lastFocused.focus();
}}, this));
},
_transitionWillOccur: function (elm){
return !!(transitionSupport&&Css.getStyle(elm, transitionSupport.styleProp));
},
close: function(){
if(this._isOpen===false){ return; }
var drawerEl=this._getRecentDrawer();
if(!drawerEl){ return; }
_removePageWideFocusListener();
this._isOpen=false;
var transitioning=null;
if(transitionSupport){
transitioning=this._transitionWillOccur(this._getRecentDrawer());
}
Css.removeClassName(document.body, [this._options.mode, this._direction]);
if(transitioning){
Event.one(document.body, transitionSupport.eventName, this._handlers.afterTransition);
}else{
this._handlers.afterTransition();
}}
};
Common.createUIComponent(Drawer);
return Drawer;
});
Ink.createModule('Ink.UI.Dropdown', '1', ['Ink.UI.Common_1', 'Ink.UI.Toggle_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(Common, Toggle, InkEvent, InkElement){
'use strict';
function Dropdown(){
Common.BaseUIComponent.apply(this, arguments);
}
Dropdown._name='Dropdown_1';
Dropdown._optionDefinition={
'target':           ['Element', null],
'hoverOpen':        ['Number', null],
'dismissOnInsideClick': ['Boolean', false],
'dismissOnOutsideClick': ['Boolean', true],
'dismissAfter':     ['Number', null],
'onInsideClick':    ['Function', null],
'onOutsideClick':   ['Function', null],
'onOpen':           ['Function', null],
'onDismiss':        ['Function', null]
};
Dropdown.prototype={
_init: function(){
if(this._options.target===null){
this._options.target=Ink.s('.dropdown-menu', this._element);
if(!this._options.target){
throw new Error('Dropdown: You did not specify a "target" option, and cannot find an element with the .dropdown-menu class!');
}}
this._toggle=new Toggle(this._element, {
target: this._options.target,
closeOnInsideClick: null,
closeOnClick: false,
onChangeState: Ink.bind(function (newState){
return this._openOrDismiss(newState, true, true);
}, this)
});
InkEvent.observeMulti([this._options.target, this._element],
'mouseout', Ink.bindMethod(this, '_onMouseOut'));
InkEvent.observeMulti([this._options.target, this._element],
'mouseover', Ink.bindMethod(this, '_onMouseOver'));
InkEvent.observe(this._options.target, 'click', Ink.bindMethod(this, '_onInsideClick'));
InkEvent.observe(document, 'click', Ink.bindMethod(this, '_onOutsideClick'));
},
_onMouseOver: function (){
if(typeof this._options.hoverOpen==='number'&&this._toggle.getState()===false){
clearTimeout(this._openTimeout);
this._openTimeout=setTimeout(
Ink.bindMethod(this, 'open', true),
this._options.hoverOpen * 1000);
}
if(typeof this._options.dismissAfter==='number'){
clearTimeout(this._dismissTimeout);
}},
_onMouseOut: function (){
if(typeof this._options.dismissAfter==='number'&&this._toggle.getState()===true){
clearTimeout(this._dismissTimeout);
this._dismissTimeout=setTimeout(
Ink.bindMethod(this, 'dismiss', true),
this._options.dismissAfter * 1000);
}
if(typeof this._options.hoverOpen==='number'){
clearTimeout(this._openTimeout);
}},
_onInsideClick: function (event){
var ret=this._handlerCall('onInsideClick', InkEvent.element(event));
if(ret===false){ return; }
if(this._options.dismissOnInsideClick){
this.dismiss(true);
}},
_onOutsideClick: function (event){
var target=InkEvent.element(event);
var foundElem=InkElement.findUpwardsHaving(target, Ink.bind(function (needle){
return needle===this._element;
}, this));
var foundTarget=InkElement.findUpwardsHaving(target, Ink.bind(function (needle){
return needle===this._options.target;
}, this));
if(!foundElem&&!foundTarget){
var ret=this._handlerCall('onOutsideClick', target);
if(ret===false){ return; }
if(this._options.dismissOnOutsideClick){
this.dismiss(true);
}}
},
dismiss: function (callHandler){
this._openOrDismiss(false, callHandler, arguments[1]);
},
open: function (callHandler){
this._openOrDismiss(true, callHandler, arguments[1]);
},
_openOrDismiss: function (newState, callHandler, _doNotInformToggle){
if(this._toggle&&this._toggle.getState()===newState){ return; }
if(callHandler){
if(this._handlerCall(newState ? 'onOpen':'onDismiss')===false){
return false;
}}
if(!_doNotInformToggle){
this._toggle.setState(newState);
}
clearTimeout(this._dismissTimeout);
clearTimeout(this._openTimeout);
},
_handlerCall: function (handler){
if(this._options[handler]){
return this._options[handler].call(this, [].slice.call(arguments, 1));
}}
};
Common.createUIComponent(Dropdown);
return Dropdown;
});
Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.UI.Common_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1"], function(InkElement, InkEvent, Css, Common, InkArray, Selector){
'use strict';
var hAddClassName=function (element){
return function (className){return Css.addClassName(element, className);};};
var hRemoveClassName=function (element){
return function (className){return Css.removeClassName(element, className);};};
var Droppable={
debug: false,
_droppables: [],
_draggables: [],
add: function(element, options){
element=Common.elOrSelector(element, 'Droppable.add target element');
var opt=Ink.extendObj({
hoverClass:     options.hoverclass ||false,
accept:         false,
onHover:        false,
onDrop:         false,
onDropOut:      false
}, options||{}, InkElement.data(element));
if(typeof opt.hoverClass==='string'){
opt.hoverClass=opt.hoverClass.split(/\s+/);
}
function cleanStyle(draggable){
draggable.style.position='inherit';
}
var that=this;
var namedEventHandlers={
move: function (draggable, droppable){
cleanStyle(draggable);
droppable.appendChild(draggable);
},
copy: function (draggable, droppable){
cleanStyle(draggable);
droppable.appendChild(draggable.cloneNode(true));
},
revert: function (draggable){
that._findDraggable(draggable).originalParent.appendChild(draggable);
cleanStyle(draggable);
}};
var name;
if(typeof opt.onHover==='string'){
name=opt.onHover;
opt.onHover=namedEventHandlers[name];
if(opt.onHover===undefined){
throw new Error('Unknown hover event handler: ' + name);
}}
if(typeof opt.onDrop==='string'){
name=opt.onDrop;
opt.onDrop=namedEventHandlers[name];
if(opt.onDrop===undefined){
throw new Error('Unknown drop event handler: ' + name);
}}
if(typeof opt.onDropOut==='string'){
name=opt.onDropOut;
opt.onDropOut=namedEventHandlers[name];
if(opt.onDropOut===undefined){
throw new Error('Unknown dropOut event handler: ' + name);
}}
var elementData={
element: element,
data: {},
options: opt
};
this._droppables.push(elementData);
this._update(elementData);
},
_findData: function (element){
var elms=this._droppables;
for (var i=0, len=elms.length; i < len; i++){
if(elms[i].element===element){
return elms[i];
}}
},
_findDraggable: function (element){
var elms=this._draggables;
for (var i=0, len=elms.length; i < len; i++){
if(elms[i].element===element){
return elms[i];
}}
},
updateAll: function(){
InkArray.each(this._droppables, Droppable._update);
},
update: function(element){
this._update(this._findData(element));
},
_update: function(elementData){
var data=elementData.data;
var element=elementData.element;
data.left=InkElement.offsetLeft(element);
data.top=InkElement.offsetTop(element);
data.right=data.left + InkElement.elementWidth(element);
data.bottom=data.top  + InkElement.elementHeight(element);
},
remove: function(el){
el=Common.elOrSelector(el);
var len=this._droppables.length;
for (var i=0; i < len; i++){
if(this._droppables[i].element===el){
this._droppables.splice(i, 1);
break;
}}
return len!==this._droppables.length;
},
action: function(coords, type, ev, draggable){
InkArray.each(this._droppables, Ink.bind(function(elementData){
var data=elementData.data;
var opt=elementData.options;
var element=elementData.element;
if(opt.accept&&!Selector.matches(opt.accept, [draggable]).length){
return;
}
if(type==='drag'&&!this._findDraggable(draggable)){
this._draggables.push({
element: draggable,
originalParent: draggable.parentNode
});
}
if(coords.x >=data.left&&coords.x <=data.right &&
coords.y >=data.top&&coords.y <=data.bottom){
if(type==='drag'){
if(opt.hoverClass){
InkArray.each(opt.hoverClass,
hAddClassName(element));
}
if(opt.onHover){
opt.onHover(draggable, element);
}}else if(type==='drop'){
if(opt.hoverClass){
InkArray.each(opt.hoverClass,
hRemoveClassName(element));
}
if(opt.onDrop){
opt.onDrop(draggable, element, ev);
}}
}else{
if(type==='drag'&&opt.hoverClass){
InkArray.each(opt.hoverClass, hRemoveClassName(element));
}else if(type==='drop'){
if(opt.onDropOut){
opt.onDropOut(draggable, element, ev);
}}
}}, this));
}};
return Droppable;
});
Ink.createModule('Ink.UI.FormValidator', '1', ['Ink.Dom.Element_1', 'Ink.Dom.Css_1','Ink.Util.Validator_1','Ink.Dom.Selector_1'], function(InkElement, Css, InkValidator , Selector){
'use strict';
function elementsWithSameName(elm){
if(!elm.name){ return []; }
if(!elm.form){
return Selector.select('[name="' + elm.name + '"]');
}
var ret=elm.form[elm.name];
if(!ret){
return (function (){
var ret=[];
var everything=Ink.ss('*', elm.form);
for (var i=0; i < everything.length; i++){
if(everything[i].name===elm.name){ ret.push(everything[i]); }}
return ret;
}());
}
if(typeof(ret.length)==='undefined'){
ret=[ret];
}
return ret;
}
var FormValidator={
version: '1',
_flagMap: {
'ink-fv-required': {msg: 'Required field'},
'ink-fv-email': {msg: 'Invalid e-mail address'},
'ink-fv-url': {msg: 'Invalid URL'},
'ink-fv-number': {msg: 'Invalid number'},
'ink-fv-phone_pt': {msg: 'Invalid phone number'},
'ink-fv-phone_cv': {msg: 'Invalid phone number'},
'ink-fv-phone_mz': {msg: 'Invalid phone number'},
'ink-fv-phone_ao': {msg: 'Invalid phone number'},
'ink-fv-date': {msg: 'Invalid date'},
'ink-fv-confirm': {msg: 'Confirmation does not match'},
'ink-fv-custom': {msg: ''}},
elements: {},
confirmElms: {},
hasConfirm: {},
_errorClassName: 'tip error',
_errorValidationClassName: 'validaton',
_errorTypeWarningClassName: 'warning',
_errorTypeErrorClassName: 'error',
validate: function(elm, options){
this._free();
options=Ink.extendObj({
onSuccess: false,
onError: false,
customFlag: false,
confirmGroup: []
}, options||{});
if(typeof(elm)==='string'){
elm=document.getElementById(elm);
}
if(elm===null){
return false;
}
this.element=elm;
if(typeof(this.element.id)==='undefined'||this.element.id===null||this.element.id===''){
this.element.id='ink-fv_randomid_'+(Math.round(Math.random() * 99999));
}
this.custom=options.customFlag;
this.confirmGroup=options.confirmGroup;
var fail=this._validateElements();
if(fail.length > 0){
if(options.onError){
options.onError(fail);
}else{
this._showError(elm, fail);
}
return false;
}else{
if(!options.onError){
this._clearError(elm);
}
this._clearCache();
if(options.onSuccess){
options.onSuccess();
}
return true;
}},
reset: function(){
this._clearError();
this._clearCache();
},
_free: function(){
this.element=null;
this.custom=false;
this.confirmGroup=false;
},
_clearCache: function(){
this.element=null;
this.elements=[];
this.custom=false;
this.confirmGroup=false;
},
_getElements: function(){
var elements=this.elements[this.element.id]=[];
this.confirmElms[this.element.id]=[];
var formElms=Selector.select(':input', this.element);
var curElm=false;
for(var i=0, totalElm=formElms.length; i < totalElm; i++){
curElm=formElms[i];
var type=(curElm.getAttribute('type') + '').toLowerCase();
if(type==='radio'||type==='checkbox'){
if(elements.length===0 ||
(
curElm.getAttribute('type')!==elements[elements.length - 1].getAttribute('type') &&
curElm.getAttribute('name')!==elements[elements.length - 1].getAttribute('name')
)){
for(var flag in this._flagMap){
if(Css.hasClassName(curElm, flag)){
elements.push(curElm);
break;
}}
}}else{
for(var flag2 in this._flagMap){
if(Css.hasClassName(curElm, flag2)&&flag2!=='ink-fv-confirm'){
elements.push(curElm);
break;
}}
if(Css.hasClassName(curElm, 'ink-fv-confirm')){
this.confirmElms[this.element.id].push(curElm);
this.hasConfirm[this.element.id]=true;
}}
}},
_validateElements: function(){
var oGroups;
this._getElements();
if(this.hasConfirm[this.element.id]===true){
oGroups=this._makeConfirmGroups();
}
var errors=[];
var curElm=false;
var customErrors=false;
var inArray;
for(var i=0, totalElm=this.elements[this.element.id].length; i < totalElm; i++){
inArray=false;
curElm=this.elements[this.element.id][i];
if(!curElm.disabled){
for(var flag in this._flagMap){
if(Css.hasClassName(curElm, flag)){
if(flag!=='ink-fv-custom'&&flag!=='ink-fv-confirm'){
if(!this._isValid(curElm, flag)){
if(!inArray){
errors.push({elm: curElm, errors:[flag]});
inArray=true;
}else{
errors[(errors.length - 1)].errors.push(flag);
}}
}else if(flag!=='ink-fv-confirm'){
customErrors=this._isCustomValid(curElm);
if(customErrors.length > 0){
errors.push({elm: curElm, errors:[flag], custom: customErrors});
}}else if(flag==='ink-fv-confirm'){
continue;
}}
}}
}
errors=this._validateConfirmGroups(oGroups, errors);
return errors;
},
_validateConfirmGroups: function(oGroups, errors){
var curGroup=false;
for(var i in oGroups) if(oGroups.hasOwnProperty(i)){
curGroup=oGroups[i];
if(curGroup.length===2){
if(curGroup[0].value!==curGroup[1].value){
errors.push({elm:curGroup[1], errors:['ink-fv-confirm']});
}}
}
return errors;
},
_makeConfirmGroups: function(){
var oGroups;
if(this.confirmGroup&&this.confirmGroup.length > 0){
oGroups={};
var curElm=false;
var curGroup=false;
for(var i=0, total=this.confirmElms[this.element.id].length; i < total; i++){
curElm=this.confirmElms[this.element.id][i];
for(var j=0, totalG=this.confirmGroup.length; j < totalG; j++){
curGroup=this.confirmGroup[j];
if(Css.hasClassName(curElm, curGroup)){
if(typeof(oGroups[curGroup])==='undefined'){
oGroups[curGroup]=[curElm];
}else{
oGroups[curGroup].push(curElm);
}}
}}
return oGroups;
}else{
if(this.confirmElms[this.element.id].length===2){
oGroups={
"ink-fv-confirm": [
this.confirmElms[this.element.id][0],
this.confirmElms[this.element.id][1]
]
};}
return oGroups;
}
return false;
},
_isCustomValid: function(elm){
var customErrors=[];
var curFlag=false;
for(var i=0, tCustom=this.custom.length; i < tCustom; i++){
curFlag=this.custom[i];
if(Css.hasClassName(elm, curFlag.flag)){
if(!curFlag.callback(elm, curFlag.msg)){
customErrors.push({flag: curFlag.flag, msg: curFlag.msg});
}}
}
return customErrors;
},
_isValid: function(elm, fieldType){
var nodeName=elm.nodeName.toLowerCase();
var inputType=(elm.getAttribute('type')||'').toLowerCase();
var value=this._trim(elm.value);
if(fieldType!=='ink-fv-required' &&
inputType!=='checkbox'&&inputType!=='radio' &&
value===''){
return !Css.hasClassName(elm, 'ink-fv-required');
}
switch(fieldType){
case 'ink-fv-required':
if(nodeName==='select'){
if(elm.selectedIndex > 0){
return true;
}else{
return false;
}}
if(inputType!=='checkbox'&&inputType!=='radio'){
return value!=='';
}else if(inputType==='checkbox'||inputType==='radio'){
var aFormRadios=elementsWithSameName(elm);
for(var i=0, totalRadio=aFormRadios.length; i < totalRadio; i++){
if(aFormRadios[i].checked===true){
return true;
}}
return false;
}
return false;
case 'ink-fv-email':
return InkValidator.mail(elm.value);
case 'ink-fv-url':
return InkValidator.url(elm.value);
case 'ink-fv-number':
return !isNaN(Number(elm.value))&&isFinite(Number(elm.value));
case 'ink-fv-phone_pt':
return InkValidator.isPTPhone(elm.value);
case 'ink-fv-phone_cv':
return InkValidator.isCVPhone(elm.value);
case 'ink-fv-phone_ao':
return InkValidator.isAOPhone(elm.value);
case 'ink-fv-phone_mz':
return InkValidator.isMZPhone(elm.value);
case 'ink-fv-date':
var Element=Ink.getModule('Ink.Dom.Element',1);
var dataset=Element.data(elm);
var validFormat='yyyy-mm-dd';
if(Css.hasClassName(elm, 'ink-datepicker')&&('format' in dataset)){
validFormat=dataset.format;
}else if(('validFormat' in dataset)){
validFormat=dataset.validFormat;
}
if(!(validFormat in InkValidator._dateParsers) ){
var validValues=[];
for(var val in InkValidator._dateParsers){
if(InkValidator._dateParsers.hasOwnProperty(val)){
validValues.push(val);
}}
throw new Error(
'The attribute data-valid-format must be one of ' +
'the following values: ' + validValues.join(', '));
}
return InkValidator.isDate(validFormat, elm.value);
case 'ink-fv-custom':
break;
}
return false;
},
_showError: function(formElm, aFail){
this._clearError(formElm);
var curElm=false;
for(var i=0, tFail=aFail.length; i < tFail; i++){
curElm=aFail[i].elm;
if(curElm){
this._showAnErrorOnElement(curElm, aFail[i]);
}}
},
_showAnErrorOnElement: function (curElm, error){
var controlGroupElm=InkElement.findUpwardsByClass(curElm, 'control-group');
var controlElm=InkElement.findUpwardsByClass(curElm, 'control');
var errorClasses=[
this._errorClassName,
this._errorTypeClassName].join(' ');
var errorMsg=InkElement.create('p', {
className: errorClasses
});
if(error.errors[0]!=='ink-fv-custom'){
errorMsg.innerHTML=this._flagMap[error.errors[0]].msg;
}else{
errorMsg.innerHTML=error.custom[0].msg;
}
var target=(controlElm||controlGroupElm);
if(target){
target.appendChild(errorMsg);
}else{
InkElement.insertAfter(errorMsg, curElm);
}
if(controlElm){
if(error.errors[0]==='ink-fv-required'){
Css.addClassName(controlGroupElm, 'validation error');
}else{
Css.addClassName(controlGroupElm, 'validation warning');
}}
},
_clearError: function(formElm){
var aErrorLabel=formElm.getElementsByTagName('p');
var curElm;
var control;
for(var i=(aErrorLabel.length - 1); i >=0; i--){
curElm=aErrorLabel[i];
if(Css.hasClassName(curElm, this._errorClassName)){
control=InkElement.findUpwardsBySelector(curElm, '.control-group');
if(control){
Css.removeClassName(control, ['validation', 'error', 'warning']);
}
if(Css.hasClassName(curElm, this._errorClassName, true )){
InkElement.remove(curElm);
}}
}
var aErrorLabel2=formElm.getElementsByTagName('ul');
for(i=(aErrorLabel2.length - 1); i >=0; i--){
curElm=aErrorLabel2[i];
if(Css.hasClassName(curElm, 'control-group')){
Css.removeClassName(curElm, 'validation error');
}}
},
_trim: function(str){
if(typeof(str)==='string'){
return str.replace(/^\s+|\s+$|\n+$/g, '');
}}
};
return FormValidator;
});
Ink.createModule('Ink.UI.FormValidator', '2', [ 'Ink.UI.Common_1','Ink.Dom.Element_1','Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Css_1','Ink.Util.Array_1','Ink.Util.I18n_1','Ink.Util.Validator_1'], function(Common, Element, Event, Selector, Css, InkArray, I18n, InkValidator){
'use strict';
function getValue(element){
switch(element.nodeName.toLowerCase()){
case 'select':
var checkedOpt=Ink.s('option:checked', element);
if(checkedOpt){ return checkedOpt.value; }
return '';
case 'textarea':
return element.value;
case 'input':
if("type" in element){
if((element.type==='radio')||(element.type==='checkbox')){
if(element.checked){
return element.value;
}}else if(element.type!=='file'){
return element.value;
}}else{
return element.value;
}
return;
default:
return element.innerHTML;
}}
var validationFunctions={
'required': function(value){
return((typeof value!=='undefined')&&(!(/^\s*$/).test(value)) );
},
'min_length': function(value, minSize){
return((typeof value==='string')&&(value.length >=parseInt(minSize,10)) );
},
'max_length': function(value, maxSize){
return((typeof value==='string')&&(value.length <=parseInt(maxSize,10)) );
},
'exact_length': function(value, exactSize){
return((typeof value==='string')&&(value.length===parseInt(exactSize,10)) );
},
'email': function(value){
return(( typeof value==='string')&&InkValidator.mail(value) );
},
'url': function(value, fullCheck){
fullCheck=fullCheck||false;
return((typeof value==='string')&&InkValidator.url(value, fullCheck) );
},
'ip': function(value, ipType){
if(typeof value!=='string'){
return false;
}
return InkValidator.isIP(value, ipType);
},
'phone': function(value, phoneType){
if(typeof value!=='string'){
return false;
}
var countryCode=phoneType ? phoneType.toUpperCase():'';
return InkValidator['is' + countryCode + 'Phone'](value);
},
'credit_card': function(value, cardType){
if(typeof value!=='string'){
return false;
}
return InkValidator.isCreditCard(value, cardType||'default');
},
'date': function(value, format){
return((typeof value==='string')&&InkValidator.isDate(format, value));
},
'alpha': function(value, supportSpaces){
return InkValidator.ascii(value, {singleLineWhitespace: supportSpaces});
},
'text': function (value, whitespace, punctuation){
return InkValidator.unicode(value, {
singleLineWhitespace: whitespace,
numbers: true,
unicodePunctuation: punctuation });
},
'latin': function (value, punctuation, whitespace){
if(typeof value!=='string'){ return false; }
return InkValidator.latin1(value, {
latin1Punctuation: punctuation,
singleLineWhitespace: whitespace,
numbers: true });
},
'alpha_numeric': function(value){
return InkValidator.ascii(value, {numbers: true});
},
'alpha_dash': function(value){
return InkValidator.ascii(value, {dash: true, underscore: true});
},
'digit': function(value){
return ((typeof value==='string')&&/^[0-9]{1}$/.test(value));
},
'integer': function(value, positive){
return InkValidator.number(value, {
negative: !positive,
decimalPlaces: 0
});
},
'decimal': function(value, decimalSeparator, decimalPlaces, leftDigits){
return InkValidator.number(value, {
decimalSep: decimalSeparator||'.',
decimalPlaces: +decimalPlaces||null,
maxDigits: +leftDigits
});
},
'numeric': function(value, decimalSeparator, decimalPlaces, leftDigits){
decimalSeparator=decimalSeparator||'.';
if(value.indexOf(decimalSeparator)!==-1){
return validationFunctions.decimal(value, decimalSeparator, decimalPlaces, leftDigits);
}else{
return validationFunctions.integer(value);
}},
'range': function(value, minValue, maxValue, multipleOf){
value=+value;
minValue=+minValue;
maxValue=+maxValue;
if(isNaN(value)||isNaN(minValue)||isNaN(maxValue)){
return false;
}
if(value < minValue||value > maxValue){
return false;
}
if(multipleOf){
return (value - minValue) % multipleOf===0;
}else{
return true;
}},
'color': function(value){
return InkValidator.isColor(value);
},
'matches': function(value, fieldToCompare){
var otherField=this.getFormElements()[fieldToCompare];
if(!otherField){
var possibleFields=Ink.ss('input, select, textarea, .control-group', this._options.form._element);
for (var i=0; i < possibleFields.length; i++){
if((possibleFields[i].name||possibleFields[i].id)===fieldToCompare){
return getValue(possibleFields[i])===value;
}}
return false;
}else{
otherField=otherField[0];
}
var otherFieldValue=otherField.getValue();
if(otherField._rules.required){
if(otherFieldValue===''){
return false;
}}
return value===otherFieldValue;
},
'ean': function (value){
return InkValidator.isEAN(value.replace(/[^\d]/g, ''), 'ean-13');
}};
var validationMessages=new I18n({
en_US: {
'formvalidator.generic_error':'{field} is invalid',
'formvalidator.required':'{field} is mandatory',
'formvalidator.min_length': 'The {field} must have a minimum size of {param1} characters',
'formvalidator.max_length': 'The {field} must have a maximum size of {param1} characters',
'formvalidator.exact_length': 'The {field} must have an exact size of {param1} characters',
'formvalidator.email': 'The {field} must have a valid e-mail address',
'formvalidator.url': 'The {field} must have a valid URL',
'formvalidator.ip': 'The {field} does not contain a valid {param1} IP address',
'formvalidator.phone': 'The {field} does not contain a valid {param1} phone number',
'formvalidator.credit_card': 'The {field} does not contain a valid {param1} credit card',
'formvalidator.date': 'The {field} should contain a date in the {param1} format',
'formvalidator.alpha': 'The {field} should only contain letters',
'formvalidator.text': 'The {field} should only contain alphabetic characters',
'formvalidator.latin': 'The {field} should only contain alphabetic characters',
'formvalidator.alpha_numeric': 'The {field} should only contain letters or numbers',
'formvalidator.alpha_dash': 'The {field} should only contain letters or dashes',
'formvalidator.digit': 'The {field} should only contain a digit',
'formvalidator.integer': 'The {field} should only contain an integer',
'formvalidator.decimal': 'The {field} should contain a valid decimal number',
'formvalidator.numeric': 'The {field} should contain a number',
'formvalidator.range': 'The {field} should contain a number between {param1} and {param2}',
'formvalidator.color': 'The {field} should contain a valid color',
'formvalidator.matches': 'The {field} should match the field {param1}'
},
pt_PT: {
'formvalidator.generic_error':'{field} inválido',
'formvalidator.required':'Preencher {field} é obrigatório',
'formvalidator.min_length': '{field} deve ter no mínimo {param1} caracteres',
'formvalidator.max_length': '{field} tem um tamanho máximo de {param1} caracteres',
'formvalidator.exact_length': '{field} devia ter exactamente {param1} caracteres',
'formvalidator.email': '{field} deve ser um e-mail válido',
'formvalidator.url': 'O {field} deve ser um URL válido',
'formvalidator.ip': '{field} não tem um endereço IP {param1} válido',
'formvalidator.phone': '{field} deve ser preenchido com um número de telefone {param1} válido.',
'formvalidator.credit_card': '{field} não tem um cartão de crédito {param1} válido',
'formvalidator.date': '{field} deve conter uma data no formato {param1}',
'formvalidator.alpha': 'O campo {field} deve conter apenas caracteres alfabéticos',
'formvalidator.text': 'O campo {field} deve conter apenas caracteres alfabéticos',
'formvalidator.latin': 'O campo {field} deve conter apenas caracteres alfabéticos',
'formvalidator.alpha_numeric': '{field} deve conter apenas letras e números',
'formvalidator.alpha_dash': '{field} deve conter apenas letras e traços',
'formvalidator.digit': '{field} destina-se a ser preenchido com apenas um dígito',
'formvalidator.integer': '{field} deve conter um número inteiro',
'formvalidator.decimal': '{field} deve conter um número válido',
'formvalidator.numeric': '{field} deve conter um número válido',
'formvalidator.range': '{field} deve conter um número entre {param1} e {param2}',
'formvalidator.color': '{field} deve conter uma cor válida',
'formvalidator.matches': '{field} deve corresponder ao campo {param1}'
}}, 'en_US');
function FormElement(){
Common.BaseUIComponent.apply(this, arguments);
}
FormElement._name='FormElement_1';
FormElement._optionDefinition={
label: ['String', null],
rules: ['String', null],
error: ['String', null],
autoReparse: ['Boolean', false],
form: ['Object']
};
FormElement.prototype={
_init: function (){
this._errors={};
this._rules={};
this._value=null;
this._forceInvalid=null;
this._forceValid=null;
this._errorParagraph=null;
if(this._options.label===null){
this._options.label=this._getLabel();
}
this._elementHadDataRules=this._element.hasAttribute('data-rules');
},
_getLabel: function(){
var label=Element.findUpwardsBySelector(this._element,'.control-group label');
if(label){
return Element.textContent(label);
}else{
return this._element.name||this._element.id||'';
}},
_parseRules: function(rules){
this._rules={};
rules=rules.split("|");
var i, rulesLength=rules.length, rule, params, paramStartPos ;
if(rulesLength > 0){
for(i=0; i < rulesLength; i++){
rule=rules[i];
if(!rule){
continue;
}
if(( paramStartPos=rule.indexOf('['))!==-1){
params=rule.substr(paramStartPos+1);
params=params.split(']');
params=params[0];
params=params.split(',');
for (var p=0, len=params.length; p < len; p++){
params[p] =
params[p]==='true' ? true :
params[p]==='false' ? false :
params[p];
}
params.splice(0,0,this.getValue());
rule=rule.substr(0,paramStartPos);
this._rules[rule]=params;
}else{
this._rules[rule]=[this.getValue()];
}}
}},
_addError: function(opt){
if(typeof opt==='string'){ opt={ rule: opt };}
var rule=opt.rule;
var message=opt.message;
if(!message&&!rule){ throw new Error('FormElement#_addError: Please pass an error message, or a rule that was broken'); }
if(!message){
var params=this._rules[rule]||[];
var paramObj={
field: this._options.label,
value: this.getValue()
};
for(var i=1; i < params.length; i++){
paramObj['param' + i]=params[i];
}
var i18nKey='formvalidator.' + rule;
if(this._options.error){
message=this._options.error;
}else{
message=this._options.form.getI18n().text(i18nKey, paramObj);
if(message===i18nKey){
message='[Validation message not found for rule ]' + rule;
}}
}
this._errors[rule]=message;
},
getValue: function(){
return getValue(this._element);
},
getLabel: function (){
return this._options.label;
},
getErrors: function(){
return this._errors;
},
getElement: function(){
return this._element;
},
getFormElements: function (){
return this._options.form._formElements;
},
setRules: function (rulesStr){
this._options.rules=rulesStr;
},
forceInvalid: function (message){
this._forceInvalid=message ?
message :
this._options.form.getI18n().text('formvalidator.generic_error', { field: this.getLabel() });
},
unforceInvalid: function (){
this._forceInvalid=null;
},
forceValid: function(){
this._forceValid=true;
},
unforceValid: function(){
this._forceValid=false;
},
getControlGroup: function (){
if(Css.hasClassName(this._element, 'control-group')){
return this._element;
}else{
return Element.findUpwardsByClass(this._element, 'control-group');
}},
getControl: function (){
if(Css.hasClassName(this._element, 'control-group')){
return Ink.s('.control', this._element)||undefined;
}else{
return Element.findUpwardsByClass(this._element, 'control');
}},
removeErrors: function(){
var controlGroup=this.getControlGroup();
if(controlGroup){
Css.removeClassName(controlGroup, ['validation', 'error']);
}
if(this._errorParagraph){
Element.remove(this._errorParagraph);
}},
displayErrors: function(){
this.validate();
this.removeErrors();
var errors=this.getErrors();
var errorArr=[];
for (var k in errors){
if(errors.hasOwnProperty(k)){
errorArr.push(errors[k]);
}}
if(!errorArr.length){ return; }
var controlGroupElement=this.getControlGroup();
var controlElement=this.getControl();
if(controlGroupElement){
Css.addClassName(controlGroupElement, ['validation', 'error']);
}
var paragraph=document.createElement('p');
Css.addClassName(paragraph, 'tip');
if(controlElement||controlGroupElement){
(controlElement||controlGroupElement).appendChild(paragraph);
}else{
Element.insertAfter(paragraph, this._element);
}
paragraph.innerHTML=errorArr.join('<br/>');
this._errorParagraph=paragraph;
},
validate: function(){
if(this._forceValid){
this._errors={};
return true;
}
if(this._element.disabled){
return true;
}
if(this._forceInvalid){
this._addError({ message: this._forceInvalid });
return false;
}
this._errors={};
if(this._options.autoReparse){
var rules=this._element.getAttribute('data-rules');
if(rules){
this._options.rules=rules;
}else if(this._elementHadDataRules&&!this._element.hasAttribute('data-rules')){
return true;
}}
this._parseRules(this._options.rules);
var doValidate=this.getValue()!=='' ||
("required" in this._rules) ||
("matches" in this._rules);
if(doValidate){
for(var rule in this._rules){
if(this._rules.hasOwnProperty(rule)){
if((typeof validationFunctions[rule]==='function')){
if(validationFunctions[rule].apply(this, this._rules[rule])===false){
this._addError({ rule: rule });
return false;
}}else{
Ink.warn('Rule "' + rule + '" not found. Used in element:', this._element);
this._addError({
message: this._options.form.getI18n().text('formvalidator.generic_error', { field: this.getLabel() })
});
return false;
}}
}}
return true;
}};
Common.createUIComponent(FormElement);
function FormValidator(){
Common.BaseUIComponent.apply(this, arguments);
}
FormValidator._name='FormValidator_1';
FormValidator._optionDefinition={
lang: ['String', null],
eventTrigger: ['String', 'submit'],
neverSubmit: ['Boolean', false],
autoReparse: ['Boolean', false],
searchFor: ['String', 'input, select, textarea, .control-group'],
beforeValidation: ['Function', undefined],
onError: ['Function', undefined],
onSuccess: ['Function', undefined],
extraValidation: ['Function', undefined]
};
FormValidator.setRule=function(name, errorMessage, cb){
validationFunctions[ name ]=cb;
if(validationMessages.getKey('formvalidator.' + name)!==errorMessage){
var langObj={}; langObj['formvalidator.' + name]=errorMessage;
var dictObj={}; dictObj[validationMessages.lang()]=langObj;
validationMessages.append(dictObj);
}};
FormValidator.getI18n=function (){
return validationMessages;
};
FormValidator.setI18n=function (i18n){
validationMessages=i18n;
};
FormValidator.appendI18n=function (){
validationMessages.append.apply(validationMessages, [].slice.call(arguments));
};
FormValidator.setLanguage=function (language){
validationMessages.lang(language);
};
FormValidator.getRules=function(){
return validationFunctions;
};
FormValidator.prototype={
_init: function(){
this._rootElement=this._element;
this._formElements={};
this._errorMessages=[];
this._markedErrorElements=[];
if(typeof this._options.eventTrigger==='string'){
Event.observe(this._rootElement,
this._options.eventTrigger,
Ink.bindEvent(this.validate,this));
}
if(this._options.lang){
this.setLanguage(this._options.lang);
}},
getElements: function(){
if(!this._formElements){
this._formElements={};}
var i;
for (var k in this._formElements) if(this._formElements.hasOwnProperty(k)){
i=this._formElements[k].length;
while (i--){
if(!Element.isAncestorOf(document.documentElement,
this._formElements[k][i]._element)){
this._formElements[k][i].removeErrors();
this._formElements[k].splice(i, 1);
}}
if(this._formElements[k].length===0){
delete this._formElements[k];
}}
var formElements=Selector.select(this._options.searchFor, this._rootElement);
for(i=0; i<formElements.length; i+=1){
var element=formElements[i];
var dataAttrs=Element.data(element);
if(!("rules" in dataAttrs)){
continue;
}
if(Element.isHidden(element) ){
continue;
}
var options={
form: this
};
var key;
if(("name" in element)&&element.name){
key=element.name;
}else if(("id" in element)&&element.id){
key=element.id;
}else{
key='element_' + Math.floor(Math.random()*100);
element.id=key;
}
if(!(key in this._formElements)){
this._formElements[key]=[];
}
var formElement=this._getOrCreateFormElementInstance(key, element, options);
if(formElement){
this._formElements[key].push(formElement);
}}
return this._formElements;
},
_getOrCreateFormElementInstance: function (key, element, options){
for (var j=0; j < this._formElements[key].length; j++){
if(this._formElements[key][j].getElement()===element){
return null;
}}
if(!element.getAttribute('data-auto-reparse')){
options.autoReparse=this._options.autoReparse;
}
return new FormElement(element, options);
},
setI18n: function (i18n){
if(i18n.clone){
i18n=i18n.clone();
}
this.i18n=i18n;
},
getI18n: function (){
return this.i18n||validationMessages;
},
setLanguage: function (language){
if(!this.i18n){
this.setI18n(validationMessages);
}
this.i18n.lang(language);
},
getLanguage: function (){
return this.i18n ? this.i18n.lang():validationMessages.lang();
},
validate: function(event){
if(this._options.neverSubmit&&event){
Event.stopDefault(event);
}
this.getElements();
if(typeof this._options.beforeValidation==='function'){
this._options.beforeValidation.call(this, {
event: event,
validator: this,
elements: this._formElements
});
}
Css.removeClassName(this._element, 'form-error');
var errorElements=[];
for(var key in this._formElements){
if(this._formElements.hasOwnProperty(key)){
for(var counter=0; counter < this._formElements[key].length; counter+=1){
this._formElements[key][counter].removeErrors();
if(!this._formElements[key][counter].validate()){
errorElements.push(this._formElements[key][counter]);
}}
}}
var isValid=errorElements.length===0;
if(typeof this._options.extraValidation==='function'){
var param={
event: event,
validator: this,
elements: this._formElements,
errorCount: errorElements.length
};
var result=this._options.extraValidation.call(this, param);
if(result===false){ isValid=false; }}
if(isValid){
if(typeof this._options.onSuccess==='function'){
this._options.onSuccess();
}}else{
if(event){
Event.stopDefault(event);
}
if(typeof this._options.onError==='function'){
this._options.onError(errorElements);
}
this._invalid(errorElements);
}
return isValid;
},
_invalid: function (errorElements){
errorElements=errorElements||[];
this._errorMessages=[];
Css.addClassName(this._element, 'form-error');
for (var i=0; i < errorElements.length; i++){
errorElements[i].displayErrors();
}}
};
Common.createUIComponent(FormValidator);
FormValidator.FormElement=FormElement;
FormValidator.validationFunctions=validationFunctions;
return FormValidator;
});
Ink.createModule('Ink.UI.ImageQuery', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Util.Array_1'], function(Common, Event, Element, InkArray){
'use strict';
function ImageQuery(){
Common.BaseUIComponent.apply(this, arguments);
}
ImageQuery._name='ImageQuery_1';
ImageQuery._optionDefinition={
src: ['String'],
retina: ['String', undefined],
queries: ['Object'],
onLoad: ['Function', null]
};
ImageQuery.prototype={
_init: function(){
//  */
var pos;
if((pos=this._element.src.lastIndexOf('?'))!==-1){
var search=this._element.src.substr(pos);
this._filename=this._element.src.replace(search,'').split('/').pop()+search;
}else{
this._filename=this._element.src.split('/').pop();
}
if(!this._options.queries){ this._options.queries=[]; }
this._options.queries=InkArray.sortMulti(this._options.queries, 'width').reverse();
if(typeof this._options.onLoad==='function'){
Event.observe(this._element, 'load', Ink.bindEvent(this._onLoad, this));
}
this._onResize();
Event.observe(window, 'resize', Event.throttle(Ink.bindMethod(this, '_onResize'), 400));
},
_onResize: function(){
if(!this._options.queries.length){
return;
}
var current=this._findCurrentQuery();
this._element.src=this.getQuerySrc(current);
},
_findCurrentQuery: function (){
var viewportWidth=Element.viewportWidth();
var queries=this._options.queries;
var last=queries.length - 1;
for(var query=0; query < last; query+=1){
if(queries[query].width <=viewportWidth){
return queries[query];
}}
return queries[last];
},
getQuerySrc: function (query){
var src=query.src||this._options.src;
if(window.devicePixelRatio > 1&&(this._options.retina!==undefined)){
src=query.retina||this._options.retina;
}
query.file=this._filename;
if(typeof src==='function'){
src=src.apply(this,[this._element,query]);
if(typeof src!=='string'){
throw '[ImageQuery] :: "src" callback does not return a string';
}}
src=src.replace(/{:(.*?)}/g, function(_, prop){
return query[prop];
});
delete query.file;
return src;
},
_onLoad: function(){
this._options.onLoad.call(this);
}};
Common.createUIComponent(ImageQuery);
return ImageQuery;
});
Ink.createModule('Ink.UI.LazyLoad', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Css_1'], function(Common, InkEvent, InkElement, Css){
'use strict';
var scrollSupport='onscroll' in document &&
typeof operamini==='undefined';
function LazyLoad(){
Common.BaseUIComponent.apply(this, arguments);
}
LazyLoad._name='LazyLoad_1';
LazyLoad._optionDefinition={
item: ['String', '.lazyload-item'],
placeholder: ['String', null],
loadedClass: ['String', null],
source: ['String', 'data-src'],
destination: ['String', 'src'],
delay: ['Number', 100],
delta: ['Number', 0],
image: ['Boolean', true],
scrollElement: ['Element', window],
touchEvents: ['Boolean', true],
onInsideViewport: ['Function', false],
onAfterAttributeChange: ['Function', false],
autoInit: ['Boolean', true]
};
LazyLoad.prototype={
_init: function(){
this._aData=[];
this._hasEvents=false;
if(this._options.autoInit){
this._activate();
}},
_activate: function(){
this._getData();
if(!scrollSupport){
for (var i=0; i < this._aData.length; i++){
this._elInViewport(this._aData[i]);
}}
if(!this._hasEvents){
this._addEvents();
}
this._onScrollThrottled();
},
_getData: function(){
var aElms=Ink.ss(this._options.item, this._element);
var attr=null;
for(var i=0, t=aElms.length; i < t; i++){
if(this._options.placeholder!=null&&!InkElement.hasAttribute(aElms[i], this._options.destination)){
aElms[i].setAttribute(this._options.destination, this._options.placeholder);
}
attr=aElms[i].getAttribute(this._options.source);
if(attr!==null||!this._options.image){
this._aData.push({elm: aElms[i], original: attr});
}}
},
_addEvents: function(){
if(!scrollSupport){ return; }
this._onScrollThrottled=InkEvent.throttle(Ink.bindEvent(this._onScroll, this), this._options.delay);
if('ontouchmove' in document.documentElement&&this._options.touchEvents){
InkEvent.observe(document.documentElement, 'touchmove', this._onScrollThrottled);
}
InkEvent.observe(this._options.scrollElement, 'scroll', this._onScrollThrottled);
this._hasEvents=true;
},
_removeEvents: function(){
if('ontouchmove' in document.documentElement&&this._options.touchEvents){
InkEvent.stopObserving(document.documentElement, 'touchmove', this._onScrollThrottled);
}
InkEvent.stopObserving(this._options.scrollElement, 'scroll', this._onScrollThrottled);
this._hasEvents=false;
},
_onScroll: function(){
var curElm;
for (var i=0; i < this._aData.length; i++){
curElm=this._aData[i];
if(InkElement.inViewport(curElm.elm, { partial: true, margin: this._options.delta })){
this._elInViewport(curElm);
this._aData.splice(i, 1);
i -=1;
}}
if(this._aData.length===0){
this._removeEvents();
}},
_elInViewport: function (curElm){
this._userCallback('onInsideViewport', { element: curElm.elm });
if(this._options.image){
curElm.elm.setAttribute(this._options.destination, curElm.original);
if(this._options.loadedClass){
Css.addClassName(curElm.elm, this._options.loadedClass);
}
curElm.elm.removeAttribute(this._options.source);
}
this._userCallback('onAfterAttributeChange', { element: curElm.elm });
},
_userCallback: function (name){
if(typeof this._options[name]==='function'){
this._options[name].apply(this, [].slice.call(arguments, 1));
}},
reload: function(){
this._activate();
},
destroy: function(){
if(this._hasEvents){
this._removeEvents();
}
Common.destroyComponent.call(this);
}};
Common.createUIComponent(LazyLoad);
return LazyLoad;
});
Ink.createModule('Ink.UI.Modal', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, InkElement, Selector, InkArray){
'use strict';
var opacitySupported=(function (div){
div.style.opacity='invalid';
return div.style.opacity!=='invalid';
}(InkElement.create('div', {style: 'opacity: 1'})));
var vhVwSupported=(function (elem){
var height=parseInt(window.innerHeight / 2, 10);
var compHeight=parseInt((window.getComputedStyle ?
getComputedStyle(elem, null) :
elem.currentStyle)['height'], 10);
var width=parseInt(window.innerWidth / 2, 10);
var compWidth=parseInt((window.getComputedStyle ?
getComputedStyle(elem, null) :
elem.currentStyle).width, 10);
return compHeight===height&&compWidth===width
}(InkElement.create('div', { style: 'height:50vh;width:50vw' })));
var flexSupported=(function (div){
return div.style.display!=='';
}(InkElement.create('div', { style: 'display: flex' })));
var cleanDimension=function (dim){
dim=dim.replace(/^\s+|\s+$/g, '');
var hasPercent=dim.indexOf('%')!==-1;
var hasPx=dim.indexOf('px')!==-1;
return !hasPercent&&!hasPx ? dim + '%' :
!hasPercent&&hasPx ? dim :
!hasPx&&hasPercent ? dim :
dim + 'px';
};
var dimensionOfLayout=function (dimensionList, needleLayout){
var dims=dimensionList.split(/\s+/g);
var theDefault;
for (var i=0; i < dims.length; i++){
var _dim=dims[i].split('-');
var layout=_dim[0].replace(/^\s+|\s+$/g, '');
if(layout===needleLayout){
return cleanDimension(_dim[1]);
}
if(layout==='all'){
theDefault=cleanDimension(_dim[1]);
}}
return theDefault;
};
var openModals=[];
function Modal(){
Common.BaseUIComponent.apply(this, arguments);
}
Modal._name='Modal_1';
Modal._optionDefinition={
width:        ['String', '90%'],
height:       ['String', '90%'],
shadeClass:   ['String', undefined],
modalClass:   ['String', undefined],
trigger:      ['String', undefined],
triggerEvent: ['String', 'click'],
autoDisplay:  ['Boolean', true],
markup:       ['String', undefined],
onShow:       ['Function', undefined],
onDismiss:    ['Function', undefined],
closeOnClick: ['Boolean', false],
closeOnEscape: ['Boolean', true],
responsive:    ['Boolean', true]
};
Modal.prototype={
_init: function (){
this._handlers={
click:   Ink.bindEvent(this._onShadeClick, this),
keyDown: Ink.bindEvent(this._onKeyDown, this),
resize: null
};
this._dimensionIsVariant={
width: ('' + this._options.width).indexOf(' ')!==-1,
height: ('' + this._options.height).indexOf(' ')!==-1
};
this._isOpen=false;
if(this._element){
this._markupMode=Css.hasClassName(this._element,'wcv-modal');
}else{
this._markupMode=false;
}
if(!this._markupMode){
this._modalShadow=InkElement.create('div', { className: 'wcv-shade' });
this._modalDiv=InkElement.create('div', { className: 'wcv-modal wcv-space' });
if(!!this._element){
this._options.markup=this._element.innerHTML;
}
this._modalShadow.appendChild(this._modalDiv);
document.body.appendChild(this._modalShadow);
}else{
this._modalDiv=this._element;
this._modalShadow=this._modalDiv.parentNode;
this._contentContainer=Selector.select(".modal-body", this._modalDiv)[0];
if(!this._contentContainer){
throw new Error('Ink.UI.Modal: Missing div with class "modal-body"');
}
this._options.markup=this._contentContainer.innerHTML;
}
if(!this._markupMode){
this.setContentMarkup(this._options.markup);
}
if(typeof this._options.shadeClass==='string'){
Css.addClassName(this._modalShadow, this._options.shadeClass);
}
if(typeof this._options.modalClass==='string'){
Css.addClassName(this._modalDiv, this._options.modalClass);
}
if(this._options.trigger){
var triggerElements=Common.elsOrSelector(this._options.trigger, '');
Event.observeMulti(triggerElements, this._options.triggerEvent, Ink.bindEvent(this.open, this));
}else if(this._options.autoDisplay){
this.open();
}},
_dimensionIsPercentage: function (){
var dims=this._getDimensions();
return {
width: ('' + dims.width).indexOf('%')!==-1,
height: ('' + dims.height).indexOf('%')!==-1
};},
_getDimensions: function (opt){
opt=opt||{};
var dims={
width: this._options.width,
height: this._options.height
};
var currentLayout;
if(this._dimensionIsVariant.width||this._dimensionIsVariant.height){
currentLayout=Common.currentLayout();
}
if(this._dimensionIsVariant.width){
dims.width=dimensionOfLayout(dims.width, currentLayout);
}
if(this._dimensionIsVariant.height){
dims.height=dimensionOfLayout(dims.height, currentLayout);
}
if(opt.dynamic){
var isPercentage=this._dimensionIsPercentage();
if(!isPercentage.width){
var maxWidth=InkElement.viewportWidth() * 0.9;
if(parseFloat(dims.width) >=maxWidth){
dims.width=maxWidth + 'px';
}}
if(!isPercentage.height){
var maxHeight=InkElement.viewportHeight() * 0.9;
if(parseFloat(dims.height) >=maxHeight){
dims.height=maxHeight + 'px';
}}
}
return dims;
},
_reposition: function(){
var largerThan90Percent;
var dimensionIsPercentage=this._dimensionIsPercentage();
var dims=this._getDimensions();
if(vhVwSupported&&dimensionIsPercentage.height){
this._modalDiv.style.marginTop=(-parseFloat(dims.height)/2) + 'vh';
}else if(vhVwSupported){
largerThan90Percent=parseFloat(dims.height) > InkElement.viewportHeight() * 0.9;
if(largerThan90Percent!==this._heightWasLargerThan90Percent||!largerThan90Percent||this._dimensionIsVariant.height){
this._heightWasLargerThan90Percent=largerThan90Percent;
if(largerThan90Percent){
this._modalDiv.style.marginTop='0';
this._modalDiv.style.top='5vh';
}else{
this._modalDiv.style.marginTop=(-parseFloat(dims.height)/2) + 'px';
this._modalDiv.style.top='';
}}
}else{
this._modalDiv.style.marginTop=(-InkElement.elementHeight(this._modalDiv)/2) + 'px';
}
if(vhVwSupported&&dimensionIsPercentage.width){
this._modalDiv.style.marginLeft=(-parseFloat(dims.width)/2) + 'vw';
}else if(vhVwSupported){
largerThan90Percent=parseFloat(dims.width) > InkElement.viewportWidth() * 0.9;
if(largerThan90Percent!==this._widthWasLargerThan90Percent||!largerThan90Percent||this._dimensionIsVariant.width){
this._widthWasLargerThan90Percent=largerThan90Percent;
if(largerThan90Percent){
this._modalDiv.style.marginLeft='0';
this._modalDiv.style.left='5vw';
}else{
this._modalDiv.style.marginLeft=(-parseFloat(dims.width)/2) + 'px';
this._modalDiv.style.left='';
}}
}else{
this._modalDiv.style.marginLeft=(-InkElement.elementWidth(this._modalDiv)/2) + 'px';
}},
_onResize: function(){
var dimensionsAreVariant=this._dimensionIsVariant.height||this._dimensionIsVariant.width;
var dimensionIsPercentage=this._dimensionIsPercentage();
var dimensionsArePercentage = !dimensionIsPercentage.height||!dimensionIsPercentage.width;
if(dimensionsAreVariant){
this._resize();
}
if(!vhVwSupported||dimensionsAreVariant){
this._avoidModalLargerThanScreen();
}
if(!vhVwSupported||dimensionsArePercentage||dimensionsAreVariant){
this._reposition();
}
if(!flexSupported){
this._resizeContainer();
}},
_onShadeClick: function(ev){
if(!this._isOpen){ return; }
var tgtEl=Event.element(ev);
if(tgtEl===this._modalShadow&&this._options.closeOnClick){
this.dismiss();
}else if(Css.hasClassName(tgtEl, 'wcv-close')||Css.hasClassName(tgtEl, 'wcv-dismiss') ||
InkElement.findUpwardsBySelector(tgtEl, '.wcv-close,.wcv-dismiss') ||
(
this._options.closeOnClick &&
(!InkElement.descendantOf(this._shadeElement, tgtEl)||(tgtEl===this._shadeElement))
)
){
var alertsInTheModal=Selector.select('.wcv-alert', this._shadeElement),
alertsLength=alertsInTheModal.length;
for(var i=0; i < alertsLength; i++){
if(InkElement.descendantOf(alertsInTheModal[i], tgtEl)){
return;
}}
this.dismiss();
if(!this._isOpen){
Event.stop(ev);
}}
},
_onKeyDown: function(ev){
if(ev.keyCode!==27||!this._isOpen){ return; }
if(this._options.closeOnEscape &&
openModals[openModals.length - 1]===this){
this.dismiss();
if(!this._isOpen){
Event.stopDefault(ev);
}}
},
_resize: function (){
var dims=this._getDimensions();
this._modalDiv.style.width=dims.width;
this._modalDiv.style.height=dims.height;
},
_resizeContainer: function(){
var containerHeight=InkElement.elementHeight(this._modalDiv);
this._modalHeader=Selector.select('.modal-header',this._modalDiv)[0];
if(this._modalHeader){
containerHeight -=InkElement.elementHeight(this._modalHeader);
}
this._modalFooter=Selector.select('.modal-footer',this._modalDiv)[0];
if(this._modalFooter){
containerHeight -=InkElement.elementHeight(this._modalFooter);
}
this._contentContainer.style.height=containerHeight + 'px';
if(this._markupMode){ return; }},
_resizeContainerFlex: function(){
this._contentContainer.style.flex='1';
this._modalDiv.style.display='flex';
this._modalDiv.style.flexDirection='column';
},
_avoidModalLargerThanScreen: function (){
var dimensionIsPercentage=this._dimensionIsPercentage();
if(!vhVwSupported){
var currentViewport={
height: InkElement.viewportHeight(),
width: InkElement.viewportWidth()
};
var dims=this._getDimensions();
InkArray.forEach(['height', 'width'], Ink.bind(function (dimension){
if(dimensionIsPercentage[dimension]){ return; }
var dim=Math.round(currentViewport[dimension] * 0.9);
if(parseFloat(dims[dimension]) > dim){
this._modalDiv.style[dimension]=dim + 'px';
}else{
if(isNaN(parseFloat(dims[dimension]))){ return; }
this._modalDiv.style[dimension]=parseFloat(dims[dimension]) + 'px';
}}, this));
}else{
if(!dimensionIsPercentage.width){
this._modalDiv.style.maxWidth='90vw';
}
if(!dimensionIsPercentage.height){
this._modalDiv.style.maxHeight='90vh';
}}
},
open: function(event){
if(this.isOpen()){ return false; }
if(event){ Event.stopDefault(event); }
Css.addClassName(this._modalShadow,'wcv-shade');
this._modalShadow.style.display=this._modalDiv.style.display='block';
this._modalShadow.offsetHeight;
Css.addClassName(this._modalShadow, 'visible');
Css.addClassName(this._modalDiv, 'visible');
this._contentElement=this._modalDiv;
this._shadeElement=this._modalShadow;
if(!this._markupMode){
this.setContentMarkup(this._options.markup);
}
this._resize();
//  */
this._avoidModalLargerThanScreen();
this._reposition();
if(!flexSupported){
this._resizeContainer();
}else{
this._resizeContainerFlex();
}
if(this._options.responsive){
var isPercentage=this._dimensionIsPercentage();
var needResizeHandler = !(
vhVwSupported &&
flexSupported &&
isPercentage.height &&
isPercentage.width &&
!this._dimensionIsVariant.height &&
!this._dimensionIsVariant.width);
if(needResizeHandler){
this._handlers.resize=Event.throttle(Ink.bind(this._onResize, this), 500);
Event.observe(window, 'resize', this._handlers.resize);
}}
if(this._options.onShow){
if(event){
var trigger=InkElement.findUpwardsBySelector(Event.element(event),
this._options.trigger);
}
this._options.onShow.call(this, this, {
trigger: trigger
});
}
Event.observe(this._shadeElement, 'click', this._handlers.click);
if(this._options.closeOnEscape){
Event.observe(document, 'keydown', this._handlers.keyDown);
}
this._isOpen=true;
openModals.push(this);
Css.addClassName(document.documentElement, 'wcv-modal-open');
},
isOpen: function (){
return this._isOpen;
},
dismiss: function(){
if(!this._isOpen){  return; }
if(this._options.onDismiss){
var ret=this._options.onDismiss(this);
if(ret===false){ return; }}
this._isOpen=false;
if(this._handlers.resize){
Event.stopObserving(window, 'resize', this._handlers.resize);
}
if(!this._markupMode){
this._modalShadow.parentNode.removeChild(this._modalShadow);
this.destroy();
}else{
Css.removeClassName(this._modalDiv, 'visible');
Css.removeClassName(this._modalShadow, 'visible');
this._waitForFade(this._modalShadow, Ink.bind(function (){
this._modalShadow.style.display='none';
}, this));
}
openModals=InkArray.remove(openModals, InkArray.keyValue(this, openModals), 1);
if(openModals.length===0){
var htmlEl=document.documentElement;
Css.removeClassName(htmlEl, 'wcv-modal-open');
}},
_waitForFade: function (elem, callback){
if(!opacitySupported){ return callback(); }
var fadeChecks=5;
var fadeChecker=function (){
if(+Css.getStyle(elem, 'opacity') > 0&&fadeChecks > 0){
fadeChecks--;
setTimeout(fadeChecker, 250);
}else{
callback();
}};
setTimeout(fadeChecker, 500);
},
destroy: function(){
Common.unregisterInstance(this._instanceId);
},
getContentElement: function(){
return this._contentContainer||null;
},
getModalElement: function (){
return this._modalDiv||null;
},
getShadeElement: function (){
return this._modalShadow||null;
},
setContentMarkup: function(contentMarkup){
if(!this._markupMode){
this._modalDiv.innerHTML=[contentMarkup].join('');
this._contentContainer=Selector.select(".modal-body", this._modalDiv);
if(!this._contentContainer.length){
var tempHeader=Selector.select(".modal-header", this._modalDiv);
var tempFooter=Selector.select(".modal-footer", this._modalDiv);
InkArray.each(tempHeader, InkElement.remove);
InkArray.each(tempFooter, InkElement.remove);
var body=document.createElement('div');
Css.addClassName(body,'modal-body');
body.innerHTML=this._modalDiv.innerHTML;
this._modalDiv.innerHTML='';
var toAdd=tempHeader.concat([body]).concat(tempFooter);
InkArray.each(toAdd, Ink.bindMethod(this._modalDiv, 'appendChild'));
this._contentContainer=Selector.select(".modal-body",this._modalDiv);
}
this._contentContainer=this._contentContainer[0];
}else{
this._contentContainer.innerHTML=contentMarkup;
}
this._contentElement=this._modalDiv;
this._resizeContainer();
}};
Common.createUIComponent(Modal, { elementIsOptional: true });
Modal._vhVwSupported=vhVwSupported;
Modal._flexSupported=flexSupported;
return Modal;
});
Ink.createModule('Ink.UI.Pagination', '1',
['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'],
function(Common, Event, Css, Element, Selector){
'use strict';
var genAEl=function(innerHTML, index, options){
var aEl=document.createElement('a');
aEl.setAttribute('href', '#');
if(typeof index==='number'){
aEl.setAttribute('data-index', index);
}
if(options&&options.wrapText){
var spanEl=document.createElement('span');
aEl.appendChild(spanEl);
spanEl.innerHTML=innerHTML;
}else{
aEl.innerHTML=innerHTML;
}
return aEl;
};
function Pagination(){
Common.BaseUIComponent.apply(this, arguments);
}
Pagination._name='Pagination_1';
Pagination._optionDefinition={
size:              ['Integer', null],
totalItemCount:    ['Integer', null],
itemsPerPage:      ['Integer', null],
maxSize:           ['Integer', null],
start:             ['Integer', 1],
sideButtons:       ['Boolean', 1 ],
firstLabel:        ['String', 'First'],
lastLabel:         ['String', 'Last'],
previousLabel:     ['String', 'Previous'],
nextLabel:         ['String', 'Next'],
previousPageLabel: ['String', null],
nextPageLabel:     ['String', null],
onChange:          ['Function', undefined],
hashParameter:     ['String', 'page'],
parentTag:         ['String', 'ul'],
childTag:          ['String', 'li'],
wrapperClass:      ['String', 'ink-navigation'],
paginationClass:   ['String', 'pagination'],
activeClass:       ['String', 'active'],
disabledClass:     ['String', 'disabled'],
hideClass:         ['String', 'hide-all'],
previousClass:     ['String', 'previous'],
previousPageClass: ['String', 'previousPage'],
nextClass:         ['String', 'next'],
nextPageClass:     ['String', 'nextPage'],
firstClass:        ['String', 'first'],
lastClass:         ['String', 'last'],
numberFormatter: ['Function', function(i){ return i + 1; }],
autoWrap:          ['Boolean', false]
};
Pagination.prototype={
_init: function(){
if(!this._options.previousPageLabel){
this._options.previousPageLabel=this._options.previousLabel + ' ' + this._options.maxSize;
}
if(!this._options.nextPageLabel){
this._options.nextPageLabel=this._options.nextLabel + ' ' + this._options.maxSize;
}
this._handlers={
click: Ink.bindEvent(this._onClick,this)
};
if(Common.isInteger(this._options.totalItemCount)&&Common.isInteger(this._options.itemsPerPage)){
this._size=this._calculateSize(this._options.totalItemCount, this._options.itemsPerPage);
}else if(Common.isInteger(this._options.size)){
this._size=this._options.size;
}else{
Ink.error('Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.');
this._size=0;
}
this._current=this._options.start - 1;
this._itemLiEls=[];
this._generateMarkup(this._element);
this._updateItems();
this._observe();
},
_observe: function(){
Event.observeDelegated(this._element, 'click', '.' + this._options.paginationClass + ' > ' + this._options.childTag, this._handlers.click);
},
_calculateSize: function (count, itemsPerPage){
return Math.ceil(count / itemsPerPage);
},
_updateItems: function(){
var liEls=this._itemLiEls;
var isSimpleToggle=this._size===liEls.length;
var i, f, liEl;
if(isSimpleToggle){
for (i=0, f=this._size; i < f; ++i){
Css.setClassName(liEls[i], this._options.activeClass, i===this._current);
}}else{
for (i=liEls.length - 1; i >=0; --i){
this._ulEl.removeChild(liEls[i]);
}
liEls=[];
for (i=0, f=this._size; i < f; ++i){
liEl=document.createElement(this._options.childTag);
liEl.appendChild(genAEl(this._options.numberFormatter(i,this._size), i));
Css.setClassName(liEl, this._options.activeClass, i===this._current);
if(this._nextEl){
this._ulEl.insertBefore(liEl, this._nextEl);
}else{
this._ulEl.appendChild(liEl);
}
liEls.push(liEl);
}
this._itemLiEls=liEls;
}
if(this._options.maxSize){
var page=Math.floor(this._current / this._options.maxSize);
var pi=this._options.maxSize * page;
var pf=pi + this._options.maxSize - 1;
for (i=0, f=this._size; i < f; ++i){
liEl=liEls[i];
Css.setClassName(liEl, this._options.hideClass, i < pi||i > pf);
}
this._pageStart=pi;
this._pageEnd=pf;
this._page=page;
Css.setClassName(this._prevPageEl, this._options.disabledClass, !this.hasPreviousPage());
Css.setClassName(this._nextPageEl, this._options.disabledClass, !this.hasNextPage());
Css.setClassName(this._firstEl, this._options.disabledClass, this.isFirst());
Css.setClassName(this._lastEl, this._options.disabledClass, this.isLast());
}
if(this._prevEl&&!this._options.autoWrap){
Css.setClassName(this._prevEl, this._options.disabledClass, !this.hasPrevious());
}
if(this._nextEl&&!this._options.autoWrap){
Css.setClassName(this._nextEl, this._options.disabledClass, !this.hasNext());
}},
_generateMarkup: function(el){
Css.addClassName(el, 'ink-navigation');
var ulEl=Ink.s('.' + this._options.paginationClass, el);
var hasUlAlready=false;
if(!ulEl){
ulEl=document.createElement(this._options.parentTag);
Css.addClassName(ulEl, this._options.paginationClass);
}else{
hasUlAlready=true;
}
var isChevron=Css.hasClassName(ulEl, 'chevron');
var isDotted=Css.hasClassName(ulEl, 'dotted');
var createLiEl=Ink.bind(function (name, options){
var liEl=document.createElement(this._options.childTag);
var aEl=genAEl(this._options[name + 'Label'], undefined, { wrapText: options&&options.wrapText });
Css.addClassName(liEl, this._options[name + 'Class']);
liEl.appendChild(aEl);
ulEl.appendChild(liEl);
return liEl;
}, this);
if(!isDotted&&this._options.maxSize){
this._firstEl=createLiEl('first');
this._prevPageEl=createLiEl('previousPage');
}
var showSideButtons =
(isDotted&&isChevron) ||
(isDotted&&!isChevron&&this._options.sideButtons===true) ||
(!isDotted&&!!this._options.sideButtons);
if(showSideButtons){
this._prevEl=createLiEl('previous', { wrapText: isChevron });
this._nextEl=createLiEl('next', { wrapText: isChevron });
}
if(!isDotted&&this._options.maxSize){
this._nextPageEl=createLiEl('nextPage');
this._lastEl=createLiEl('last');
}
if(!hasUlAlready){
el.appendChild(ulEl);
}
this._ulEl=ulEl;
},
_onClick: function(ev){
Event.stopDefault(ev);
var liEl=Event.element(ev);
if(Css.hasClassName(liEl, this._options.activeClass) ||
Css.hasClassName(liEl, this._options.disabledClass)){ return; }
var isPrev=Css.hasClassName(liEl, this._options.previousClass);
var isNext=Css.hasClassName(liEl, this._options.nextClass);
var isPrevPage=Css.hasClassName(liEl, this._options.previousPageClass);
var isNextPage=Css.hasClassName(liEl, this._options.nextPageClass);
var isFirst=Css.hasClassName(liEl, this._options.firstClass);
var isLast=Css.hasClassName(liEl, this._options.lastClass);
if(isFirst){
this.setCurrent(0);
}
else if(isLast){
this.setCurrent(this._size - 1);
}
else if(isPrevPage||isNextPage){
this.setCurrent((isPrevPage ? -1:1) * this._options.maxSize,
true ,
!!this._options.autoWrap );
}
else if(isPrev||isNext){
this.setCurrent(isPrev ? -1:1,
true ,
!!this._options.autoWrap );
}else{
var aElem=Selector.select('[data-index]', liEl)[0];
var nr=aElem&&parseInt(aElem.getAttribute('data-index'), 10);
this.setCurrent(nr);
}},
setOnChange: function (onChange){
if(onChange&&typeof onChange!=='function'){
throw new TypeError('onChange option must be a function!');
}
this._options.onChange=onChange;
},
setSize: function(sz){
if(!Common.isInteger(sz)){
throw new TypeError('1st argument must be an integer number!');
}
this._size=sz;
this._updateItems();
this._current=0;
},
setSizeInItems: function (totalItems, itemsPerPage){
var pageNumber=Math.ceil(totalItems / itemsPerPage);
this.setSize(pageNumber);
},
setCurrent: function(nr, isRelative, wrap){
if(!Common.isInteger(nr)){
throw new TypeError('1st argument must be an integer number!');
}
if(isRelative){
nr +=this._current;
}
if(wrap){
nr %=this._size;
if(nr < 0){
nr +=this._size;
}}else{
if(nr > this._size - 1){
nr=this._size - 1;
}
if(nr < 0){
nr=0;
}}
this._current=nr;
this._updateItems();
if(this._options.onChange){
this._options.onChange(this, nr);
}
},
next: function (wrap){
this.setCurrent(1, true , wrap);
},
previous: function (wrap){
this.setCurrent(-1, true , wrap);
},
getSize: function(){
return this._size;
},
getCurrent: function(){
return this._current;
},
isFirst: function(){
return this._current===0;
},
isLast: function(){
return this._current===this._size - 1;
},
hasPrevious: function(){
return this._current > 0;
},
hasNext: function(){
return this._current < this._size - 1;
},
hasPreviousPage: function(){
return this._options.maxSize&&this._current > this._options.maxSize - 1;
},
hasNextPage: function(){
return this._options.maxSize&&this._size - this._current >=this._options.maxSize + 1;
},
destroy: Common.destroyComponent
};
Common.createUIComponent(Pagination);
return Pagination;
});
Ink.createModule('Ink.UI.ProgressBar', '1', ['Ink.UI.Common_1', 'Ink.Dom.Selector_1'], function(Common, Selector){
'use strict';
function ProgressBar(){
Common.BaseUIComponent.apply(this, arguments);
}
ProgressBar._name='ProgressBar_1';
ProgressBar._optionDefinition={
startValue: ['Number', 0],
onStart: ['Function', function (){}],
onEnd: ['Function', function (){}]
};
ProgressBar.prototype={
_init: function(){
this._value=this._options.startValue;
this._elementBar=Selector.select('.bar',this._element);
if(this._elementBar.length < 1){
throw new Error('[Ink.UI.ProgressBar] :: Bar element not found');
}
this._elementBar=this._elementBar[0];
this.setValue(this._options.startValue);
},
setValue: function(newValue){
this._options.onStart.call(this, this._value);
newValue=parseInt(newValue,10);
if(isNaN(newValue)||(newValue < 0)){
newValue=0;
}else if(newValue>100){
newValue=100;
}
this._value=newValue;
this._elementBar.style.width=this._value + '%';
this._options.onEnd.call(this, this._value);
}};
Common.createUIComponent(ProgressBar);
return ProgressBar;
});
Ink.createModule('Ink.UI.SmoothScroller', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1','Ink.Dom.Css_1'], function(Common, Event, InkElement, Selector, Css){
'use strict';
var requestAnimationFrame =
window.requestAnimationFrame ||
function (cb){ return setTimeout(cb, 10); };
var cancelAnimationFrame =
window.cancelAnimationFrame ||
function (id){ clearTimeout(id); };
var SmoothScroller={
speed: 10,
changeHash: true,
margin: 0,
scroll: function(scrollTop, options){
var a=Math.round(InkElement.scrollHeight());
var endPos=Math.round(scrollTop - (options.margin||0));
if(endPos > a){
a +=Math.ceil((endPos - a) / options.speed);
}else{
a=a + (endPos - a) / options.speed;
}
cancelAnimationFrame(SmoothScroller.interval);
if(!((a)===endPos||SmoothScroller.offsetTop===a)){
SmoothScroller.interval=requestAnimationFrame(
Ink.bindMethod(SmoothScroller, 'scroll', scrollTop, options), document.body);
}else{
SmoothScroller.onDone(options);
}
window.scrollTo(0, a);
SmoothScroller.offsetTop=a;
},
init: function(selector){
Event.on(document, 'click', selector||'a.scrollableLink, a.ink-smooth-scroll', SmoothScroller.onClick);
},
render: function(){},
onClick: function(event){
var link=event.currentTarget;
var thisDocument=(location + '').replace(/#.*?$/, '');
var linkedDocument=(link.href + '').replace(/#.*?$/, '');
if(linkedDocument!==thisDocument){
return;
}
var hash=link.getAttribute('data-hash')||(link.getAttribute('href')||'')
.replace(/^.*?#/, '');
if(hash){
event.preventDefault();
var selector='a[name="' + hash + '"],#' + hash;
var elm=Ink.s(selector);
var closestUL=InkElement.findUpwardsBySelector(link, 'ul');
if(closestUL){
var currentlyActive=Ink.s('li.active', closestUL);
Css.removeClassName(currentlyActive, 'active')
}
if(elm){
if(link.parentNode&&link.parentNode.tagName.toLowerCase()==='li'){
Css.addClassName(link.parentNode, 'active');
}
var options=Common.options('SmoothScroller link options', {
margin: ['Number', SmoothScroller.margin],
speed: ['Number', SmoothScroller.speed],
changeHash: ['Boolean', SmoothScroller.changeHash]
}, {}, link);
SmoothScroller.hash=hash;
SmoothScroller.scroll(InkElement.offsetTop(elm), options);
}}
},
onDone: function (options){
if(options.changeHash===true){
window.location.hash=SmoothScroller.hash;
}
SmoothScroller.hash=SmoothScroller.offsetTop=null;
}};
return SmoothScroller;
});
Ink.createModule('Ink.UI.SortableList', '1', ['Ink.UI.Common_1','Ink.Dom.Css_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function(Common, Css, Events, Element, Selector){
'use strict';
var hasTouch=(('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0));
function SortableList(){
Common.BaseUIComponent.apply(this, arguments);
}
SortableList._name='SortableList_1';
SortableList._optionDefinition={
'placeholderClass': ['String', 'placeholder'],
'draggedClass': ['String', 'hide-all'],
'draggingClass': ['String', 'dragging'],
'dragSelector': ['String', '> li'],
'handleSelector': ['String', ':not(button, button *, a[href], a[href] *)'],
'moveSelector': ['String', false],
'swap': ['Boolean', false],
'cancelMouseOut': ['Boolean', false],
'onDrop': ['Function', function(){}]
};
SortableList.prototype={
_init: function(){
this._handlers={
down: Ink.bind(this._onDown, this),
move: Ink.bind(this._onMove, this),
up:   Ink.bind(this._onUp, this)
};
this._isMoving=false;
this._down=hasTouch ? 'touchstart mousedown':'mousedown';
this._move=hasTouch ? 'touchmove mousemove':'mousemove';
this._up=hasTouch ? 'touchend mouseup':'mouseup';
this._observe();
},
_observe: function(){
Events.on(this._element, this._down, this._options.dragSelector, this._handlers.down);
Events.on(this._element, this._move, this._options.dragSelector, this._handlers.move);
if(this._options.cancelMouseOut){
Events.on(this._element, 'mouseleave', Ink.bind(this.stopMoving, this));
}
Events.on(document.documentElement, this._up, this._handlers.up);
},
_onDown: function(ev){
if(this._isMoving||this._placeholder){ return; }
var tgtEl=ev.currentTarget;
if(this._options.handleSelector &&
Ink.s(this._options.handleSelector, this._currentTarget)){
var handle=Element.findUpwardsBySelector(ev.target, this._options.handleSelector);
if(!(handle&&(Element.isAncestorOf(tgtEl, handle)||tgtEl===handle))){
return;
}}
this._isMoving=tgtEl;
this._placeholder=tgtEl.cloneNode(true);
this._movePlaceholder(tgtEl);
this._addMovingClasses();
return false;
},
_onMove: function(ev){
var target=ev.currentTarget;
if(ev.type==='touchmove'){
var touch=ev.touches[0];
target=document.elementFromPoint(touch.clientX, touch.clientY);
target=Element.findUpwardsBySelector(target, this._options.dragSelector);
}
this.validateMove(target);
ev.preventDefault();
},
_onUp: function(ev){
if(!this._isMoving||!this._placeholder){ return; }
if(ev.currentTarget===this._isMoving){ return; }
if(ev.currentTarget===this._placeholder){ return; }
Element.insertBefore(this._isMoving, this._placeholder);
this.stopMoving();
this._options.onDrop.call(this, { droppedElement: ev.currentTarget });
return false;
},
_addMovingClasses: function(){
Css.addClassName(this._placeholder, this._options.placeholderClass);
Css.addClassName(this._isMoving, this._options.draggedClass);
Css.addClassName(document.documentElement, this._options.draggingClass);
},
_removeMovingClasses: function(){
if(this._isMoving){ Css.removeClassName(this._isMoving, this._options.draggedClass); }
if(this._placeholder){ Css.removeClassName(this._placeholder, this._options.placeholderClass); }
Css.removeClassName(document.documentElement, this._options.draggingClass);
},
_movePlaceholder: function(target){
var placeholder=this._placeholder,
target_position,
placeholder_position,
from_top,
from_left;
if(!placeholder){
Element.insertAfter(placeholder, target);
}else if(this._options.swap){
Element.insertAfter(placeholder, target);
Element.insertBefore(target, this._isMoving);
Element.insertBefore(this._isMoving, placeholder);
}else{
target_position=Element.offset(target);
placeholder_position=Element.offset(this._placeholder);
from_top=target_position[1] > placeholder_position[1];
from_left=target_position[0] > placeholder_position[0];
if(( from_top&&from_left)||(!from_top&&!from_left) ){
Element.insertBefore(placeholder, target);
}else{
Element.insertAfter(placeholder, target);
}
Element.insertBefore(this._isMoving, placeholder);
}},
destroy: Common.destroyComponent,
stopMoving: function(){
this._removeMovingClasses();
Element.remove(this._placeholder);
this._placeholder=false;
this._isMoving=false;
},
validateMove: function(elem){
if(!elem||!this._isMoving||!this._placeholder){ return; }
if(elem===this._placeholder){ return; }
if(elem===this._isMoving){ return; }
if(!this._options.moveSelector||Selector.matchesSelector(elem, this._options.moveSelector)){
this._movePlaceholder(elem);
}else{
this.stopMoving();
}}
};
Common.createUIComponent(SortableList);
return SortableList;
});
Ink.createModule('Ink.UI.Spy', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function(Common, Event, Css, Element, Selector){
'use strict';
var spyTargets=[
];
function targetIndex(target){
for (var i=0, len=spyTargets.length; i < len; i++){
if(spyTargets[i][0]===target){
return i;
}}
return null;
}
function addSpied(spied, target, options){
var index=targetIndex(target);
if(index===null){
spyTargets.push([target, [spied], options]);
}else{
spyTargets[index][1].push(spied);
}}
var observingOnScroll=false;
function observeOnScroll(){
if(!observingOnScroll){
observingOnScroll=true;
Event.observe(document, 'scroll', Event.throttle(onScroll, 300));
}}
function onScroll(){
for (var i=0, len=spyTargets.length; i < len; i++){
onScrollForTarget(spyTargets[i][0], spyTargets[i][1], spyTargets[i][2]);
}}
function onScrollForTarget(target, spied, options){
var activeEl=findActiveElement(spied, options);
var toDeactivate=Selector.select('li.active', target);
for (var i=0, total=toDeactivate.length; i < total; i++){
Css.removeClassName(toDeactivate[i], 'active');
}
if(activeEl===null){
return;
}
var menuLinkSelector='a[href$="#' + (activeEl.name||activeEl.id) + '"]';
var toActivate=Selector.select(menuLinkSelector, target);
for (i=0, total=toActivate.length; i < total; i++){
Css.addClassName(Element.findUpwardsByTag(toActivate[i], 'li'), 'active');
}}
function findActiveElement(spied, options){
var closest=-Infinity;
var closestIndex;
var top;
for(var i=0, total=spied.length; i < total; i++){
top=spied[i].getBoundingClientRect().top;
if(options.margin){
top -=options.margin;
}
if(top <=0&&top > closest){
closest=top;
closestIndex=i;
}}
if(closestIndex===undefined){
return null;
}else{
return spied[closestIndex];
}}
function Spy(){
Common.BaseUIComponent.apply(this, arguments);
}
Spy._name='Spy_1';
Spy._optionDefinition={
target: ['Element', undefined],
margin: ['Number', 0]
};
Spy.prototype={
_init: function(){
addSpied(this._element, this._options.target, this._options);
observeOnScroll();
onScroll();
}};
Common.createUIComponent(Spy);
return Spy;
});
Ink.createModule('Ink.UI.Stacker', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(Common, InkEvent, InkElement){
'use strict';
function Stacker(){
Common.BaseUIComponent.apply(this, arguments);
}
Stacker._name='Stacker_1';
Stacker._optionDefinition={
column: ['String', '.stacker-column'],
item: ['String', '.stacker-item'],
customBreakPoints: ['Object', null],
largeMax: ['Number', Number.MAX_VALUE],
largeMin: ['Number', 961],
mediumMax: ['Number', 960],
mediumMin: ['Number', 651],
smallMax: ['Number', 650],
smallMin: ['Number', 0],
largeCols: ['Integer', 3],
mediumCols: ['Integer', 2],
smallCols: ['Integer', 1],
isOrdered: ['Boolean', true],
onRunCallback: ['Function', null],
onResizeCallback: ['Function', null],
onAPIReloadCallback: ['Function', null]
};
Stacker.prototype={
_init: function(){
this._aList=[];
this._curLayout='large';
this._runFirstTime=false;
this._getPageItemsToList();
if(this._canApplyLayoutChange()||!this._runFirstTime){
this._runFirstTime=true;
this._applyLayoutChange();
if(typeof(this._options.onRunCallback)==='function'){
this._options.onRunCallback(this._curLayout);
}}
this._addEvents();
},
addItem: function(item){
this._aList.push(item);
},
reloadItems: function(){
this._applyLayoutChange();
if(typeof(this._options.onAPIReloadCallback)==='function'){
this._options.onAPIReloadCallback(this._curLayout);
}},
_addEvents: function(){
InkEvent.observe(window, 'resize', Ink.bindEvent(this._onResize, this));
},
_onResize: function(){
if(this._canApplyLayoutChange()){
this._removeDomItems();
this._applyLayoutChange();
if(typeof(this._options.onResizeCallback)==='function'){
this._options.onResizeCallback(this._curLayout);
}}
},
_setCurLayout: function(){
var viewportWidth=InkElement.viewportWidth();
if(this._options.customBreakpoints&&typeof(this._options.customBreakPoints)==='object'){
for(var prop in this._options.customBreakPoints){
if(this._options.customBreakPoints.hasOwnProperty(prop)){
if(viewportWidth >=Number(this._options.customBreakPoints[prop].min)&&viewportWidth <=Number(this._options.customBreakPoints[prop].max)&&this._curLayout!==prop){
this._curLayout=prop;
return;
}}
}}else{
if(viewportWidth <=Number(this._options.largeMax)&&viewportWidth >=Number(this._options.largeMin)&&this._curLayout!=='large'){
this._curLayout='large';
}else if(viewportWidth >=Number(this._options.mediumMin)&&viewportWidth <=Number(this._options.mediumMax)&&this._curLayout!=='medium'){
this._curLayout='medium';
}else if(viewportWidth >=Number(this._options.smallMin)&&viewportWidth <=Number(this._options.smallMax)&&this._curLayout!=='small'){
this._curLayout='small';
}}
},
_getColumnsToShow: function(){
if(this._options.customBreakPoints&&typeof(this._options.customBreakPoints)==='object'){
return Number(this._options.customBreakPoints[this._curLayout].cols);
}else{
return Number(this._options[this._curLayout+'Cols']);
}},
_canApplyLayoutChange: function(){
var curLayout=this._curLayout;
this._setCurLayout();
if(curLayout!==this._curLayout){
return true;
}
return false;
},
_getPageItemsToList: function(){
this._aColumn=Ink.ss(this._options.column, this._element);
var totalCols=this._aColumn.length;
var index=0;
if(totalCols > 0){
for(var i=0; i < this._aColumn.length; i++){
var aItems=Ink.ss(this._options.item, this._aColumn[i]);
for(var j=0; j < aItems.length; j++){
if(this._options.isOrdered){
index=i + (j * totalCols);
}
this._aList[index]=aItems[j];
if(!this._options.isOrdered){
index++;
}
aItems[j].parentNode.removeChild(aItems[j]);
}}
if(this._aList.length > 0&&this._options.isOrdered){
var aNewList=[];
for(var ii=0; ii < this._aList.length; ii++){
if(typeof(this._aList[ii])!=='undefined'){
aNewList.push(this._aList[ii]);
}}
this._aList=aNewList;
}}
},
_removeDomItems: function(){
var totalCols=this._aColumn.length;
if(totalCols > 0){
for(var i=0; i < totalCols; i++){
var aItems=Ink.ss(this._options.item, this._aColumn[i]);
for(var j=aItems.length - 1; j >=0; j--){
aItems[j].parentNode.removeChild(aItems[j]);
}}
}},
_applyLayoutChange: function(){
var totalCols=this._getColumnsToShow();
var totalItems=this._aList.length;
var index=0;
var countCol=0;
if(totalCols > 0){
while(countCol < totalCols){
this._aColumn[countCol].appendChild(this._aList[index]);
index++;
countCol++;
if(index===totalItems){
return;
}
if(countCol===totalCols){
countCol=0;
}}
}}
};
Common.createUIComponent(Stacker);
return Stacker;
});
Ink.createModule('Ink.UI.Sticky', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Css_1'], function(Common, Event, Element, Css){
'use strict';
function Sticky(){
Common.BaseUIComponent.apply(this, arguments);
}
Sticky._name='Sticky_1';
Sticky._optionDefinition={
offsetBottom: ['Integer', 0],
offsetTop: ['Integer', 0],
topElement: ['Element', null],
wrapperClass: ['String', 'ink-sticky-wrapper'],
stickyClass: ['String', 'ink-sticky-stuck'],
inlineDimensions: ['Boolean', true],
inlinePosition: ['Boolean', true],
bottomElement: ['Element', null],
activateInLayouts: ['String', null]
};
Sticky.prototype={
_init: function(){
if(this._options.activateInLayouts){
this._options.activateInLayouts=this._options.activateInLayouts.toString();
}
this._dims=null;
this._options.offsetTop=parseInt(this._options.offsetTop, 10)||0;
this._options.offsetBottom=parseInt(this._options.offsetBottom, 10)||0;
if(this._options.topElement){
this._options.topElement=Common.elOrSelector(this._options.topElement, 'Top Element');
}
if(this._options.bottomElement){
this._options.bottomElement=Common.elOrSelector(this._options.bottomElement, 'Sticky bottom Element');
}
this._wrapper=Element.create('div', { className: this._options.wrapperClass });
Element.wrap(this._element, this._wrapper);
var scrollTarget=document.addEventListener ? document:window;
this._onScroll=Ink.bind(Event.throttle(this._onScroll, 33), this);
Event.observe(scrollTarget, 'scroll', this._onScroll);
Event.observe(window, 'resize', Ink.bindEvent(Event.throttle(this._onResize, 100), this));
this._onScroll();
},
_isDisabledInLayout: function (){
if(!this._options.activateInLayouts){
return false;
}
var currentLayout=Common.currentLayout();
if(!currentLayout){ return false; }
return this._options.activateInLayouts.indexOf(currentLayout)===-1;
},
_onScroll: function(){
var dims=this._getDims();
var scrollHeight=Element.scrollHeight();
var unstick=this._isDisabledInLayout() ||
scrollHeight <=dims.top - this._options.offsetTop ||
(this._options.topElement&&this._options.topElement.getBoundingClientRect().bottom + this._options.offsetTop > 0);
if(unstick){
this._unstick();
return;
}
var bottomOfSticky=this._options.offsetTop + dims.height + Element.scrollHeight();
var maxBottomOfSticky=document.body.scrollHeight;
if(this._options.bottomElement){
maxBottomOfSticky =
this._options.bottomElement.getBoundingClientRect().top +
Element.scrollHeight();
}
maxBottomOfSticky -=this._options.offsetBottom;
if(bottomOfSticky < maxBottomOfSticky){
this._stickTo('screen');
}else{
this._stickTo('bottom');
}},
_stickTo: function (where){
var style=this._element.style;
var dims=this._getDims();
Css.addClassName(this._element, this._options.stickyClass);
this._wrapper.style.height=dims.height + 'px';
this._inlineDimensions(dims.height + 'px', dims.width + 'px');
if(this._options.inlinePosition===false){
return;
}
style.left=dims.left + 'px';
if(where==='screen'){
style.bottom=null;
style.top=this._options.offsetTop + 'px';
}else if(where==='bottom'){
var bottom=this._getBottomOffset();
var bottomOfViewport=Element.scrollHeight() + Element.viewportHeight();
var toBottomOfDocument=Element.pageHeight() - bottomOfViewport;
style.bottom=bottom - toBottomOfDocument + 'px';
style.top='auto';
}},
_unstick: function (){
Css.removeClassName(this._element, this._options.stickyClass);
this._inlineDimensions(null, null);
if(this._options.inlinePosition){
this._element.style.left=null;
this._element.style.top=null;
this._element.style.bottom=null;
}
this._wrapper.style.height=null;
this._wrapper.style.width=null;
this._dims=null;
},
_onResize: function(){
this._dims=null;
this._onScroll();
},
_getDims: function (){
if(this._dims!==null){ return this._dims; }
var style=this._element.style;
var oldPosition=style.position;
var oldWidth=style.width;
style.position='static';
style.width=null;
var dimensionsInStatic=Element.outerDimensions(this._element);
var rect=this._wrapper.getBoundingClientRect();
this._dims={
height: dimensionsInStatic[1],
width: dimensionsInStatic[0],
left: rect.left + Element.scrollWidth(),
top: rect.top + Element.scrollHeight()
};
style.position=oldPosition;
style.width=oldWidth;
return this._dims;
},
_inlineDimensions: function (height, width){
if(this._options.inlineDimensions){
this._element.style.height=height;
this._element.style.width=width;
}},
_getBottomOffset: function (){
var bottom=this._options.offsetBottom;
if(this._options.bottomElement){
bottom +=Element.pageHeight() -
Element.offsetTop(this._options.bottomElement);
}
return bottom;
}};
Common.createUIComponent(Sticky);
return Sticky;
});
Ink.createModule('Ink.UI.Swipe', '1', ['Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.UI.Common_1'], function(InkEvent, InkElement, Common){
'use strict';
function Swipe(){
if(typeof arguments[1]==='function'){
arguments[1]={ onEnd: arguments[1] };}
Common.BaseUIComponent.apply(this, arguments);
}
Swipe._name='Swipe_1';
Swipe._optionDefinition={
onEnd:          ['Function', undefined],
onStart:        ['Function', undefined],
onMove:         ['Function', undefined],
minDist:        ['Number',   undefined],
maxDist:        ['Number',   undefined],
minDuration:    ['Number',   undefined],
maxDuration:    ['Number',   undefined],
axis:           ['String',   undefined],
storeGesture:   ['Boolean',  false],
stopEvents:     ['Boolean',  true]
};
Swipe.prototype={
_supported: ('ontouchstart' in document.documentElement),
_init: function(){
this._handlers={
down: Ink.bindEvent(this._onDown, this),
move: Ink.bindEvent(this._onMove, this),
up:   Ink.bindEvent(this._onUp, this)
};
var db=document.body;
InkEvent.observe(db, 'touchstart', this._handlers.down);
if(this._options.storeGesture||this._options.onMove){
InkEvent.observe(db, 'touchmove', this._handlers.move);
}
InkEvent.observe(db, 'touchend', this._handlers.up);
this._isOn=false;
},
_isMeOrParent: function(el, parentEl){
if(!el){return;}
do {
if(el===parentEl){ return true; }
el=el.parentNode;
} while (el);
return false;
},
_pushGesture: function (coords, dt){
if(this._options.storeGesture){
this._gesture.push(coords);
this._time.push(dt);
}},
_onDown: function(event){
if(event.changedTouches.length!==1){ return; }
if(!this._isMeOrParent(event.target, this._element)){ return; }
if(this._options.stopEvents===true){
InkEvent.stop(event);
}
event=event.changedTouches[0];
this._isOn=true;
this._target=event.target;
this._t0=+new Date();
this._p0=[event.pageX, event.pageY];
if(this._options.storeGesture){
this._gesture=[];
this._time=[];
}
this._pushGesture(this._p0, 0);
if(this._options.onStart){
this._options.onStart({
event: event,
element: this._element,
instance: this,
position: this._p0,
dt: 0
});
}},
_onMove: function(event){
if(!this._isOn||event.changedTouches.length!==1){ return; }
if(this._options.stopEvents===true){
InkEvent.stop(event);
}
event=event.changedTouches[0];
var t1=+new Date();
var dt=(t1 - this._t0);
var gesture=[event.pageX, event.pageY];
this._pushGesture(gesture, dt);
if(this._options.onMove){
this._options.onMove({
event: event,
element: this._element,
instance: this,
position: gesture,
dt: dt
});
}},
_onUp: function(event){
if(!this._isOn||event.changedTouches.length!==1){ return; }
if(this._options.stopEvents===true){
InkEvent.stop(event);
}
event=event.changedTouches[0];
this._isOn=false;
var t1=+new Date();
var p1=[event.pageX, event.pageY];
var dt=(t1 - this._t0);
var dr=[
p1[0] - this._p0[0],
p1[1] - this._p0[1]
];
var dist=Math.sqrt(dr[0]*dr[0] + dr[1]*dr[1]);
var axis=Math.abs(dr[0]) > Math.abs(dr[1]) ? 'x':'y';
var o=this._options;
if(o.minDist&&dist <   o.minDist){     return; }
if(o.maxDist&&dist >   o.maxDist){     return; }
if(o.minDuration&&dt   <   o.minDuration){ return; }
if(o.maxDuration&&dt   >   o.maxDuration){ return; }
if(o.axis&&axis!==o.axis){     return; }
if(this._options.onEnd){
this._options.onEnd({
event: event,
element: this._element,
instance: this,
gesture: this._gesture,
time: this._time,
axis: axis,
overallMovement: dr,
overallTime: dt
});
}}
};
Common.createUIComponent(Swipe);
return Swipe;
});
Ink.createModule('Ink.UI.Table', '1', ['Ink.Util.Url_1','Ink.UI.Pagination_1','Ink.Net.Ajax_1','Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.String_1', 'Ink.Util.Json_1'], function(InkUrl,Pagination, Ajax, Common, Event, Css, Element, Selector, InkArray, InkString, Json){
'use strict';
var rNumber=/\d/g;
function maybeTurnIntoNumber(value){
if(!isNaN(value)&&rNumber.test(value)){
return parseInt(value, 10);
}else if(!isNaN(value)){
return parseFloat(value);
}
return value;
}
function cmp (a, b){
if(a===b){
return 0;
}
return(( a > b) ? 1:-1);
}
function numberishEnabledCmp (a, b){
var aValue=maybeTurnIntoNumber(Element.textContent(a));
var bValue=maybeTurnIntoNumber(Element.textContent(b));
if(typeof aValue===typeof bValue){
return cmp(aValue, bValue);
}else{
if(typeof aValue==='number'){
return 1;
}else{
return -1;
}}
return cmp(aValue, bValue);
}
function keys(obj){
if(typeof Object.keys!=='undefined'){
return Object.keys(obj);
}
var ret=[];
for (var k in obj) if(obj.hasOwnProperty(k)){
ret.push(k);
}
return ret;
}
function Table(){
Common.BaseUIComponent.apply(this, arguments);
}
Table._name='Table_1';
function sameSame(obj){ return obj; }
Table._optionDefinition={
pageSize: ['Integer', null],
caretUpClass: ['String', 'fa fa-caret-up'],
caretDownClass: ['String', 'fa fa-caret-down'],
endpoint: ['String', null],
createEndpointUrl: ['Function', null],
createEndpointURL: ['Function', null ],
getDataFromEndPoint: ['Function', null],
getDataFromEndpoint: ['Function', null ],
processJSONRows: ['Function', function (dt){ return typeof dt.length==='number' ? dt:(dt.rows||null); }],
processJSONRow: ['Function', sameSame],
processJSONField: ['Function', sameSame],
processJSONHeaders: ['Function', function (dt){ return dt.fields; }],
processJSONTotalRows: ['Function', function (dt){ return dt.totalRows||dt.length; }],
getSortKey: ['Function', null],
pagination: ['Element', null],
allowResetSorting: ['Boolean', false],
visibleFields: ['String', null],
tdClassNames: ['Object', {}],
paginationOptions: ['Object', null]
};
Table.prototype={
_validate: function (){
if(this._element.nodeName.toLowerCase()!=='table'){
throw new Error('[Ink.UI.Table] :: The element is not a table');
}},
_init: function(){
if(this._options.createEndpointUrl){
this._options.createEndpointURL=this._options.createEndpointUrl;
}
if(this._options.getDataFromEndPoint){
this._options.getDataFromEndpoint=this._options.getDataFromEndpoint;
}
this._markupMode = !(this._options.endpoint||this._options.createEndpointURL);
if(this._options.visibleFields){
this._options.visibleFields=this._options.visibleFields.toString().split(/[, ]+/g);
}
this._thead=this._element.tHead||this._element.createTHead();
this._headers=Selector.select('th', this._thead);
this._handlers={
thClick: null
};
this._originalFields=[
];
this._sortableFields={
};
this._originalData=this._data=[];
this._pagination=null;
this._totalRows=0;
this._handlers.thClick=Event.on(this._element, 'click',
'thead th[data-sortable="true"]',
Ink.bindMethod(this, '_onThClick'));
if(!this._markupMode){
this._getData();
} else  {
this._resetSortOrder();
this._addHeadersClasses();
this._data=Selector.select('tbody tr', this._element);
this._originalData=this._data.slice(0);
this._totalRows=this._data.length;
this._setPagination();
}},
_addHeadersClasses: function (){
var headerLabel;
var classNames;
for (var i=0, len=this._headers.length; i < len; i++){
headerLabel=Element.textContent(this._headers[i]);
classNames=this._options.tdClassNames[headerLabel];
if(classNames){
Css.addClassName(this._headers[i], classNames);
}}
},
_onThClick: function(event){
var tgtEl=Event.element(event),
paginated=this._options.pageSize!==undefined;
Event.stopDefault(event);
var index=InkArray.keyValue(tgtEl, this._headers, true);
var sortable=index!==false&&this._sortableFields[index]!==undefined;
if(!sortable){
return;
}
if(!this._markupMode&&paginated){
this._invertSortOrder(index, false);
}else{
if((this._sortableFields[index]==='desc')&&this._options.allowResetSorting){
this._setSortOrderOfColumn(index, null);
this._data=this._originalData.slice(0);
}else{
this._invertSortOrder(index, true);
}
var tbody=Selector.select('tbody',this._element)[0];
InkArray.each(this._data, function (row){
tbody.appendChild(row);
});
if(this._pagination){
this._pagination.setCurrent(0);
this._paginate(1);
}}
},
_invertSortOrder: function (index, sortAndReverse){
var isAscending=this._sortableFields[index]==='asc';
for (var i=0, len=this._headers.length; i < len; i++){
this._setSortOrderOfColumn(i, null);
}
this._setSortOrderOfColumn(index, !isAscending);
if(sortAndReverse){
this._sort(index);
if(isAscending){
this._data.reverse();
}}else{
this._getData();
}},
_setSortOrderOfColumn: function(index, up){
var header=this._headers[index];
var caretHtml=[''];
var order='none';
if(up===true){
caretHtml=['<i class="', this._options.caretUpClass, '"></i>'];
order='asc';
}else if(up===false){
caretHtml=['<i class="', this._options.caretDownClass, '"></i>'];
order='desc';
}
this._sortableFields[index]=order;
header.innerHTML=Element.textContent(header) + caretHtml.join('');
},
_paginate: function(page){
if(!this._pagination){ return; }
var pageSize=this._options.pageSize;
var firstIndex=(page - 1) * pageSize;
var lastIndex=firstIndex + pageSize;
InkArray.each(this._data, function(item, index){
if(index >=firstIndex&&index < lastIndex){
Css.removeClassName(item,'hide-all');
}else{
Css.addClassName(item,'hide-all');
}});
},
_registerFieldNames: function (names){
this._originalFields=[];
InkArray.forEach(names, Ink.bind(function (field){
if(!this._fieldIsVisible(field)){
return;
}
this._originalFields.push(field);
}, this));
},
_fieldIsVisible: function (field){
return !this._options.visibleFields ||
(this._options.visibleFields.indexOf(field)!==-1);
},
_sort: function(index){
var fieldName=Element.textContent(this._headers[index]);
var keyFunction=this._options.getSortKey;
if(keyFunction){
keyFunction =
typeof keyFunction[fieldName]==='function' ?
keyFunction[fieldName] :
typeof keyFunction==='function' ?
keyFunction :
null;
}
var self=this;
this._data.sort(function (trA, trB){
var elementA=Ink.ss('td', trA)[index];
var elementB=Ink.ss('td', trB)[index];
if(keyFunction){
return cmp(userKey(elementA), userKey(elementB));
}else{
return numberishEnabledCmp(elementA, elementB, index);
}});
function userKey(element){
return keyFunction.call(self, {
columnIndex: index,
columnName: fieldName,
data: Element.textContent(element),
element: element
});
}},
_createHeadersFromJson: function(headers){
this._registerFieldNames(keys(headers));
if(this._thead.children.length){ return; }
var tr=this._thead.insertRow(0);
var th;
for (var i=0, len=headers.length; i < len; i++){
if(this._fieldIsVisible(headers[i])){
th=Element.create('th');
th=this._createSingleHeaderFromJson(headers[i], th);
tr.appendChild(th);
this._headers.push(th);
}}
},
_createSingleHeaderFromJson: function (header, th){
if(header.sortable){
th.setAttribute('data-sortable','true');
}
if(header.label){
Element.setTextContent(th, header.label);
}
return th;
},
_resetSortOrder: function(){
for (var i=0, len=this._headers.length; i < len; i++){
var dataset=Element.data(this._headers[i]);
if(dataset.sortable&&dataset.sortable.toString()==='true'){
this._sortableFields[i]='none';
}}
},
_createRowsFromJSON: function(rows){
var tbody=Selector.select('tbody',this._element)[0];
if(!tbody){
tbody=document.createElement('tbody');
this._element.appendChild(tbody);
}else{
Element.setHTML(tbody, '');
}
this._data=[];
var row;
for (var trIndex in rows){
if(rows.hasOwnProperty(trIndex)){
row=this._options.processJSONRow(rows[trIndex]);
this._createSingleRowFromJson(tbody, row, trIndex);
}}
this._originalData=this._data.slice(0);
},
_createSingleRowFromJson: function (tbody, row, rowIndex){
var tr=document.createElement('tr');
tbody.appendChild(tr);
for(var field in row){
if(row.hasOwnProperty(field)){
this._createFieldFromJson(tr, row[field], field, rowIndex);
}}
this._data.push(tr);
},
_createFieldFromJson: function (tr, fieldData, fieldName, rowIndex){
if(!this._fieldIsVisible(fieldName)){ return; }
var processor =
this._options.processJSONField[fieldName] ||
this._options.processJSONField;
var result;
if(typeof processor==='function'){
result=processor(fieldData, fieldName, rowIndex);
}else{
result=fieldData;
}
var elm=this._elOrFieldData(result);
var className=this._options.tdClassNames[fieldName];
if(className){
Css.addClassName(elm, className);
}
tr.appendChild(elm);
},
_elOrFieldData: function (processed){
if(Common.isDOMElement(processed)){
return processed;
}
var isString=typeof processed==='string';
var isNumber=typeof processed==='number';
var elm=Element.create('td');
if(isString&&/^\s*?</.test(processed)){
Element.setHTML(elm, processed);
}else if(isString||isNumber){
Element.setTextContent(elm, processed);
}else{
throw new Error('Ink.UI.Table Unknown result from processJSONField: ' + processed);
}
return elm;
},
setEndpoint: function(endpoint, currentPage){
if(!this._markupMode){
this._options.endpoint=endpoint;
if(this._pagination){
this._pagination.setCurrent(currentPage ? parseInt(currentPage,10):0);
}}
},
_setPagination: function(){
if(this._options.pageSize==null){ return; }
var paginationEl=this._options.pagination;
if(paginationEl instanceof Pagination){
this._pagination=paginationEl;
return;
}
if(!paginationEl){
paginationEl=Element.create('nav', {
className: 'ink-navigation',
insertAfter: this._element
});
Element.create('ul', {
className: 'pagination',
insertBottom: paginationEl
});
}
var paginationOptions=Ink.extendObj({
totalItemCount: this._totalRows,
itemsPerPage: this._options.pageSize,
onChange: Ink.bind(function (_, pageNo){
this._paginate(pageNo + 1);
}, this)
}, this._options.paginationOptions||{});
this._pagination=new Pagination(paginationEl, paginationOptions);
this._paginate(1);
},
_getData: function(){
var sortOrder=this._getSortOrder()||null;
var page=null;
if(this._options.pageSize){
page={
size: this._options.pageSize,
page: this._pagination ? this._pagination.getCurrent() + 1:1
};}
this._getDataViaAjax(this._getUrl(sortOrder, page));
},
_getSortOrder: function (){
var index;
for (index in this._sortableFields) if(this._sortableFields.hasOwnProperty(index)){
if(this._sortableFields[index]!=='none'){
break;
}}
if(!index){
return null;
}
return {
field: this._originalFields[index]||Element.textContent(this._headers[index]),
order: this._sortableFields[index]
};},
_getUrl: function (sort, page){
var urlCreator=this._options.createEndpointURL ||
function (endpoint, sort, page
){
endpoint=InkUrl.parseUrl(endpoint);
endpoint.query=endpoint.query||{};
if(sort){
endpoint.query.sortOrder=sort.order;
endpoint.query.sortField=sort.field;
}
if(page){
endpoint.query['rows_per_page']=page.size;
endpoint.query['page']=page.page;
}
return InkUrl.format(endpoint);
};
var ret=urlCreator(this._options.endpoint, sort, page);
if(typeof ret!=='string'){
throw new TypeError('Ink.UI.Table_1: ' +
'createEndpointUrl did not return a string!');
}
return ret;
},
_getDataViaAjax: function(endpointUri){
var success=Ink.bind(function(JSONData){
this._onAjaxSuccess(JSONData);
}, this);
if(!this._options.getDataFromEndpoint){
new Ajax(endpointUri, {
method: 'GET',
contentType: 'application/json',
sanitizeJSON: true,
onSuccess: Ink.bind(function(response){
if(response.status===200){
success(Json.parse(response.responseText));
}}, this)
});
}else{
this._options.getDataFromEndpoint(endpointUri, success);
}},
_onAjaxSuccess: function (jsonResponse){
var paginated=this._options.pageSize!=null;
var rows=this._options.processJSONRows(jsonResponse);
this._headers=Selector.select('th', this._thead);
if(this._headers.length===0){
var headers=this._options.processJSONHeaders(jsonResponse);
if(!headers||!headers.length||!headers[0]){
throw new Error('Ink.UI.Table: processJSONHeaders option must return an array of objects!');
}
this._createHeadersFromJson(headers);
this._resetSortOrder();
this._addHeadersClasses();
}else{
this._resetSortOrder();
}
this._createRowsFromJSON(rows);
this._totalRows=this._rowLength=rows.length;
if(paginated){
this._totalRows=this._options.processJSONTotalRows(jsonResponse);
this._setPagination();
}}
};
Common.createUIComponent(Table);
return Table;
});
Ink.createModule('Ink.UI.Tabs', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function(Common, Event, Css, Element, Selector){
'use strict';
function Tabs(){
Common.BaseUIComponent.apply(this, arguments);
}
Tabs._name='Tabs_1';
Tabs._optionDefinition={
preventUrlChange:   ['Boolean', false],
active:             ['String', undefined],
onBeforeChange:     ['Function', undefined],
onChange:           ['Function', undefined],
menuSelector:       ['String', '.tabs-nav'],
contentSelector:    ['String', '.tabs-content'],
triggerEventsOnLoad:['Boolean', true]
};
Tabs.prototype={
_init: function(){
this._menu=Selector.select(this._options.menuSelector, this._element)[0];
if(!this._menu){
Ink.warn('Ink.UI.Tabs: An element selected by "' + this._options.menuSelector + '" needs to exist inside the element!');
return;
}
this._initializeDom();
Event.on(this._menu, 'click', 'a', Ink.bindMethod(this, '_onTabClickedGeneric'));
this._setFirstActive();
},
_initializeDom: function(){
var contentTabs=Selector.select(this._options.contentSelector, this._element);
for(var i=0; i < contentTabs.length; i++){
Css.addClassName(contentTabs[i], 'hide-all');
}},
_setFirstActive: function(){
var hash=window.location.hash;
var activeMenuLink=this._findLinkByHref(hash) ||
(this._options.active&&this._findLinkByHref(this._options.active)) ||
Selector.select('.active a', this._menu)[0] ||
Selector.select('a', this._menu)[0];
if(activeMenuLink){
this._firstTime=true;
this._changeTab(activeMenuLink, this._options.triggerEventsOnLoad);
this._firstTime=false;
}},
_changeTab: function(link, runCallbacks){
if(runCallbacks&&typeof this._options.onBeforeChange!=='undefined'){
this._options.onBeforeChange(this);
}
var selector=link.getAttribute('href');
var href=selector.substr(selector.indexOf('#'));
if(window.location.hash!==href&&!this._options.preventUrlChange&&!this._firstTime){
window.location.hash=href;
}
var activeTabs=Selector.select('> li.active', this._menu);
for (var i=0, len=activeTabs.length; i < len; i++){
if(activeTabs[i]!==link){
Css.removeClassName(activeTabs[i], 'active');
}}
if(this._activeMenuTab){
Css.removeClassName(this._activeMenuTab, 'active');
Css.removeClassName(this._activeSection, 'active');
Css.addClassName(this._activeSection, 'hide-all');
}
this._activeMenuLink=link;
this._activeMenuTab=this._activeMenuLink.parentNode;
this._activeSection=Selector.select(href, this._element)[0];
if(!this._activeSection){
this._activeMenuLink=this._activeMenuTab=this._activeSection=null;
return;
}
Css.addClassName(this._activeMenuTab, 'active');
Css.addClassName(this._activeSection, 'active');
Css.removeClassName(this._activeSection, 'hide-all');
if(runCallbacks&&typeof(this._options.onChange)!=='undefined'){
this._options.onChange(this);
}},
_onTabClickedGeneric: function (event){
event.preventDefault();
var doChangeTab =
!Css.hasClassName(event.currentTarget, 'ink-disabled') &&
event.currentTarget!==this._activeMenuLink;
if(doChangeTab){
this._onTabClicked(event.currentTarget);
}},
_onTabClicked: function(tabElm){
var href=tabElm.getAttribute('href')||'';
href=href.substr(href.indexOf('#'));
if(!href||Ink.i(this._dehashify(href))===null){
return;
}
if(tabElm===this._activeMenuLink){
return;
}
this.changeTab(tabElm);
},
_hashify: function(hash){
if(!hash){
return '';
}
return hash.indexOf('#')===0? hash:'#' + hash;
},
_dehashify: function(hash){
if(!hash){ return ''; }
return ('' + hash).replace(/^#/, '');
},
_findLinkByHref: function(href){
if(!href){ return null; }
if(href.nodeType===1){
if(Element.isAncestorOf(href, this._element)){ return null; }
var links=Selector.select('a', this._menu);
var id=href.getAttribute('id');
for (var i=0, len=links.length; i < len; i++){
if(links[i]===href||Element.isAncestorOf(href, links[i])){
return links[i];
}else if(id&&id===this._dehashify(links[i].hash)){
return links[i];
}}
return null;
}
href=this._hashify(href);
return Selector.select('a[href$="' + href + '"]', this._menu)[0]||null;
},
changeTab: function(selector){
selector=this._findLinkByHref(selector);
if(!selector||Css.hasClassName(selector, 'ink-disabled')){
return;
}
this._changeTab(selector, true);
},
disable: function(selector){
Css.addClassName(this._findLinkByHref(selector), 'ink-disabled');
},
enable: function(selector){
Css.removeClassName(this._findLinkByHref(selector), 'ink-disabled');
},
activeTab: function(){
return this._activeSection.getAttribute('id');
},
activeMenuLink: function(){
return this._activeMenuLink;
},
activeSection: function(){
return this._activeSection;
},
destroy: Common.destroyComponent
};
Common.createUIComponent(Tabs);
return Tabs;
});
Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.UI.Droppable_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function(InkElement, InkEvent, Css, Browser, Droppable, InkArray, Selector, Common){
'use strict';
var enterKey=13;
var backspaceKey=8;
var isTruthy=function (val){return !!val;};
var buggySplit='s,'.split(/,/g).length===1;
var splitFunction=(function (){
var nativeSplit=String.prototype.split,
compliantExecNpcg=/()??/.exec("")[1]===undefined,
self;
self=function (str, separator, limit){
if(Object.prototype.toString.call(separator)!=="[object RegExp]"){
return nativeSplit.call(str, separator, limit);
}
var output=[],
flags=(separator.ignoreCase ? "i":"") +
(separator.multiline  ? "m":"") +
(separator.extended   ? "x":"") +
(separator.sticky     ? "y":""),
lastLastIndex=0,
separator=new RegExp(separator.source, flags + "g"),
separator2, match, lastIndex, lastLength;
str +="";
if(!compliantExecNpcg){
separator2=new RegExp("^" + separator.source + "$(?!\\s)", flags);
}
limit=limit===undefined ?
-1 >>> 0 :
limit >>> 0;
while (match=separator.exec(str)){
lastIndex=match.index + match[0].length;
if(lastIndex > lastLastIndex){
output.push(str.slice(lastLastIndex, match.index));
if(!compliantExecNpcg&&match.length > 1){
match[0].replace(separator2, function (){
for (var i=1; i < arguments.length - 2; i++){
if(arguments[i]===undefined){
match[i]=undefined;
}}
});
}
if(match.length > 1&&match.index < str.length){
Array.prototype.push.apply(output, match.slice(1));
}
lastLength=match[0].length;
lastLastIndex=lastIndex;
if(output.length >=limit){
break;
}}
if(separator.lastIndex===match.index){
separator.lastIndex++;
}}
if(lastLastIndex===str.length){
if(lastLength||!separator.test("")){
output.push("");
}}else{
output.push(str.slice(lastLastIndex));
}
return output.length > limit ? output.slice(0, limit):output;
};
/* We don't override prototypes in Ink
String.prototype.split=function (separator, limit){
return self(this, separator, limit);
};
*/
return self;
}());
function TagField(){
Common.BaseUIComponent.apply(this, arguments);
}
TagField._name='TagField_1';
TagField._optionDefinition={
tags: ['String', []],
allowRepeated: ['Boolean', false],
maxTags: ['Integer', -1],
outSeparator: ['String', ','],
separator: ['String', /[,; ]+/g],
autoSplit: ['Boolean', true]
};
TagField.prototype={
_init: function(){
var o=this._options;
if(typeof o.separator==='string'){
o.separator=new RegExp(o.separator, 'g');
}
if(typeof o.tags==='string'){
o.tags=this._readInput(o.tags);
}
Css.addClassName(this._element, 'hide-all');
this._viewElm=InkElement.create('div', {
className: 'ink-tagfield',
insertAfter: this._element
});
this._input=InkElement.create('input', {
type: 'text',
className: 'new-tag-input',
insertBottom: this._viewElm
});
var tags=[].concat(o.tags, this._tagsFromMarkup(this._element));
this._tags=[];
InkArray.each(tags, Ink.bindMethod(this, '_addTag'));
InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));
InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));
InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));
InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));
InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));
},
destroy: function (){
InkElement.remove(this._viewElm);
Css.removeClassName(this._element, 'hide-all');
},
_tagsFromMarkup: function (element){
var tagname=element.tagName.toLowerCase();
if(tagname==='input'){
return this._readInput(element.value);
}else if(tagname==='select'){
return InkArray.map(element.getElementsByTagName('option'), function (option){
return InkElement.textContent(option);
});
}else{
throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');
}},
_tagsToMarkup: function (tags, element){
var tagname=element.tagName.toLowerCase();
if(tagname==='input'){
if(this._options.separator){
element.value=tags.join(this._options.outSeparator);
}}else if(tagname==='select'){
element.innerHTML='';
InkArray.each(tags, function (tag){
var opt=InkElement.create('option', {selected: 'selected'});
InkElement.setTextContent(opt, tag);
element.appendChild(opt);
});
}else{
throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');
}},
_addTag: function (tag){
if(this._options.maxTags!==-1 &&
this._tags.length >=this._options.maxTags){
return;
}
if((!this._options.allowRepeated &&
InkArray.inArray(tag, this._tags, tag))||!tag){
return false;
}
var elm=InkElement.create('span', {
className: 'ink-tag',
setTextContent: tag + ' '
});
var remove=InkElement.create('span', {
className: 'remove fa fa-times',
insertBottom: elm
});
InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));
var spc=document.createTextNode(' ');
this._tags.push(tag);
this._viewElm.insertBefore(elm, this._input);
this._viewElm.insertBefore(spc, this._input);
this._tagsToMarkup(this._tags, this._element);
},
_readInput: function (text){
if(this._options.separator){
return InkArray.filter(text.split(this._options.separator), isTruthy);
}else{
return [text];
}},
_onKeyUp: function (){
if(!this._options.autoSplit){
return;
}
var split;
if(!buggySplit){
split=this._input.value.split(this._options.separator);
}else{
split=splitFunction(this._input.value, this._options.separator);
}
if(split.length <=1){
return;
}
var last=split[split.length - 1];
split=split.splice(0, split.length - 1);
split=InkArray.filter(split, isTruthy);
InkArray.each(split, Ink.bind(this._addTag, this));
this._input.value=last;
},
_onKeyDown: function (event){
if(event.which===enterKey){
return this._onEnterKeyDown(event);
}else if(event.which===backspaceKey){
return this._onBackspaceKeyDown();
}else if(this._removeConfirm){
this._unsetRemovingVisual(this._tags.length - 1);
}},
_onBackspaceKeyDown: function (){
if(this._input.value){ return; }
if(this._removeConfirm){
this._unsetRemovingVisual(this._tags.length - 1);
this._removeTag(this._tags.length - 1);
this._removeConfirm=null;
}else{
this._setRemovingVisual(this._tags.length - 1);
}},
_onEnterKeyDown: function (event){
var tag=this._input.value;
if(tag){
this._addTag(tag);
this._input.value='';
}
InkEvent.stopDefault(event);
},
_onBlur: function (){
this._addTag(this._input.value);
this._input.value='';
},
_setRemovingVisual: function (tagIndex){
var elm=this._viewElm.children[tagIndex];
if(!elm){ return; }
Css.addClassName(elm, 'tag-deleting');
this._removeRemovingVisualTimeout=setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);
InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));
this._removeConfirm=true;
},
_unsetRemovingVisual: function (tagIndex){
var elm=this._viewElm.children[tagIndex];
if(elm){
Css.removeClassName(elm, 'tag-deleting');
clearTimeout(this._removeRemovingVisualTimeout);
}
this._removeConfirm=null;
},
_removeTag: function (event){
var index;
if(typeof event==='object'){
var elm=InkEvent.element(event).parentNode;
index=InkElement.parentIndexOf(this._viewElm, elm);
}else if(typeof event==='number'){
index=event;
}
this._tags=InkArray.remove(this._tags, index, 1);
InkElement.remove(this._viewElm.children[index]);
this._tagsToMarkup(this._tags, this._element);
},
_refocus: function (event){
this._input.focus();
InkEvent.stop(event);
return false;
}};
Common.createUIComponent(TagField);
return TagField;
});
Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray){
'use strict';
function Toggle(){
Common.BaseUIComponent.apply(this, arguments);
}
Toggle._name='Toggle_1';
Toggle._optionDefinition={
target:         ['Elements'],
triggerEvent:   ['String', 'click'],
closeOnClick:   ['Boolean', null],
canToggleAnAncestor: ['Boolean', false],
isAccordion:    ['Boolean', false],
initialState:   ['Boolean', null],
classNameOn:    ['String', 'show-all'],
classNameOff:   ['String', 'hide-all'],
closeOnInsideClick: ['String', 'a[href]'],
onChangeState:  ['Function', null]
};
Toggle.prototype={
_init: function(){
var i, len;
this._targets=Common.elsOrSelector(this._options.target);
if(this._options.closeOnClick===null){
this._options.closeOnClick =
(this._options.isAccordion||this._options.canToggleAnAncestor) ? false:true;
}
if(this._options.initialState===null){
this._options.initialState=Css.hasClassName(this._targets[0], this._options.classNameOn);
}
if(this._options.classNameOn!=='show-all'||this._options.classNameOff!=='hide-all'){
for (i=0, len=this._targets.length; i < len; i++){
Css.removeClassName(this._targets[i], 'show-all');
Css.removeClassName(this._targets[i], 'hide-all');
}}
if(this._options.isAccordion){
this._accordionContainer=InkElement.findUpwardsByClass(this._element, 'accordion');
if(!this._accordionContainer){
Ink.warn('Ink.UI.Toggle_1: This toggle has the isAccordion option set to `true`, but is not a descendant of an element with the class "accordion"! Because of this, it won\'t be able to find other toggles in the same accordion and cooperate with them.');
}}
this._constructing=true;
this._bindEvents();
if(this._options.initialState!==null){
this.setState(this._options.initialState, true);
}else{
var state=Css.getStyle(this._targets[0], 'display')!=='none';
this.setState(state, true);
}
for (i=0, len=this._targets.length; i < len; i++){
if(this._targets[i].style.display){
this._targets[i].style.display='';
}}
this._element.setAttribute('data-is-toggle-trigger', 'true');
this._constructing=false;
},
_bindEvents: function (){
if(this._options.triggerEvent){
InkEvent.on(this._element,
this._options.triggerEvent,
Ink.bind(this._onTriggerEvent, this));
}
if(this._options.closeOnClick){
InkEvent.observe(document, 'click', Ink.bind(this._onOutsideClick, this));
}
if(this._options.closeOnInsideClick){
var sel=this._options.closeOnInsideClick;
if(sel.toString()==='true'){
sel='*';
}
InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e){
if(InkElement.findUpwardsBySelector(InkEvent.element(e), sel)){
this.setState(false, true);
}}, this));
}},
_onTriggerEvent: function(event){
var target=InkEvent.element(event);
var isAncestorOfClickedElement=InkArray.some(this._targets, function (thisOne){
return thisOne===target||InkElement.isAncestorOf(thisOne, target);
});
if(!this._options.canToggleAnAncestor&&isAncestorOfClickedElement){
return;
}
var has=this.getState();
this.setState(!has, true);
if(!has&&this._firstTime){
this._firstTime=false;
}
InkEvent.stopDefault(event);
},
_updateAccordion: function (){
if(!this._accordionContainer){ return; }
if(this.getState()===false){ return; }
var elms=Selector.select('[data-is-toggle-trigger]', this._accordionContainer);
for (var i=0; i < elms.length; i++){
var otherToggle=Toggle.getInstance(elms[i]);
if(otherToggle&&(otherToggle!==this)&&otherToggle.getState()===true){
otherToggle.setState(false, true);
}}
},
_onOutsideClick: function(event){
var tgtEl=InkEvent.element(event);
var shades;
if(!InkElement.isAncestorOf(document.documentElement, tgtEl)){
return;
}
var ancestorOfTargets=InkArray.some(this._targets, function (target){
return InkElement.isAncestorOf(target, tgtEl)||target===tgtEl;
});
if((this._element===tgtEl)||InkElement.isAncestorOf(this._element, tgtEl)||ancestorOfTargets){
return;
}else if((shades=Ink.ss('.wcv-shade')).length){
var shadesLength=shades.length;
for(var i=0; i < shadesLength; i++){
if(InkElement.isAncestorOf(shades[i],tgtEl)&&InkElement.isAncestorOf(shades[i],this._element)){
return;
}}
}
this.setState(false, true);
},
setState: function (on, callHandler){
if(on===this.getState()&&!this._constructing){ return; }
var i, len;
if(this._group&&on){
for (i=0, len=this._group.length; i < len; i++){
if(this._group[i].getState()===true){
this._group[i].setState(false, true);
}}
}
if(callHandler&&typeof this._options.onChangeState==='function'){
var ret=this._options.onChangeState.call(this, on, { element: this._element });
if(ret===false){ return false; }}
for (i=0, len=this._targets.length; i < len; i++){
Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);
Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);
}
Css.addRemoveClassName(this._element, 'active', on);
if(this._accordionContainer){
this._updateAccordion();
}},
getState: function (){
return Css.hasClassName(this._element, 'active');
}};
Common.createUIComponent(Toggle);
return Toggle;
});
Ink.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css){
'use strict';
function Tooltip(element, options){
this._init(element, options||{});
}
function EachTooltip(root, elm){
this._init(root, elm);
}
var transitionDurationName,
transitionPropertyName,
transitionTimingFunctionName;
(function (){
var test=document.createElement('DIV');
var names=['transition', 'oTransition', 'msTransition', 'mozTransition',
'webkitTransition'];
for (var i=0; i < names.length; i++){
if(typeof test.style[names[i] + 'Duration']!=='undefined'){
transitionDurationName=names[i] + 'Duration';
transitionPropertyName=names[i] + 'Property';
transitionTimingFunctionName=names[i] + 'TimingFunction';
break;
}}
}());
var bodies=document.getElementsByTagName('body');
var body=bodies.length ? bodies[0]:document.documentElement;
Tooltip.prototype={
_init: function(element, options){
var elements;
this.options=Ink.extendObj({
where: 'up',
zIndex: 10000,
left: 10,
top: 10,
spacing: 8,
forever: 0,
color: '',
timeout: 0,
delay: 0,
template: null,
templatefield: null,
fade: 0.3,
text: ''
}, options||{});
if(typeof element==='string'){
elements=Selector.select(element);
}else if(typeof element==='object'){
elements=[element];
}else{
throw 'Element expected';
}
this.tooltips=[];
for (var i=0, len=elements.length; i < len; i++){
this.tooltips[i]=new EachTooltip(this, elements[i]);
}},
destroy: function (){
InkArray.each(this.tooltips, function (tooltip){
tooltip._destroy();
});
this.tooltips=null;
this.options=null;
}};
EachTooltip.prototype={
_oppositeDirections: {
left: 'right',
right: 'left',
up: 'down',
down: 'up'
},
_init: function(root, elm){
InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));
InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));
InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));
InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));
InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));
this.root=root;
this.element=elm;
this._delayTimeout=null;
this.tooltip=null;
Common.registerInstance(this, this.element);
},
_makeTooltip: function (mousePosition){
if(!this._getOpt('text') &&
!this._getOpt('html') &&
!InkElement.hasAttribute(this.element, 'title')){
return false;
}
var tooltip=this._createTooltipElement();
if(this.tooltip){
this._removeTooltip();
}
this.tooltip=tooltip;
this._fadeInTooltipElement(tooltip);
this._placeTooltipElement(tooltip, mousePosition);
InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));
var timeout=this._getFloatOpt('timeout');
if(timeout){
setTimeout(Ink.bind(function (){
if(this.tooltip===tooltip){
this._removeTooltip();
}}, this), timeout * 1000);
}},
_createTooltipElement: function (){
var template=this._getOpt('template'),
templatefield=this._getOpt('templatefield'),
tooltip,
field;
if(template){
var temp=document.createElement('DIV');
temp.innerHTML=Common.elOrSelector(template, 'options.template').outerHTML;
tooltip=temp.firstChild;
if(templatefield){
field=Selector.select(templatefield, tooltip);
if(field){
field=field[0];
}else{
throw 'options.templatefield must be a valid selector within options.template';
}}else{
field=tooltip;
}}else{
tooltip=document.createElement('DIV');
Css.addClassName(tooltip, 'wcv-tooltip');
Css.addClassName(tooltip, this._getOpt('color'));
field=document.createElement('DIV');
Css.addClassName(field, 'content');
tooltip.appendChild(field);
}
if(this._getOpt('html')){
field.innerHTML=this._getOpt('html');
}else if(this._getOpt('text')){
InkElement.setTextContent(field, this._getOpt('text'));
}else{
InkElement.setTextContent(field, this.element.getAttribute('title'));
}
tooltip.style.display='block';
tooltip.style.position='absolute';
tooltip.style.zIndex=this._getIntOpt('zIndex');
return tooltip;
},
_fadeInTooltipElement: function (tooltip){
var fadeTime=this._getFloatOpt('fade');
if(transitionDurationName&&fadeTime){
tooltip.style.opacity='0';
tooltip.style[transitionDurationName]=fadeTime + 's';
tooltip.style[transitionPropertyName]='opacity';
tooltip.style[transitionTimingFunctionName]='ease-in-out';
setTimeout(function (){
tooltip.style.opacity='1';
}, 0);
}},
_placeTooltipElement: function (tooltip, mousePosition){
var where=this._getOpt('where');
if(mousePosition===null&&(where==='mousemove'||where==='mousefix')){
where='up';
}
if(where==='mousemove'||where==='mousefix'){
var mPos=mousePosition;
this._setPos(mPos[0], mPos[1]);
body.appendChild(tooltip);
}else if(where.match(/(up|down|left|right)/)){
body.appendChild(tooltip);
var targetElementPos=InkElement.offset(this.element);
var tleft=targetElementPos[0],
ttop=targetElementPos[1];
var centerh=(InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),
centerv=(InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);
var spacing=this._getIntOpt('spacing');
var tooltipDims=InkElement.elementDimensions(tooltip);
var elementDims=InkElement.elementDimensions(this.element);
var maxX=InkElement.scrollWidth() + InkElement.viewportWidth();
var maxY=InkElement.scrollHeight() + InkElement.viewportHeight();
where=this._getWhereValueInsideViewport(where, {
left: tleft - tooltipDims[0],
right: tleft + tooltipDims[0],
top: ttop + tooltipDims[1],
bottom: ttop + tooltipDims[1]
}, {
right: maxX,
bottom: maxY
});
if(where==='up'){
ttop -=tooltipDims[1];
ttop -=spacing;
tleft +=centerh;
}else if(where==='down'){
ttop +=elementDims[1];
ttop +=spacing;
tleft +=centerh;
}else if(where==='left'){
tleft -=tooltipDims[0];
tleft -=spacing;
ttop +=centerv;
}else if(where==='right'){
tleft +=elementDims[0];
tleft +=spacing;
ttop +=centerv;
}
var arrow=null;
if(where.match(/(up|down|left|right)/)){
arrow=document.createElement('SPAN');
Css.addClassName(arrow, 'arrow');
Css.addClassName(arrow, this._oppositeDirections[where]);
tooltip.appendChild(arrow);
}
var tooltipLeft=tleft;
var tooltipTop=ttop;
var toBottom=(tooltipTop + tooltipDims[1]) - maxY;
var toRight=(tooltipLeft + tooltipDims[0]) - maxX;
var toLeft=0 - tooltipLeft;
var toTop=0 - tooltipTop;
if(toBottom > 0){
if(arrow){ arrow.style.top=(tooltipDims[1] / 2) + toBottom + 'px'; }
tooltipTop -=toBottom;
}else if(toTop > 0){
if(arrow){ arrow.style.top=(tooltipDims[1] / 2) - toTop + 'px'; }
tooltipTop +=toTop;
}else if(toRight > 0){
if(arrow){ arrow.style.left=(tooltipDims[0] / 2) + toRight + 'px'; }
tooltipLeft -=toRight;
}else if(toLeft > 0){
if(arrow){ arrow.style.left=(tooltipDims[0] / 2) - toLeft + 'px'; }
tooltipLeft +=toLeft;
}
tooltip.style.left=tooltipLeft + 'px';
tooltip.style.top=tooltipTop + 'px';
}},
_getWhereValueInsideViewport: function (where, bbox, viewport){
if(where==='left'&&bbox.left < 0){
return 'right';
}else if(where==='right'&&bbox.right > viewport.right){
return 'left';
}else if(where==='up'&&bbox.top < 0){
return 'down';
}else if(where==='down'&&bbox.bottom > viewport.bottom){
return 'up';
}
return where;
},
_removeTooltip: function(){
var tooltip=this.tooltip;
if(!tooltip){return;}
var remove=Ink.bind(InkElement.remove, {}, tooltip);
if(this._getOpt('where')!=='mousemove'&&transitionDurationName){
tooltip.style.opacity=0;
setTimeout(remove, this._getFloatOpt('fade') * 1000);
}else{
remove();
}
this.tooltip=null;
},
_getOpt: function (option){
var dataAttrVal=InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];
if(dataAttrVal ){
return dataAttrVal;
}
var instanceOption=this.root.options[option];
if(typeof instanceOption!=='undefined'){
return instanceOption;
}},
_getIntOpt: function (option){
return parseInt(this._getOpt(option), 10);
},
_getFloatOpt: function (option){
return parseFloat(this._getOpt(option), 10);
},
_destroy: function (){
if(this.tooltip){
InkElement.remove(this.tooltip);
}
this.root=null;
this.element=null;
this.tooltip=null;
},
_onMouseOver: function(e){
var mousePosition;
if(e.type!=='mouseover'){
mousePosition=null;
}else{
mousePosition=this._getMousePosition(e);
}
var delay=this._getFloatOpt('delay');
if(delay){
this._delayTimeout=setTimeout(Ink.bind(function (){
if(!this.tooltip){
this._makeTooltip(mousePosition);
}
this._delayTimeout=null;
}, this), delay * 1000);
}else{
this._makeTooltip(mousePosition);
}},
_onMouseMove: function(e){
if(this._getOpt('where')==='mousemove'&&this.tooltip){
var mPos=this._getMousePosition(e);
this._setPos(mPos[0], mPos[1]);
}},
_onMouseOut: function (){
if(!this._getIntOpt('forever')){
this._removeTooltip();
}
if(this._delayTimeout){
clearTimeout(this._delayTimeout);
this._delayTimeout=null;
}},
_onTooltipMouseOver: function (){
if(this.tooltip){
this._removeTooltip();
}},
_setPos: function(left, top){
left +=this._getIntOpt('left');
top +=this._getIntOpt('top');
var pageDims=this._getPageXY();
if(this.tooltip){
var elmDims=[InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];
var scrollDim=this._getScroll();
if((elmDims[0] + left - scrollDim[0]) >=(pageDims[0] - 20)){
left=(left - elmDims[0] - this._getIntOpt('left') - 10);
}
if((elmDims[1] + top - scrollDim[1]) >=(pageDims[1] - 20)){
top=(top - elmDims[1] - this._getIntOpt('top') - 10);
}
this.tooltip.style.left=left + 'px';
this.tooltip.style.top=top + 'px';
}},
_getPageXY: function(){
var cWidth=0;
var cHeight=0;
if(typeof(window.innerWidth)==='number'){
cWidth=window.innerWidth;
cHeight=window.innerHeight;
}else if(document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight) ){
cWidth=document.documentElement.clientWidth;
cHeight=document.documentElement.clientHeight;
}else if(document.body&&(document.body.clientWidth||document.body.clientHeight) ){
cWidth=document.body.clientWidth;
cHeight=document.body.clientHeight;
}
return [parseInt(cWidth, 10), parseInt(cHeight, 10)];
},
_getScroll: function(){
var dd=document.documentElement, db=document.body;
if(dd&&(dd.scrollLeft||dd.scrollTop)){
return [dd.scrollLeft, dd.scrollTop];
}else if(db){
return [db.scrollLeft, db.scrollTop];
}else{
return [0, 0];
}},
_getMousePosition: function(e){
return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];
}};
return Tooltip;
});
Ink.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray){
'use strict';
/**
* Shows elements in a tree structure which can be expanded and contracted.
* A TreeView is built with "node"s and "children". "node"s are `li` tags, and "children" are `ul` tags.
* You can build your TreeView out of a regular UL and  LI element structure which you already use to display lists with several levels.
* If you want a node to be open when the TreeView is built, just add the data-open="true" attribute to it.
*
* @class Ink.UI.TreeView
* @constructor
* @version 1
* @param {String|Element}      selector                    Element or selector.
* @param {String}              [options]                   Options object, containing:
* @param {String}              [options.node]              Selector for the nodes. Defaults to 'li'.
* @param {String}              [options.children]          Selector for the children. Defaults to 'ul'.
* @param {String}              [options.parentClass]       CSS classes to be added to parent nodes. Defaults to 'parent'.
* @param {String}              [options.openClass]         CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.
* @param {String}              [options.closedClass]       CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.
* @param {String}              [options.hideClass]         CSS Class to toggle visibility of the children. Defaults to 'hide-all'.
* @param {String}              [options.iconTag]           The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.
* @param {Boolean}             [options.stopDefault]       Flag to stops the default behavior of the click handler. Defaults to true.
* @example
*      <ul class="ink-tree-view">
*        <li data-open="true"><a href="#">root</a>
*          <ul>
*            <li><a href="#">child 1</a></li>
*            <li><a href="#">child 2</a>
*              <ul>
*                <li><a href="#">grandchild 2a</a></li>
*                <li><a href="#">grandchild 2b</a>
*                  <ul>
*                    <li><a href="#">grandgrandchild 1bA</a></li>
*                    <li><a href="#">grandgrandchild 1bB</a></li>
*                  </ul>
*                </li>
*              </ul>
*            </li>
*            <li><a href="#">child 3</a></li>
*          </ul>
*        </li>
*      </ul>
*      <script>*          Ink.requireModules(['Ink.Dom.Selector_1','Ink.UI.TreeView_1'], function(Selector, TreeView){
*              var treeViewElement=Ink.s('.ink-tree-view');
*              var treeViewObj=new TreeView(treeViewElement);
*          });
*</script>
*
* @sample Ink_UI_TreeView_1.html
*/
function TreeView(){
Common.BaseUIComponent.apply(this, arguments);
}
TreeView._name='TreeView_1';
TreeView._optionDefinition={
'node':   ['String', 'li'],
'children':  ['String','ul'],
'parentClass': ['String','parent'],
'openNodeClass': ['String', 'open'],
'openClass': ['String','fa fa-minus-circle'],
'closedClass': ['String','fa fa-plus-circle'],
'hideClass': ['String','hide-all'],
'iconTag': ['String', 'i'],
'stopDefault':['Boolean', true]
};
TreeView.prototype={
_init: function(){
this._handlers={
click: Ink.bindEvent(this._onClick,this)
};
Event.on(this._element, 'click', this._options.node, this._handlers.click);
InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){
if(this.isParent(item)){
Css.addClassName(item, this._options.parentClass);
var isOpen=this.isOpen(item);
if(!this._getIcon(item)){
Element.create(this._options.iconTag, { insertTop: item });
}
this._setNodeOpen(item, isOpen);
}},this));
},
_getIcon: function (node){
return Ink.s('> ' + this._options.iconTag, node);
},
isOpen: function (node){
if(!this._getChild(node)){
throw new Error('not a node!');
}
return node.getAttribute('data-open')==='true' ||
Css.hasClassName(node, this._options.openNodeClass);
},
isParent: function (node){
return Css.hasClassName(node, this._options.parentClass) ||
this._getChild(node)!=null;
},
_setNodeOpen: function (node, beOpen){
var child=this._getChild(node);
if(child){
Css.setClassName(child, this._options.hideClass, !beOpen);
var icon=this._getIcon(node);
node.setAttribute('data-open', beOpen);
var toAdd=beOpen ? this._options.openClass:this._options.closedClass;
var toRemove=beOpen ? this._options.closedClass:this._options.openClass;
Css.removeClassName(icon, toRemove);
Css.addClassName(icon, toAdd);
Css.setClassName(node, this._options.openNodeClass, beOpen);
}else{
Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');
}},
open: function (node){
this._setNodeOpen(node, true);
},
close: function (node){
this._setNodeOpen(node, false);
},
toggle: function (node){
if(this.isOpen(node)){
this.close(node);
}else{
this.open(node);
}},
_getChild: function (node){
return Selector.select(this._options.children, node)[0]||null;
},
_onClick: function(ev){
if(!this.isParent(ev.currentTarget) ||
Selector.matchesSelector(ev.target, this._options.node) ||
Selector.matchesSelector(ev.target, this._options.children)){
return;
}
if(this._options.stopDefault){
ev.preventDefault();
}
this.toggle(ev.currentTarget);
}};
Common.createUIComponent(TreeView);
return TreeView;
});
Ink.createModule('Ink.UI.Upload', '1', [
'Ink.Dom.Event_1',
'Ink.Dom.Element_1',
'Ink.Dom.Browser_1',
'Ink.UI.Common_1'
], function(Event, Element, Browser, Common){
'use strict';
var DirectoryReader=function(options){
this.init(options);
};
DirectoryReader.prototype={
init: function(options){
this._options=Ink.extendObj({
entry:      undefined,
maxDepth:   10
}, options||{});
try {
this._read();
} catch(e){
Ink.error(e);
}},
_read: function(){
if(!this._options.entry){
Ink.error('You must specify the entry!');
return;
}
try {
this._readDirectories();
} catch(e){
Ink.error(e);
}},
_readDirectories: function(){
var entries=[],
running=false,
maxDepth=0;
var _readEntries=Ink.bind(function(currentEntry){
var dir=currentEntry.createReader();
running=true;
dir.readEntries(Ink.bind(function(res){
if(res.length > 0){
for(var i=0, len=res.length; i<len; i++){
entries.push(res[i]);
if(!res[i].isDirectory){
continue;
}
maxDepth=this.clearArray(res[i].fullPath.split('/'));
maxDepth.shift();
maxDepth=maxDepth.length;
if(maxDepth <=this._options.maxDepth){
_readEntries(res[i]);
}}
if(this._stopActivityTimeout){
clearTimeout(this._stopActivityTimeout);
}
this._stopActivityTimeout=setTimeout(function(){
running=false;
}, 250);
}
if(!res.length){
running=false;
}}, this), Ink.bind(function(err){
this._options.readError(err, currentEntry);
}, this));
}, this);
_readEntries(this._options.entry);
var activity;
var checkActivity=function(){
if(running){
return false;
}
clearInterval(activity);
if(this._options.readComplete&&typeof this._options.readComplete==='function'){
this._options.readComplete(entries);
}
return true;
};
activity=setInterval(Ink.bind(checkActivity, this), 250);
},
clearArray: function(arr){
for(var i=arr.length - 1; i>=0; i--){
if(typeof(arr[i])==='undefined'||arr[i]===null||arr[i]===''){
arr.splice(i, 1);
}}
return arr;
}};
var Queue={
lists:  [],
items:  [],
create: function(name){
var id;
name=String(name);
this.lists.push({name: name});
id=this.lists.length - 1;
return id;
},
getItems: function(parentId){
if(!parentId){
return this.items;
}
var items=[];
for(var i=0, len=this.items.length; i<len; i++){
if(this.items[i].parentId===parentId){
items.push(this.items[i]);
}}
return items;
},
purge: function(id, keepList){
if(typeof(id)!=='number'||isNaN(Number(id))){
return false;
}
try {
for(var i=this.items.length; i>=0; i--){
if(this.items[i]&&id===this.items[i].parentId){
this.remove(this.items[i].parentId, this.items[i].pid);
}}
if(!keepList){
this.lists.splice(id, 1);
}
return true;
} catch(e){
Ink.error('Purge: invalid id');
return false;
}},
add: function(parentId, item, priority){
if(!this.lists[parentId]){
return false;
}
if(typeof(item)!=='object'){
item=String(item);
}
var pid=parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10);
priority=priority||0;
this.items.push({parentId: parentId, item: item, priority: priority||0, pid: pid});
return pid;
},
view: function(parentId, pid){
var id=this._searchByPid(parentId, pid);
if(id===false){
return false;
}
return this.items[id];
},
remove: function(parentId, pid){
try {
var id=this._searchByPid(parentId, pid);
if(id===false){
return false;
}
this.items.splice(id, 1);
return true;
} catch(e){
Ink.error('Remove: invalid id');
return false;
}},
_searchByPid: function(parentId, pid){
if(!parentId&&typeof(parentId)==='boolean'||!pid){
return false;
}
parentId=parseInt(parentId, 10);
pid=parseInt(pid, 10);
if(isNaN(parentId)||isNaN(pid)){
return false;
}
for(var i=0, len=this.items.length; i<len; i++){
if(this.items[i].parentId===parentId&&this.items[i].pid===pid){
return i;
}}
return false;
}};
var UI=function(Upload){
this.Upload=Upload;
this.init();
};
UI.prototype={
init: function(){
this._fileButton=this.Upload._options.fileButton;
this._dropzone=this.Upload._options.dropzone;
this._setDropEvent();
this._setFileButton();
},
_setDropEvent: function(){
var dropzones=this._dropzone;
if(!dropzones){ return; }
for(var i=0, len=dropzones.length; i<len; i++){
dropzones[i].ondrop=Ink.bindEvent(this.Upload._dropEventHandler, this.Upload);
dropzones[i].ondragleave=Ink.bindEvent(this._onDragLeave, this);
dropzones[i].ondragend=Ink.bindEvent(this._onDragEndEventHandler, this);
dropzones[i].ondragdrop=Ink.bindEvent(this._onDragEndEventHandler, this);
dropzones[i].ondragenter=Ink.bindEvent(this._onDragEnterHandler, this);
dropzones[i].ondragover=Ink.bindEvent(this._onDragOverHandler, this);
}},
_onDragEnterHandler: function(ev){
if(ev&&ev.stopPropagation){
ev.stopPropagation();
}
if(ev&&ev.preventDefault){
ev.preventDefault();
}
if(ev){
ev.returnValue=false;
}
this.Upload.publish('DragEnter', ev);
return false;
},
_onDragOverHandler: function(ev){
if(!ev){
return false;
}
ev.preventDefault();
ev.stopPropagation();
ev.returnValue=false;
return true;
},
_onDragLeave: function(ev){
return this.Upload.publish('DragLeave', ev);
},
_onDragEndEventHandler: function(ev){
return this.Upload.publish('DragEnd', ev);
},
_setFileButton: function(){
var btns=this._fileButton;
if(!btns){ return; }
Event.observeMulti(btns, 'change', Ink.bindEvent(this._fileChangeHandler, this));
},
_fileChangeHandler: function(ev){
var btn=Event.element(ev);
var files=btn.files;
var form=Element.findUpwardsByTag(btn, 'form');
if(!files||!window.FormData||!('withCredentials' in new XMLHttpRequest())){
form.parentNode.submit();
return false;
}
this.Upload._addFilesToQueue(files);
btn.value="";
}};
var Upload=function(options){
this.Queue=Queue;
this.init(options);
this._events={};};
Upload.prototype={
init: function(options){
if(typeof options==='string'){
options=Element.data(Common.elOrSelector(options, '1st argument'));
}
this._options=Ink.extendObj({
dropzone:           undefined,
fileButton:         undefined,
fileFormName:       'Ink_Filelist',
endpoint:           '',
maxFilesize:        300 << 20,
INVALID_FILE_NAME:  undefined,
extraData:          {},
useChunks:          false,
chunkSize:          4194304,
minSizeToUseChunks: 20971520,
endpointChunk:      '',
endpointChunkCommit:'',
foldersEnabled:     false,
directoryMaxDepth:  10
}, options||{});
this._queueId=Queue.create('Ink_UPLOAD');
this._queueRunning=false;
this._folders={};
if(this._options.dropzone){
this._options.dropzone =
Common.elsOrSelector(this._options.dropzone, 'Ink.UI.Upload - dropzone');
}
if(this._options.fileButton){
this._options.fileButton =
Common.elsOrSelector(this._options.fileButton, 'Ink.UI.Upload - fileButton');
}
if(!this._options.dropzone&&!this._options.fileButton){
throw new TypeError(
'Ink.UI.Upload: Specify a fileButton or a Dropzone!');
}
new UI(this);
},
_supportChunks: function(size){
return this._options.useChunks &&
'Blob' in window &&
(new Blob()).slice &&
size > this._options.minSizeToUseChunks;
},
_dropEventHandler: function(ev){
Event.stopDefault(ev);
this.publish('DropComplete', ev.dataTransfer);
var data=ev.dataTransfer;
if(!data||!data.files||!data.files.length){
return false;
}
this._files=data.files;
this._files=Array.prototype.slice.call(this._files||[], 0);
if(data.items&&data.items[0]&&data.items[0].webkitGetAsEntry){
if(!this._options.foldersEnabled){
return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);
}
var entry, folders=[];
for(var i=ev.dataTransfer.items.length-1; i>=0; i--){
entry=ev.dataTransfer.items[i].webkitGetAsEntry();
if(entry&&entry.isDirectory){
folders.push(entry);
this._files[i].isDirectory=true;
this._files.splice(i, 1);
}}
this._addFolderToQueue(folders, Ink.bind(function(){
setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);
}, this));
}else{
setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);
}
return true;
},
_addFolderToQueue: function(folders, cb){
var files=[], invalidFolders={};
if(!folders||!folders.length){
cb();
return files;
}
var getFiles=function(entries){
var files=[];
for(var i=0, len=entries.length; i<len; i++){
if(entries[i].isFile){
files.push(entries[i]);
}}
return files;
};
var convertToFile=function(cb, index){
var fullPath;
index=index||0;
if(!this._files[index]){
cb();
return files;
}
if(this._files[index].constructor.name.toLowerCase()!=='fileentry'){
return convertToFile.apply(this, [cb, ++index]);
}
this._files[index].file(Ink.bind(function(res){
fullPath=this._files[index].fullPath;
this._files[index]=res;
this._files[index].hasParent=true;
if(!this._files[index].fullPath){
this._files[index].fullPath=fullPath;
}
convertToFile.apply(this, [cb, ++index]);
}, this), Ink.bind(function(){
this._files.splice(index, 1);
convertToFile.apply(this, [cb, index]);
}, this));
};
var getSubDirs=Ink.bind(function(index){
if(!folders[index]){
this._files=this._files.concat(files);
convertToFile.call(this, cb);
return false;
}
new DirectoryReader({
entry:      folders[index],
maxDepth:   this._options.directoryMaxDepth,
readComplete: Ink.bind(function(entries){
files=files.concat(getFiles(entries));
if(!folders[index]||folders[index].fullPath in this._folders){
return;
}
this._folders[folders[index].fullPath]={
items:      entries,
files:      files,
length:     entries.length,
created:    false,
root:       true
};
for(var i=0, len=entries.length; i<len; i++){
if(entries[i].isFile){
continue;
}
if(entries[i].fullPath in invalidFolders){
delete invalidFolders[entries[i].fullPath];
continue;
}
this._folders[entries[i].fullPath]={
created:    false,
root:       false
};}
getSubDirs(++index);
}, this),
readError: Ink.bind(function(err, dir){
invalidFolders[dir.fullPath]={};
invalidFolders[dir.fullPath].error=err;
}, this)
});
}, this);
getSubDirs(0);
return files;
},
_addFilesToQueue: function(files){
var file, fileID, o;
for(var i=0, len=files.length; i<len; i++){
file=files[i];
if(!file.isDirectory){
if(file===null||(!file.type&&file.size % 4096===0&&(!Browser.CHROME||!this._options.foldersEnabled))){
this.publish('InvalidFile', file, 'size');
continue;
}}
if(file.size > this._options.maxFilesize){
this.publish('MaxSizeFailure', file, this._options.maxFilesize);
continue;
}
fileID=parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10);
o={ id: i, data: file, fileID: fileID, directory: file.isDirectory };
Queue.add(this._queueId, o);
this.publish('FileAddedToQueue', o);
}
this._processQueue(true);
this._files=[];
},
_processQueue: function(internalUpload){
if(this._queueRunning){
return false;
}
this.running=0;
var max=1, i=0, items,
queueLen=Queue.items.length;
this._queueRunning=true;
this.interval=setInterval(Ink.bind(function(){
if(Queue.items.length===i&&this.running===0){
Queue.purge(this._queueId, true);
this._queueRunning=false;
clearInterval(this.interval);
this.publish('QueueEnd', this._queueId, queueLen);
}
items=Queue.getItems(this._queueId);
if(this.running < max&&items[i]){
if(!items[i].canceled){
_doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);
this.running++;
i++;
}else{
var j=i;
while(items[j]&&items[j].canceled){
i++;
j++;
}}
return true;
}
return false;
}, this), 100);
var _doRequest=function(pid, data, fileID, directory, internalUpload){
var o={
file:   data,
fileID: fileID,
cb: Ink.bind(function(){
this.running--;
}, this)
};
if(internalUpload){
if(directory){
o.cb();
}else{
this._upload(o);
}}
};
return true;
},
_upload: function(o){
var file=o.file,
xhr=new XMLHttpRequest(),
fileID=o.fileID;
this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));
var forceAbort=function(showError){
if(o.cb&&typeof(o.cb==='function')){
o.cb();
}
this.publish('OnProgress', {
length: file.size,
lengthComputable: true,
loaded: file.size,
total: file.size
}, file, fileID);
this.publish('EndUpload', file, fileID, (showError ? { error: true }:true));
this.publish('InvalidFile', file, 'name');
xhr.abort();
};
if(this._options.INVALID_FILE_NAME&&this._options.INVALID_FILE_NAME instanceof RegExp){
if(this._options.INVALID_FILE_NAME.test(o.file.name)){
forceAbort.call(this);
return;
}}
if(!file.lastModifiedDate&&!Ink.Dom.Browser.OPERA){
forceAbort.call(this, true);
return;
}
xhr.upload.onprogress=Ink.bind(this.publish, this, 'OnProgress', file, fileID);
var endpoint, method;
if(this._supportChunks(file.size)){
if(file.size <=file.chunk_offset){
endpoint=this._options.endpointChunkCommit;
method='POST';
}else{
endpoint=this._options.endpointChunk;
if(file.chunk_upload_id){
endpoint +='?upload_id=' + file.chunk_upload_id;
}
if(file.chunk_offset){
endpoint +='&offset=' + file.chunk_offset;
}
method='PUT';
}}else{
endpoint=this._options.endpoint;
method='POST';
}
xhr.open(method, endpoint, true);
xhr.withCredentials=true;
xhr.setRequestHeader("x-requested-with", "XMLHttpRequest");
if(this._supportChunks(file.size)){
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
var fd=new FormData(),
blob;
if("Blob" in window&&typeof Blob==='function'){
blob=new Blob([file], { type: file.type });
if(this._supportChunks(file.size)){
file.chunk_offset=file.chunk_offset||0;
blob=blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);
}else{
fd.append(this._options.fileFormName, blob, file.name);
}}else{
fd.append(this._options.fileFormName, file);
}
if(!this._supportChunks(file.size)){
for(var k in this._options.extraData){
if(this._options.extraData.hasOwnProperty(k)){
fd.append(k, this._options.extraData[k]);
}}
}else{
fd.append('upload_id', file.chunk_upload_id);
fd.append('path', file.upload_path);
}
if(!file.hasParent){
if(!this._supportChunks(file.size)){
xhr.send(fd);
}else{
if(file.size <=file.chunk_offset){
xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);
}else{
xhr.send(blob);
}}
}else{
this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function(){
if(!this._supportChunks(file.size)){
xhr.send(fd);
}else{
if(file.size <=file.chunk_offset){
xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);
}else{
xhr.send(blob);
}}
}, this));
}
xhr.onload=Ink.bindEvent(function(){
if(this._supportChunks(file.size)&&file.size > file.chunk_offset){
if(xhr.response){
var response=JSON.parse(xhr.response);
var invalidOffset=file.chunk_offset&&response.offset!==(file.chunk_offset + this._options.chunkSize)&&file.size!==response.offset;
if(invalidOffset){
if(o.cb){
o.cb();
}
this.publish('ErrorUpload', file, fileID);
}else{
file.chunk_upload_id=response.upload_id;
file.chunk_offset=response.offset;
file.chunk_expires=response.expires;
this._upload(o);
}}else{
if(o.cb){
o.cb();
}
this.publish('ErrorUpload', file, fileID);
}
return (xhr=null);
}
if(o.cb){
o.cb();
}
if(xhr.responseText&&xhr['status'] < 400){
this.publish('EndUpload', file, fileID, xhr.responseText);
}else{
this.publish('ErrorUpload', file, fileID);
}
return (xhr=null);
}, this);
xhr.onerror=Ink.bindEvent(function(){
if(o.cb){
o.cb();
}
this.publish('ErrorUpload', file, fileID);
}, this);
xhr.onabort=Ink.bindEvent(function(){
if(o.cb){
o.cb();
}
this.publish('AbortUpload', file, fileID, {
abortAll: Ink.bind(this.abortAll, this),
abortOne: Ink.bind(this.abortOne, this)
});
}, this);
},
abortAll: function(){
if(!this._queueRunning){
return false;
}
clearInterval(this.interval);
this._queueRunning=false;
Queue.purge(this._queueId, true);
return true;
},
abortOne: function(id, cb){
var items=Queue.getItems(0),
o;
for(var i=0, len=items.length; i<len; i++){
if(items[i].item.fileID===id){
o={
id:         items[i].item.fileID,
name:       items[i].item.data.name,
size:       items[i].item.data.size,
hasParent:  items[i].item.data.hasParent
};
Queue.remove(0, items[i].pid);
if(cb){
cb(o);
}
return true;
}}
return false;
},
subscribe: function(eventName, fn){
if(!this._events[eventName]){
this._events[eventName]=[];
}
this._events[eventName].push(fn);
return this._events[eventName];
},
publish: function(eventName){
var events=this._events[eventName],
args=Array.prototype.slice.call(arguments||[], 0);
if(!events){
return;
}
for(var i=0, len=events.length; i<len; i++){
try {
events[i].apply(this, args.splice(1, args.length));
} catch(err){
Ink.error(eventName + ": " + err);
}}
}};
return Upload;
});