catjs
Version:
(Mobile) Web Automation Framework
316 lines (256 loc) • 10.9 kB
JavaScript
/**
* JQuery / JQlite (Angular) helper
*
* Common layer to make a smooth bridge between the functionality
*
* @type {_cat.utils.plugins.jqhelper}
*/
_cat.utils.plugins.jqhelper = function() {
var _$jqlite = false,
_module = {
isjquery: function() {
if (typeof $ !== "undefined") {
return true;
}
return false;
},
isangular: function() {
if (typeof angular !== "undefined") {
return true;
}
return false;
},
isjqlite: function() {
return _$jqlite;
},
isdom: function() {
return (_cat.utils.plugins.jqhelper.isjquery() || _cat.utils.plugins.jqhelper.isangular());
},
dom: function(elt) {
if (!elt) {
return elt;
}
if ( !(("nodeType" in elt) && elt.nodeType) ) {
elt = (elt.length ? elt[0] : undefined);
}
return elt;
},
/**
* Get the jquery or jqlite handle
*
* @param autodetect {String} if "*" auto detect the returned handle or else specify [jqlite | jquery]
* @returns {*}
*/
$: function(autodetect) {
var _methods = {},
_map = {};
autodetect = (autodetect || "*");
_methods._empty = function() {
return function(element){
var elt;
if (element) {
if (typeof element === "object") {
return element;
} else if (typeof element === "string") {
elt = document.getElementById(element);
if (!elt) {
elt = document.querySelector(element);
}
}
}
return elt;
};
};
_methods._jqlite = function() {
if (_module.isangular()) {
return angular.element;
}
return undefined;
};
_methods._jquery = function() {
if (_module.isjquery()) {
return $;
}
return undefined;
};
_map["angular"] = function() {
var jqlit = _methods._jqlite();
if (jqlit) {
_$jqlite = true;
}
return (jqlit || _methods._empty());
};
_map["jquery"] = function() {
return (_methods._jquery() || _methods._empty());
};
_map["*"] = function() {
var jqlit = _methods._jqlite();
if (jqlit) {
_$jqlite = true;
}
var _$ = (_methods._jquery() || jqlit);
return (_$ || _methods._empty());
};
if (!(autodetect in _map)) {
_cat.core.log.warn("[catjs jqhelper plugin] no valid functionality for :", autodetect);
}
return _map[autodetect].call(this);
},
/**
* Get a generic element depends on the autodetect argument
*
* @param val {*} an element reference or a string DOM query
* @param autodetect {String} if "*" auto detect the returned handle or else specify [jqlite | jquery]
* @returns {*}
*/
getElt: function (val, autodetect) {
var el$, sign,
_$ = _module.$(autodetect);
if ( typeof val === "string") {
val = val.trim();
sign = val.charAt(0);
if (_$) {
try {
el$ = _$(val);
} catch(e) {
_cat.core.log.warn("[catjs jqhelper plugin] jqlite does not support query selector, using DOM API instead:: full error details: ", e);
el$ = document.querySelector(val);
}
}
return el$;
} else if (typeof val === "object") {
if (_$) {
try {
el$ = _$(val);
} catch(e) {
_cat.core.log.warn("[catjs jqhelper plugin] jqlite does not support query selector, using DOM API instead:: full error details: ", e);
el$ = val;
}
}
return el$;
}
},
/**
* Trigger an event with a given object
*
* @param element {Object} The element to trigger from (The element JQuery representation id/class or the object itself)
* @param eventType {String} The event type name
* @param autodetect {String} if "*" auto detect the returned handle or else specify [jqlite | jquery]
*
* @private
*/
trigger: function () {
// args[0] element | args[1] eventType | args[2] autodetect
var e, newEvent, newEventOpt, idx = 0, size,
args = arguments,
autodetect = args[2],
elt = (args ? _module.getElt( args[0], autodetect) : undefined),
eventType = (args ? args[1] : undefined),
typeOfEventArgument = _cat.utils.Utils.getType(eventType),
typeOfEventArrayItem,
_$ = _module.$(autodetect),
isAngular = ( autodetect && autodetect === "angular" ),
triggerFn = (isAngular ? "triggerHandler" : "trigger");
function getOpt(opt) {
var key, newOpt = {};
if (opt) {
for (key in opt) {
if (opt.hasOwnProperty(key)) {
newOpt[key] = opt[key];
}
}
if ("keyCode" in newOpt) {
newOpt.which = newOpt.keyCode;
} else if ("which" in newOpt) {
newOpt.keyCode = newOpt.which;
}
}
return newOpt;
}
function createNewEvent(eventType) {
var newEventOpt = getOpt(eventType.opt),
newEvent = _$.Event(eventType.type, newEventOpt);
return newEvent;
}
function eventFn(elt, triggerFn, event, eventType) {
var opt;
if (!isAngular) {
elt[triggerFn](event);
} else {
if (eventType) {
if ("opt" in eventType) {
opt = getOpt(eventType.opt);
}
elt[triggerFn](eventType.type, opt);
} else {
elt[triggerFn](event);
}
}
}
if (elt && eventType) {
if (typeOfEventArgument === "string") {
eventFn(elt, triggerFn, eventType);
} else if (typeOfEventArgument === "object") {
newEvent = createNewEvent(eventType);
eventFn(elt, triggerFn, newEvent, eventType);
} else if (typeOfEventArgument === "array" && eventType.length > 0) {
size = typeOfEventArgument.length;
for (idx = 0; idx < size; idx++) {
e = eventType[idx];
if (e) {
typeOfEventArrayItem = _cat.utils.Utils.getType(eventType);
if (typeOfEventArrayItem === "string") {
eventFn(elt, triggerFn, e);
} else {
newEvent = createNewEvent(eventType);
eventFn(elt, triggerFn, newEvent, eventType);
}
}
}
}
}
},
setText: function (idName, value, usevents, callback, autodetect) {
var _$ = _module.$(autodetect);
if (usevents === undefined) {
usevents = true;
}
_$(document).ready(function () {
var elt = _module.getElt(idName, autodetect);
if (usevents) {
_module.trigger(elt, "mouseenter", autodetect);
_module.trigger(elt, "mouseover", autodetect);
_module.trigger(elt, "mousemove", autodetect);
_module.trigger(elt, "focus", autodetect);
_module.trigger(elt, "mousedown", autodetect);
_module.trigger(elt, "mouseup", autodetect);
_module.trigger(elt, "click", autodetect);
}
elt.val(value);
if (usevents) {
_module.trigger(elt, "keydown", autodetect);
_module.trigger(elt, "keypress", autodetect);
_module.trigger(elt, "keyup", autodetect);
_module.trigger(elt, "mousemove", autodetect);
_module.trigger(elt, "mouseleave", autodetect);
_module.trigger(elt, "mouseout", autodetect);
_module.trigger(elt, "blur", autodetect);
}
_module.trigger(elt, "input", autodetect);
if (callback) {
return callback.call(this, elt);
}
});
},
getValue: function(idName, callback, autodetect) {
_module.$(autodetect)(document).ready(function () {
var elt = _module.getElt(idName, autodetect);
elt.val();
if (callback) {
return callback.call(this, elt);
}
});
}
};
return _module;
}();