-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjsHelper.js
More file actions
259 lines (227 loc) · 9.15 KB
/
Copy pathjsHelper.js
File metadata and controls
259 lines (227 loc) · 9.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
var jsHelper = (function () {
"use strict";
/*Public methods*/
// DOM methods
/**
* Gets the text of a node without the text of it's child nodes
* @param {HTMLObject} elm The element for which text has to be extracted. This element can be native javascript element or jQuery element object
* @return {String} Text string of the node
*/
var getNodeText = function(elm) {
if(!elm) {
return;
} else if(elm instanceof Array) {
elm = elm[0];
}
var firstText = "";
for (var i = 0; i < elm.childNodes.length; i++) {
var curNode = elm.childNodes[i];
var whitespace = /^\s*$/;
if (curNode.nodeName === "#text" && !(whitespace.test(curNode.nodeValue))) {
firstText = curNode.nodeValue;
break;
}
}
return firstText;
};
/**
* This returns whether the browser supports the given CSS property or not. It creates virtual element to test and thus doesn't affect the DOM.
* @param {String} property CSS property to check
* @return {Boolean} Returns `true` if property is supported, `false` otherwise
*/
var isCssPropertySupported = function(property) {
var elm = document.createElement("div");
var CSSProp = ("O Moz ms Webkit Khtml").split(" ");
var capitalizedProperty = property.charAt(0).toUpperCase() + property.slice(1);
var allProperties = (property + " " + CSSProp.join(capitalizedProperty + " ")).split(" ");
var propertyLength = allProperties.length;
for(var inc = 0; inc < propertyLength; inc++) {
if(typeof elm.style[allProperties[inc]] !== "undefined") {
return true;
}
}
return false;
};
/**
* This function checks whether the element supports the provided attribute. E.g. you can check if `plceholder` is supported by `input` or not.
* @param {HTMLObject/String} element Javascript or jQuery element or element name.
* @param {string} attribute Name of the attribute to test
* @return {Boolean} Returns `true` if property is supported, `false` otherwise
*/
var isAttributeSupported = function(element, attribute) {
if(!element) {
return false;
} else if(element instanceof Array) {
element = element[0];
}
var test = document.createElement(element);
if (attribute in test) {
return true;
}else {
return false;
}
};
/**
* This function creates placeholder for browsers that doesn't support placeholder. It won't affect the browsers which already supports `placeholder` property.
* @param {Object} options Options object where `textColor` and `placeholderColor` can be provided.
* @param {String} options.textColor Color of text which appears when user type in element
* @param {String} options.placeholderColor Color of placeholder
*/
var createPlaceholder = function(options) {
var opts = options || {};
var textColor = opts || "#000";
var placeholderColor = opts.placeholderColor || "grey";
if(!this.isAttributeSupported("input", "placeholder")) {
var inputs = document.getElementsByTagName("input");
var textareas = document.getElementsByTagName("textarea");
var elements = concat(inputs, textareas);
var elementsLength = elements.length;
for(var inc = 0; inc < elementsLength; inc++) {
var inputElement = elements[inc];
var value = inputElement.value;
var placeholder = inputElement.getAttribute("placeholder");
if(!(placeholder === "" || placeholder === null) && (value === "" || value === placeholder)) {
inputElement.value = placeholder;
inputElement.style.color = placeholderColor;
}
keyDownEvent(inputElement);
onBlurEvent(inputElement);
}
}
function keyDownEvent(elm) {
elm.onkeydown = function() {
var val = this.value;
var defaultVal = this.getAttribute("placeholder");
if(!(defaultVal === "" || defaultVal === null) && (val === "" || val === defaultVal)) {
this.value = "";
this.style.color = textColor;
}
};
}
function onBlurEvent(elm) {
elm.onblur = function() {
var val = this.value;
var defaultVal = this.getAttribute("placeholder");
if(!(defaultVal === "" || defaultVal === null) && (val === "" || val === defaultVal)) {
this.value = defaultVal;
this.style.color = placeholderColor;
}
};
}
};
// Non-DOM methods
/**
* This function recursively merge two or more objects. The first object will be updated with merged results. If user wants new object, then he has to provide first object as empty object.
* @param {Objects} objects Comma separated list of objects that needs to be merged. First object will be updated with merged result.
* @return {Object} Merged object
*/
var mergeObjects = function() {
var length = arguments.length;
if(length < 2) {
return {
error: "Provide at least two objects."
};
}
for(var i = 0; i < length; i++) {
if(!(arguments[i] instanceof Object)) {
return {
error: "All arguments must be a Javascript Object."
};
}
}
var returnObject = arguments[0];
for(var index = 1; index < length; index++) {
mergeToRoot(returnObject, arguments[index]);
}
return returnObject;
};
/**
* This function checks if two objects are same, i.e. if they contain same parameters with same values
* @param {Object} objects Two objects to compare
* @return {Boolean} Returns true or false based on equality of objects
*/
var isEqual = function() {
var objects = arguments.length;
if(objects < 2) {
return false;
} else if(!(objects[0] && typeof objects[0] === "object") || !(objects[1] && typeof objects[1] === "object")) {
return false;
}
var firstProp = Object.getOwnPropertyNames(objects[0]);
var secondProp = Object.getOwnPropertyNames(objects[1]);
if (firstProp.length != secondProp.length) {
return false;
}
for (var i = 0; i < firstProp.length; i++) {
var propName = firstProp[i];
if (objects[0][propName] !== objects[1][propName]) {
return false;
}
}
return true;
};
/**
* This function merges two or more arrays and returns back the resulting array.
* @param {Array} arrays Comma separated arrays to be concatenated. All arguments must be an array or empty array will be returned
* @return {Array} Concatenated array
*/
var concat = function() {
var returnArray = [];
var nodesLength = arguments.length;
if(nodeLength < 2) {
return [];
}
for(var inc = 0; inc < nodesLength; inc++) {
if(!(arguments[inc] instanceof Array)) {
return [];
}
var nodeLength = arguments[inc].length;
for(var i = 0; i < nodeLength; i++) {
if(arguments[inc][i]) {
returnArray.push(arguments[inc][i]);
}
}
}
return returnArray;
};
/**
* This method returns array with unique values from the given array
* @param {Array} array Array with duplicate values
* @return {Array} Unique array
*/
var uniqueArray = function(array) {
return array.reduce(function(unique, current) {
if (unique.indexOf(current) < 0) {
unique.push(current);
}
return unique;
}, []);
};
/*End Public methods*/
/*Private methods*/
function mergeToRoot(rootObject, objectToMerge) {
for (var attribute in objectToMerge) {
try {
if(objectToMerge[attribute] instanceof Object) {
rootObject[attribute] = mergeToRoot(rootObject[attribute], objectToMerge[attribute]);
} else {
rootObject[attribute] = objectToMerge[attribute];
}
} catch(e) {
rootObject[attribute] = objectToMerge[attribute];
}
}
return rootObject;
}
/*End Private methods*/
return {
getNodeText: getNodeText,
isCssPropertySupported: isCssPropertySupported,
isAttributeSupported: isAttributeSupported,
mergeObjects: mergeObjects,
concat: concat,
createPlaceholder: createPlaceholder,
isEqual: isEqual,
uniqueArray: uniqueArray,
};
} (jsHelper || {}));