1
+ //Factory for creating the bidderAdaptor
2
+ var CONSTANTS = require ( '../constants.json' ) ;
3
+ var utils = require ( '../utils.js' ) ;
4
+ var bidfactory = require ( '../bidfactory.js' ) ;
5
+ var bidmanager = require ( '../bidmanager.js' ) ;
6
+
7
+ var ADAPTER_NAME = 'CASALE' ;
8
+ var ADAPTER_CODE = 'casale' ;
9
+
10
+ var CasaleAdapter = function CasaleAdapter ( ) {
11
+ var slotIdMap = { } ;
12
+ var requiredParams = [
13
+ /* 0 */
14
+ 'slotId' ,
15
+ /* 1 */
16
+ 'casaleUrl'
17
+ ] ;
18
+ var firstAdUnitCode = '' ;
19
+
20
+ function _callBids ( request ) {
21
+ var bidArr = request . bids ;
22
+
23
+ //validate first bid request with all required params.
24
+ if ( ! utils . hasValidBidRequest ( bidArr [ 0 ] . params , requiredParams , ADAPTER_NAME ) ) {
25
+ return ;
26
+ }
27
+ for ( var i = 0 ; i < bidArr . length ; i ++ ) {
28
+ var bid = bidArr [ i ] ;
29
+ //only validate 1st param on rest of bids
30
+ if ( utils . hasValidBidRequest ( bid . params , requiredParams . slice ( 0 , 1 ) , ADAPTER_NAME ) ) {
31
+ firstAdUnitCode = bid . placementCode ;
32
+ var slotId = bid . params [ requiredParams [ 0 ] ] ;
33
+ slotIdMap [ slotId ] = bid ;
34
+ }
35
+ }
36
+
37
+ var adUrl = bidArr [ 0 ] . params [ requiredParams [ 1 ] ] ;
38
+ var iframeContents = createRequestContent ( adUrl ) ;
39
+ var iframe = buildIframeContainer ( ) ;
40
+ var iframeId = iframe . id ;
41
+ //attach to onload event of iframe to ensure script is ready
42
+ utils . addEventHandler ( iframe , 'load' , function ( ) {
43
+ try {
44
+ var iframeObj = window . frames [ iframeId ] ;
45
+ var casaleObj = iframeObj . contentWindow . _IndexRequestData . targetIDToBid ;
46
+ var lookupObj = iframeObj . contentWindow . cygnus_index_args ;
47
+
48
+ if ( utils . isEmpty ( casaleObj ) ) {
49
+ //no bid response
50
+ var bid = bidfactory . createBid ( 2 ) ;
51
+ bid . bidderCode = ADAPTER_CODE ;
52
+ logErrorBidResponse ( ) ;
53
+ return ;
54
+ }
55
+
56
+ utils . _each ( casaleObj , function ( adContents , cpmAndSlotId ) {
57
+
58
+ utils . _each ( slotIdMap , function ( bid , adSlotId ) {
59
+ var obj = cpmAndSlotId . split ( '_' ) ;
60
+ var currentId = obj [ 0 ] ;
61
+ var currentCPM = obj [ 1 ] ;
62
+ if ( currentId === adSlotId ) {
63
+ var bidObj = slotIdMap [ adSlotId ] ;
64
+ var adUnitCode = bidObj . placementCode ;
65
+ var slotObj = getSlotObj ( lookupObj , adSlotId ) ;
66
+ bid = bidfactory . createBid ( 1 ) ;
67
+ bid . cpm = ( currentCPM / 100 ) ;
68
+ bid . ad = adContents ;
69
+ bid . ad_id = adSlotId ;
70
+ bid . bidderCode = ADAPTER_CODE ;
71
+ bid . width = slotObj . width ;
72
+ bid . height = slotObj . height ;
73
+ bid . siteID = slotObj . siteID ;
74
+ bidmanager . addBidResponse ( adUnitCode , bid ) ;
75
+ }
76
+ } ) ;
77
+ } ) ;
78
+
79
+ } catch ( e ) {
80
+ utils . logError ( 'Error calling casale adapter' , ADAPTER_NAME , e ) ;
81
+ logErrorBidResponse ( ) ;
82
+ }
83
+ } ) ;
84
+
85
+ var iframeDoc = iframe . contentWindow . document ;
86
+ iframeDoc . write ( iframeContents ) ;
87
+ iframeDoc . close ( ) ;
88
+ }
89
+
90
+ function getSlotObj ( obj , id ) {
91
+ var arr = obj . slots ;
92
+ var returnObj = { } ;
93
+ utils . _each ( arr , function ( value ) {
94
+ if ( value . id === id ) {
95
+ returnObj = value ;
96
+ }
97
+ } ) ;
98
+ return returnObj ;
99
+ }
100
+
101
+ function logErrorBidResponse ( ) {
102
+ //no bid response
103
+ var bid = bidfactory . createBid ( 2 ) ;
104
+ bid . bidderCode = ADAPTER_CODE ;
105
+ //log error to first add unit
106
+ bidmanager . addBidResponse ( firstAdUnitCode , bid ) ;
107
+ }
108
+
109
+ function buildIframeContainer ( ) {
110
+ var iframe = utils . createInvisibleIframe ( ) ;
111
+ var elToAppend = document . getElementsByTagName ( 'head' ) [ 0 ] ;
112
+ //insert the iframe into document
113
+ elToAppend . insertBefore ( iframe , elToAppend . firstChild ) ;
114
+ return iframe ;
115
+
116
+ }
117
+
118
+ function createRequestContent ( url ) {
119
+ var content = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><base target="_top" /><scr' + 'ipt>inDapIF=true;</scr' + 'ipt></head>' ;
120
+ content += '<body>' ;
121
+ content += '<scr' + 'ipt src="' + url + '"></scr' + 'ipt>' ;
122
+ content += '</body></html>' ;
123
+ return content ;
124
+ }
125
+
126
+
127
+ return {
128
+ callBids : _callBids
129
+ } ;
130
+ //end of Rubicon bid adaptor
131
+ } ;
132
+
133
+ module . exports = CasaleAdapter ;
0 commit comments