retreaverjs-rails 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gruntfile.js +48 -0
- data/LICENSE +674 -0
- data/README.md +90 -0
- data/Rakefile +16 -0
- data/config/README +1 -0
- data/config/jsdocs.json +26 -0
- data/lib/retreaverjs/compile.rb +32 -0
- data/lib/retreaverjs/rails/version.rb +5 -0
- data/lib/retreaverjs/rails.rb +8 -0
- data/package.json +46 -0
- data/src/retreaver/base/base64.js +126 -0
- data/src/retreaver/base/cookies.js +59 -0
- data/src/retreaver/base/data.js +81 -0
- data/src/retreaver/base/helpers.js +55 -0
- data/src/retreaver/base/model.js +113 -0
- data/src/retreaver/base/request.js +215 -0
- data/src/retreaver/base/request_number.js +193 -0
- data/src/retreaver/cache.js +1 -0
- data/src/retreaver/callpixels.js +3 -0
- data/src/retreaver/campaign.js +108 -0
- data/src/retreaver/number.js +206 -0
- metadata +121 -0
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# jsdocs
|
2
|
+
|
3
|
+
https://retreaver.com/documentation/javascript/v1/Retreaver.Number.html
|
4
|
+
|
5
|
+
|
6
|
+
# Usage
|
7
|
+
|
8
|
+
Include the retreaver.js script on the page.
|
9
|
+
|
10
|
+
```
|
11
|
+
<script src="/path/to/retreaver.js" type="text/javascript"></script>
|
12
|
+
```
|
13
|
+
|
14
|
+
|
15
|
+
# Examples
|
16
|
+
|
17
|
+
### Campaign
|
18
|
+
|
19
|
+
Initialize a campaign that will return numbers matching home_value:50000
|
20
|
+
|
21
|
+
```javascript
|
22
|
+
var campaign = new Retreaver.Campaign({ campaign_key: 'the_key_example' });
|
23
|
+
```
|
24
|
+
|
25
|
+
Request a number from the campaign matching tags, and use jQuery to display it on the page.
|
26
|
+
|
27
|
+
```javascript
|
28
|
+
var tags = {
|
29
|
+
home_value: '50000'
|
30
|
+
};
|
31
|
+
campaign.request_number(tags, function (number) {
|
32
|
+
$('#number_on_page').html( number.get('formatted_number') );
|
33
|
+
});
|
34
|
+
```
|
35
|
+
|
36
|
+
|
37
|
+
### Number
|
38
|
+
|
39
|
+
##### Tags
|
40
|
+
|
41
|
+
Display the tags currently attached to this number.
|
42
|
+
|
43
|
+
```javascript
|
44
|
+
number.get('tag_values');
|
45
|
+
```
|
46
|
+
|
47
|
+
Add / Remove / Clear Tags
|
48
|
+
|
49
|
+
```javascript
|
50
|
+
number.add_tags({'date_of_birth': '1980/01/01'});
|
51
|
+
number.remove_tags({'date_of_birth': '1980/01/01'});
|
52
|
+
number.clear_tags();
|
53
|
+
```
|
54
|
+
|
55
|
+
##### Release
|
56
|
+
|
57
|
+
When you are finished with a number you can release it back to the campaign.
|
58
|
+
|
59
|
+
```javascript
|
60
|
+
number.release();
|
61
|
+
```
|
62
|
+
|
63
|
+
##### Initiate Call
|
64
|
+
|
65
|
+
You can initiate a call with the user.
|
66
|
+
|
67
|
+
```javascript
|
68
|
+
number.initiate_call('1112224444', {}, function(call){
|
69
|
+
// Call initiated
|
70
|
+
});
|
71
|
+
```
|
72
|
+
|
73
|
+
##### Attributes
|
74
|
+
|
75
|
+
Numbers have attributes that can be retrieved.
|
76
|
+
|
77
|
+
```javascript
|
78
|
+
number.get('campaign_key');
|
79
|
+
```
|
80
|
+
|
81
|
+
| Attribute | Type | Description |
|
82
|
+
| ----------------- |:---------------:|:-------------------------------------------------------------------:|
|
83
|
+
| id | numeric | number id |
|
84
|
+
| campaign_key | alpha-numeric | campaign key |
|
85
|
+
| formatted_number | string | formatted number according to national style `(866) 898-7878` |
|
86
|
+
| number | string | E.164 formatted number `+18668987878` |
|
87
|
+
| plain_number | string | unformatted phone number digits `8668987878` |
|
88
|
+
| target_open | boolean | does this number have targets that are available to take calls? |
|
89
|
+
| is_per_visitor | boolean | does this number track unique visitors? |
|
90
|
+
| tag_values | object | the tags currently assigned to this number |
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'lib/retreaverjs/compile.rb'
|
4
|
+
|
5
|
+
namespace :retreaverjs do
|
6
|
+
desc "compile retreaverjs"
|
7
|
+
task :compile do
|
8
|
+
Retreaver::Compile.perform
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
task :before_build do
|
13
|
+
Rake::Task["retreaverjs:compile"].execute
|
14
|
+
end
|
15
|
+
|
16
|
+
task :build => :before_build
|
data/config/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
See our <a href="http://support.retreaver.com/retreaver-js/">knowledge base article</a> for more information.
|
data/config/jsdocs.json
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
{
|
2
|
+
"tags": {
|
3
|
+
"allowUnknownTags": true
|
4
|
+
},
|
5
|
+
"source": {
|
6
|
+
"include": [
|
7
|
+
"config/README",
|
8
|
+
"src/retreaver/number.js",
|
9
|
+
"src/retreaver/campaign.js"
|
10
|
+
],
|
11
|
+
"exclude": [],
|
12
|
+
"includePattern": ".+\\.js(doc)?$",
|
13
|
+
"excludePattern": "(^|\\/|\\\\)_"
|
14
|
+
},
|
15
|
+
"opts": {
|
16
|
+
"destination": "./vendor/documentation/javascript/v1/"
|
17
|
+
},
|
18
|
+
"plugins": [],
|
19
|
+
"templates": {
|
20
|
+
"cleverLinks": false,
|
21
|
+
"monospaceLinks": false,
|
22
|
+
"default": {
|
23
|
+
"outputSourceFiles": true
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Retreaver
|
2
|
+
class Compile
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def perform
|
6
|
+
Dir.chdir(root) do |f|
|
7
|
+
run("npm install") unless Dir.exist?('./node_modules')
|
8
|
+
# compile src
|
9
|
+
run("grunt")
|
10
|
+
output = 'vendor/assets/javascripts/'
|
11
|
+
FileUtils.rm_rf(output)
|
12
|
+
FileUtils.mkdir_p(output)
|
13
|
+
Dir.glob('dist/*.js'){|f| FileUtils.cp( f, output ) }
|
14
|
+
# generate jsdocs
|
15
|
+
output = 'vendor/documentation/javascripts/'
|
16
|
+
FileUtils.rm_rf(output)
|
17
|
+
run("./node_modules/.bin/jsdoc -c config/jsdocs.json")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(command)
|
22
|
+
puts(command)
|
23
|
+
system(command)
|
24
|
+
end
|
25
|
+
|
26
|
+
def root
|
27
|
+
File.expand_path(File.join(__FILE__, '../../../'))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/package.json
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
{
|
2
|
+
"name": "retreaver",
|
3
|
+
"description": "Retreaver Javascript API",
|
4
|
+
"version": "0.1.0",
|
5
|
+
"homepage": "https://github.com/retreaver/retreaverjs",
|
6
|
+
"repository": {
|
7
|
+
"type": "git",
|
8
|
+
"url": "https://github.com/retreaver/retreaverjs.git"
|
9
|
+
},
|
10
|
+
"bugs": {
|
11
|
+
"url": "https://github.com/retreaver/retreaverjs/issues"
|
12
|
+
},
|
13
|
+
"author": {
|
14
|
+
"name": "Blake Hilscher",
|
15
|
+
"email": "blake@retreaver.com",
|
16
|
+
"url": "http://retreaver.com/"
|
17
|
+
},
|
18
|
+
"contributors": [
|
19
|
+
{
|
20
|
+
"name": "Blake Hilscher",
|
21
|
+
"email": "blake@hilscher.ca",
|
22
|
+
"url": "http://blake.hilscher.ca/"
|
23
|
+
}
|
24
|
+
],
|
25
|
+
"licenses": [
|
26
|
+
{
|
27
|
+
"type": "GPLv3",
|
28
|
+
"url": "http://github.com/retreaver/retreaverjs/blob/master/LICENSE"
|
29
|
+
}
|
30
|
+
],
|
31
|
+
"main": "src/package.js",
|
32
|
+
"engines": {
|
33
|
+
"node": ">= 0.6.x"
|
34
|
+
},
|
35
|
+
"dependencies": {
|
36
|
+
},
|
37
|
+
"devDependencies": {
|
38
|
+
"grunt": "~0.4.5",
|
39
|
+
"jsdoc": "~3.2.2",
|
40
|
+
"grunt-contrib-jshint": "~0.10.0",
|
41
|
+
"grunt-contrib-nodeunit": "~0.4.1",
|
42
|
+
"grunt-contrib-uglify": "~0.5.0",
|
43
|
+
"grunt-contrib-watch": "~0.6.1",
|
44
|
+
"grunt-contrib-concat": "~0.4.0"
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,126 @@
|
|
1
|
+
// http://www.webtoolkit.info/javascript-base64.html#.U-qwzYBdUwQ
|
2
|
+
(function () {
|
3
|
+
var Base64 = {
|
4
|
+
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
5
|
+
};
|
6
|
+
// public method for encoding
|
7
|
+
Base64.encode = function (input) {
|
8
|
+
var output = "";
|
9
|
+
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
10
|
+
var i = 0;
|
11
|
+
|
12
|
+
input = Base64._utf8_encode(input);
|
13
|
+
|
14
|
+
while (i < input.length) {
|
15
|
+
|
16
|
+
chr1 = input.charCodeAt(i++);
|
17
|
+
chr2 = input.charCodeAt(i++);
|
18
|
+
chr3 = input.charCodeAt(i++);
|
19
|
+
|
20
|
+
enc1 = chr1 >> 2;
|
21
|
+
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
22
|
+
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
23
|
+
enc4 = chr3 & 63;
|
24
|
+
|
25
|
+
if (isNaN(chr2)) {
|
26
|
+
enc3 = enc4 = 64;
|
27
|
+
} else if (isNaN(chr3)) {
|
28
|
+
enc4 = 64;
|
29
|
+
}
|
30
|
+
output = output +
|
31
|
+
Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
|
32
|
+
Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);
|
33
|
+
|
34
|
+
}
|
35
|
+
return output;
|
36
|
+
};
|
37
|
+
Base64.decode = function (input) {
|
38
|
+
var output = "";
|
39
|
+
var chr1, chr2, chr3;
|
40
|
+
var enc1, enc2, enc3, enc4;
|
41
|
+
var i = 0;
|
42
|
+
|
43
|
+
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
44
|
+
|
45
|
+
while (i < input.length) {
|
46
|
+
|
47
|
+
enc1 = Base64._keyStr.indexOf(input.charAt(i++));
|
48
|
+
enc2 = Base64._keyStr.indexOf(input.charAt(i++));
|
49
|
+
enc3 = Base64._keyStr.indexOf(input.charAt(i++));
|
50
|
+
enc4 = Base64._keyStr.indexOf(input.charAt(i++));
|
51
|
+
|
52
|
+
chr1 = (enc1 << 2) | (enc2 >> 4);
|
53
|
+
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
54
|
+
chr3 = ((enc3 & 3) << 6) | enc4;
|
55
|
+
|
56
|
+
output = output + String.fromCharCode(chr1);
|
57
|
+
|
58
|
+
if (enc3 != 64) {
|
59
|
+
output = output + String.fromCharCode(chr2);
|
60
|
+
}
|
61
|
+
if (enc4 != 64) {
|
62
|
+
output = output + String.fromCharCode(chr3);
|
63
|
+
}
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
output = Base64._utf8_decode(output);
|
68
|
+
|
69
|
+
return output;
|
70
|
+
};
|
71
|
+
Base64._utf8_encode = function (string) {
|
72
|
+
//REGEX_2: /\r\n/g NEWLINE: "\n"
|
73
|
+
string = string.replace(eval("/\\r\\n/g"),eval("String('\\n')"));
|
74
|
+
var utftext = "";
|
75
|
+
|
76
|
+
for (var n = 0; n < string.length; n++) {
|
77
|
+
|
78
|
+
var c = string.charCodeAt(n);
|
79
|
+
|
80
|
+
if (c < 128) {
|
81
|
+
utftext += String.fromCharCode(c);
|
82
|
+
}
|
83
|
+
else if ((c > 127) && (c < 2048)) {
|
84
|
+
utftext += String.fromCharCode((c >> 6) | 192);
|
85
|
+
utftext += String.fromCharCode((c & 63) | 128);
|
86
|
+
}
|
87
|
+
else {
|
88
|
+
utftext += String.fromCharCode((c >> 12) | 224);
|
89
|
+
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
90
|
+
utftext += String.fromCharCode((c & 63) | 128);
|
91
|
+
}
|
92
|
+
|
93
|
+
}
|
94
|
+
|
95
|
+
return utftext;
|
96
|
+
};
|
97
|
+
Base64._utf8_decode = function (utftext) {
|
98
|
+
var string = "";
|
99
|
+
var i = 0;
|
100
|
+
var c = c1 = c2 = 0;
|
101
|
+
|
102
|
+
while (i < utftext.length) {
|
103
|
+
|
104
|
+
c = utftext.charCodeAt(i);
|
105
|
+
|
106
|
+
if (c < 128) {
|
107
|
+
string += String.fromCharCode(c);
|
108
|
+
i++;
|
109
|
+
}
|
110
|
+
else if ((c > 191) && (c < 224)) {
|
111
|
+
c2 = utftext.charCodeAt(i + 1);
|
112
|
+
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
|
113
|
+
i += 2;
|
114
|
+
}
|
115
|
+
else {
|
116
|
+
c2 = utftext.charCodeAt(i + 1);
|
117
|
+
c3 = utftext.charCodeAt(i + 2);
|
118
|
+
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
119
|
+
i += 3;
|
120
|
+
}
|
121
|
+
|
122
|
+
}
|
123
|
+
return string;
|
124
|
+
};
|
125
|
+
Retreaver.Base.Base64 = Base64;
|
126
|
+
})();
|
@@ -0,0 +1,59 @@
|
|
1
|
+
// https://github.com/evertton/cookiejs
|
2
|
+
(function (f) {
|
3
|
+
var a = function (b, c, d) {
|
4
|
+
return 1 === arguments.length ? a.get(b) : a.set(b, c, d)
|
5
|
+
};
|
6
|
+
a._document = document;
|
7
|
+
a._navigator = navigator;
|
8
|
+
a.defaults = {path: "/"};
|
9
|
+
a.get = function (b) {
|
10
|
+
a._cachedDocumentCookie !== a._document.cookie && a._renewCache();
|
11
|
+
return a._cache[b]
|
12
|
+
};
|
13
|
+
a.set = function (b, c, d) {
|
14
|
+
d = a._getExtendedOptions(d);
|
15
|
+
a._document.cookie = a._generateCookieString(b, c, d);
|
16
|
+
return a
|
17
|
+
};
|
18
|
+
a._getExtendedOptions = function (b) {
|
19
|
+
return{path: b && b.path || a.defaults.path, domain: b && b.domain || a.defaults.domain, secure: b && b.secure !== f ? b.secure :
|
20
|
+
a.defaults.secure}
|
21
|
+
};
|
22
|
+
a._isValidDate = function (a) {
|
23
|
+
return"[object Date]" === Object.prototype.toString.call(a) && !isNaN(a.getTime())
|
24
|
+
};
|
25
|
+
a._generateCookieString = function (a, c, d) {
|
26
|
+
a = encodeURIComponent(a);
|
27
|
+
c = (c + "").replace(/[^!#$&-+\--:<-\[\]-~]/g, encodeURIComponent);
|
28
|
+
d = d || {};
|
29
|
+
a = a + "=" + c + (d.path ? ";path=" + d.path : "");
|
30
|
+
a += d.domain ? ";domain=" + d.domain : "";
|
31
|
+
return a += d.secure ? ";secure" : ""
|
32
|
+
};
|
33
|
+
a._getCookieObjectFromString = function (b) {
|
34
|
+
var c = {};
|
35
|
+
b = b ? b.split("; ") : [];
|
36
|
+
for (var d = 0; d < b.length; d++) {
|
37
|
+
var e = a._getKeyValuePairFromCookieString(b[d]);
|
38
|
+
c[e.key] === f && (c[e.key] = e.value)
|
39
|
+
}
|
40
|
+
return c
|
41
|
+
};
|
42
|
+
a._getKeyValuePairFromCookieString = function (a) {
|
43
|
+
var c = a.indexOf("="), c = 0 > c ? a.length : c;
|
44
|
+
return{key: decodeURIComponent(a.substr(0, c)), value: decodeURIComponent(a.substr(c + 1))}
|
45
|
+
};
|
46
|
+
a._renewCache = function () {
|
47
|
+
a._cache = a._getCookieObjectFromString(a._document.cookie);
|
48
|
+
a._cachedDocumentCookie = a._document.cookie
|
49
|
+
};
|
50
|
+
a._areEnabled = function () {
|
51
|
+
return a._navigator.cookieEnabled || "1" === a.set("cookies.js", 1).get("cookies.js")
|
52
|
+
};
|
53
|
+
a.enabled = a._areEnabled();
|
54
|
+
"function" === typeof define &&
|
55
|
+
define.amd ? define(function () {
|
56
|
+
return a
|
57
|
+
}) : "undefined" !== typeof exports ? ("undefined" !== typeof module && module.exports && (exports = module.exports = a), exports.Cookies = a) : a;
|
58
|
+
Retreaver.Base.Cookies = a;
|
59
|
+
})();
|
@@ -0,0 +1,81 @@
|
|
1
|
+
(function () {
|
2
|
+
// Dependencies
|
3
|
+
var Base = Retreaver.Base;
|
4
|
+
/**
|
5
|
+
* @constructor
|
6
|
+
* @memberof Retreaver.Base
|
7
|
+
* @param {Object} config - Configuration hash
|
8
|
+
* @param {String} config.type - The data type
|
9
|
+
* @param {Numeric} config.primary_key - The primary_key
|
10
|
+
*/
|
11
|
+
var Data = function (config) {
|
12
|
+
|
13
|
+
function initialize() {
|
14
|
+
Base.assert_required_keys(config, 'type', 'primary_key');
|
15
|
+
if (typeof Retreaver.Base.Data._store[config.type] === 'undefined') {
|
16
|
+
Retreaver.Base.Data._store[config.type] = {};
|
17
|
+
}
|
18
|
+
if (typeof Retreaver.Base.Data._store[config.type][config.primary_key] === 'undefined') {
|
19
|
+
Retreaver.Base.Data._store[config.type][config.primary_key] = {};
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
var self = this;
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Request data from the host
|
27
|
+
* @memberOf Retreaver.Base.Data
|
28
|
+
* @function get
|
29
|
+
* @instance
|
30
|
+
* @param {String} key - The key to retrieve
|
31
|
+
* @returns {*}
|
32
|
+
*/
|
33
|
+
self.get = function () {
|
34
|
+
var output = {};
|
35
|
+
if (typeof arguments[0] === 'undefined') {
|
36
|
+
output = Retreaver.Base.Data._store[config.type][config.primary_key];
|
37
|
+
} else if (arguments.length === 1) {
|
38
|
+
output = Retreaver.Base.Data._store[config.type][config.primary_key][arguments[0]];
|
39
|
+
} else {
|
40
|
+
for (var i = 0; i < arguments.length; i++) {
|
41
|
+
var key = arguments[i];
|
42
|
+
output[key] = Retreaver.Base.Data._store[config.type][config.primary_key][key];
|
43
|
+
}
|
44
|
+
}
|
45
|
+
return output;
|
46
|
+
};
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Request data from the host
|
50
|
+
* @memberOf Retreaver.Base.Data
|
51
|
+
* @function set
|
52
|
+
* @instance
|
53
|
+
* @param {String} key - The key to retrieve
|
54
|
+
* @param {String} value - The value to assign
|
55
|
+
* @returns {*}
|
56
|
+
*/
|
57
|
+
self.set = function (key, value) {
|
58
|
+
Retreaver.Base.Data._store[config.type][config.primary_key][key] = value;
|
59
|
+
return value;
|
60
|
+
};
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Merge data
|
64
|
+
* @memberOf Retreaver.Base.Data
|
65
|
+
* @function set
|
66
|
+
* @instance
|
67
|
+
* @param {String} object - The object to merge
|
68
|
+
* @returns {*}
|
69
|
+
*/
|
70
|
+
self.merge = function (object) {
|
71
|
+
for (var key in object) {
|
72
|
+
Retreaver.Base.Data._store[config.type][config.primary_key][key] = object[key];
|
73
|
+
}
|
74
|
+
return object;
|
75
|
+
};
|
76
|
+
|
77
|
+
initialize();
|
78
|
+
};
|
79
|
+
Data._store = {};
|
80
|
+
Retreaver.Base.Data = Data;
|
81
|
+
})();
|
@@ -0,0 +1,55 @@
|
|
1
|
+
(function () {
|
2
|
+
// ensure namespace is present
|
3
|
+
if (typeof window.Retreaver === 'undefined') window.Retreaver = {};
|
4
|
+
var Base = {};
|
5
|
+
// define helpers
|
6
|
+
Base.assert_required_keys = function () {
|
7
|
+
var args = Array.prototype.slice.call(arguments);
|
8
|
+
var object = args.shift();
|
9
|
+
for (var i = 0; i < args.length; i++) {
|
10
|
+
var key = args[i];
|
11
|
+
if (typeof object === 'undefined' || typeof object[key] === 'undefined') {
|
12
|
+
throw "ArgumentError: Required keys are not defined: " + args.join(', ');
|
13
|
+
}
|
14
|
+
}
|
15
|
+
return object;
|
16
|
+
};
|
17
|
+
Base.merge = function (obj1, obj2) {
|
18
|
+
for (var p in obj2) {
|
19
|
+
try {
|
20
|
+
if (obj2[p].constructor == Object) {
|
21
|
+
obj1[p] = Base.merge(obj1[p], obj2[p]);
|
22
|
+
} else {
|
23
|
+
obj1[p] = obj2[p];
|
24
|
+
}
|
25
|
+
} catch (e) {
|
26
|
+
obj1[p] = obj2[p];
|
27
|
+
}
|
28
|
+
}
|
29
|
+
return obj1;
|
30
|
+
};
|
31
|
+
Base.isArray = function (arg) {
|
32
|
+
return Object.prototype.toString.call(arg) === '[object Array]';
|
33
|
+
};
|
34
|
+
Base.ieVersion = function () {
|
35
|
+
if (Base._ieVersion == null) {
|
36
|
+
Base._ieVersion = (function () {
|
37
|
+
var v = 3,
|
38
|
+
div = document.createElement('div'),
|
39
|
+
all = div.getElementsByTagName('i');
|
40
|
+
|
41
|
+
while (
|
42
|
+
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
|
43
|
+
all[0]
|
44
|
+
) {
|
45
|
+
}
|
46
|
+
return v > 4 ? v : false;
|
47
|
+
}());
|
48
|
+
}
|
49
|
+
if (Base._ieVersion == 6 || Base._ieVersion == 7) {
|
50
|
+
if (Retreaver['easyxdm_loaded'] == null) Retreaver['easyxdm_loaded'] = false;
|
51
|
+
}
|
52
|
+
return Base._ieVersion;
|
53
|
+
};
|
54
|
+
Retreaver.Base = Base;
|
55
|
+
})();
|
@@ -0,0 +1,113 @@
|
|
1
|
+
(function () {
|
2
|
+
// Dependencies
|
3
|
+
var Base = Retreaver.Base;
|
4
|
+
var Data = Retreaver.Base.Data;
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @constructor
|
8
|
+
* @memberof Retreaver.Base
|
9
|
+
*/
|
10
|
+
var Model = function () {
|
11
|
+
|
12
|
+
this.api_host_uri = '/api/v1/';
|
13
|
+
this.type = 'model';
|
14
|
+
|
15
|
+
this.primary_key = function (primary_key) {
|
16
|
+
return Model.primary_key(this.type, primary_key);
|
17
|
+
};
|
18
|
+
|
19
|
+
this.store = function (data) {
|
20
|
+
// do we have data to store?
|
21
|
+
if (typeof(data) !== 'undefined') {
|
22
|
+
// does the data contain the required primary_key?
|
23
|
+
var key = this.primary_key();
|
24
|
+
if (typeof(data[key]) === 'undefined') {
|
25
|
+
throw("ArgumentError: Expected to receive primary_key " + key);
|
26
|
+
}
|
27
|
+
// has a store been initialized?
|
28
|
+
else if (typeof(this._store) === 'undefined') {
|
29
|
+
this._store = new Retreaver.Base.Data({type: this.type, primary_key: data[key] });
|
30
|
+
}
|
31
|
+
// merge the data
|
32
|
+
this._store.merge(data);
|
33
|
+
// update visitor is token present
|
34
|
+
Model.update_visitor_id(data);
|
35
|
+
}
|
36
|
+
return this._store;
|
37
|
+
};
|
38
|
+
|
39
|
+
this.get_data = function (path, callback) {
|
40
|
+
return this.connection().getJSON(this.api_host_uri + path, null, [Model.update, callback], this);
|
41
|
+
};
|
42
|
+
|
43
|
+
this.post_data = function (path, data, callback) {
|
44
|
+
return this.connection().postJSON(this.api_host_uri + path, data, [Model.update, callback], this);
|
45
|
+
};
|
46
|
+
|
47
|
+
this.set = function () {
|
48
|
+
if (typeof(this["set_" + arguments[0]]) === 'function') {
|
49
|
+
arguments[1] = this["set_" + arguments[0]].apply(this, [arguments[1]]);
|
50
|
+
}
|
51
|
+
return this._store.set.apply(this, arguments);
|
52
|
+
};
|
53
|
+
this.get = function () {
|
54
|
+
return this._store.get.apply(this, arguments);
|
55
|
+
};
|
56
|
+
this.connection = function () {
|
57
|
+
return Retreaver.Base.Request.connection();
|
58
|
+
};
|
59
|
+
};
|
60
|
+
Model.inflections = {
|
61
|
+
'number': 'numbers',
|
62
|
+
'campaign': 'campaigns'
|
63
|
+
};
|
64
|
+
Model.update = function (data) {
|
65
|
+
for (var key in data) {
|
66
|
+
var type = key;
|
67
|
+
var value = data[key];
|
68
|
+
if (typeof Model.inflections[key] !== 'undefined') {
|
69
|
+
type = Model.inflections[key];
|
70
|
+
}
|
71
|
+
if (typeof Data._store[type] !== 'undefined') {
|
72
|
+
if (Base.isArray(value)) {
|
73
|
+
for (var i = 0; i < value.length; i++) {
|
74
|
+
Model.update_record(type, value[i]);
|
75
|
+
}
|
76
|
+
} else {
|
77
|
+
Model.update_record(type, value[i]);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
return data;
|
82
|
+
};
|
83
|
+
Model.update_record = function (type, record) {
|
84
|
+
// update visitor is token present
|
85
|
+
Model.update_visitor_id(record);
|
86
|
+
// update data store
|
87
|
+
if (typeof record.id !== 'undefined') {
|
88
|
+
var primary_key = Model.primary_key(type);
|
89
|
+
for (var key in record) {
|
90
|
+
Retreaver.Base.Data._store[type][record[primary_key]][key] = record[key];
|
91
|
+
}
|
92
|
+
return true
|
93
|
+
} else {
|
94
|
+
return false
|
95
|
+
}
|
96
|
+
return record;
|
97
|
+
};
|
98
|
+
Model.update_visitor_id = function (record) {
|
99
|
+
if (typeof(record) !== 'undefined' && typeof(record.visitor_id) !== 'undefined') {
|
100
|
+
Retreaver.Base.Cookies.set('CallPixels-vid', record.visitor_id);
|
101
|
+
}
|
102
|
+
};
|
103
|
+
Model.primary_key = function (type, primary_key) {
|
104
|
+
if (typeof(Model.primary_keys) === 'undefined') Model.primary_keys = {};
|
105
|
+
// default key
|
106
|
+
if (typeof(Model.primary_keys[type]) === 'undefined') Model.primary_keys[type] = 'id';
|
107
|
+
// assign key if passed
|
108
|
+
if (typeof(primary_key) !== 'undefined') Model.primary_keys[type] = primary_key;
|
109
|
+
// return value
|
110
|
+
return Model.primary_keys[type];
|
111
|
+
}
|
112
|
+
Retreaver.Base.Model = Model;
|
113
|
+
})();
|