(function(){
    var advBroker = window.advBroker = {
        sourceUrl: 'http://advbroker.ru/many.php',
        advFlag: document.getElementById ? true : false,
        placesList: [],
        trace: /_dbgjs=ab/.test(document.location.search),
        rndGroup: Math.floor(Math.random()*100),

        __events: {
			beforeload: [],
			afterload: [],
			aftershow: []
		},

        __runEvent: function(event, queryId) {
            if (typeof(queryId) != 'undefined' && queryId != null) {
                if (typeof(advBroker.placesList[queryId]) != 'undefined') {
                    var place = advBroker.placesList[queryId];
                    if (place.__events[event].length > 0) {
                        for (var i=0; i<place.__events[event].length; i++) {
                            place.__events[event][i](place);
                        }
                    }
                }
            } else {
                if (advBroker.__events[event].length > 0) {
                    for (var i=0; i<advBroker.__events[event].length; i++) {
                        advBroker.__events[event][i]();
                    }
                }
            }
        },

        registerEvent: function(event, func, place) {
            if (typeof(func) != 'function') {
                return false;
            }

            if (typeof(place) != 'undefined' && place != null) {
                for (i=0;i<advBroker.placesList.length;i++) {
                    if (advBroker.placesList[i].place == place) {
                        advBroker.placesList[i].__events[event].push(func);
                    }
                }
            } else {
                advBroker.__events[event].push(func);
            }

            return true;
        },
        
        done: function(queryId, result){
            if (typeof(advBroker.placesList[queryId]) != 'undefined') {
                //advBroker.__runEvent('afterload', queryId);
                if (typeof(advBroker.placesList[queryId].callback) == 'function') {
                    advBroker.placesList[queryId].callback(queryId, result);
                }
                advBroker.__runEvent('aftershow', queryId);
            }
        },

        call: function(url, req){
            var queryId = Math.random().toString().replace(/\./g,""),
                req = typeof(req) == 'object' ? req : {},
                callId = 'call_' + queryId,
                qStr = '?';
            
            for (var i in req) {
                qStr += i+'='+req[i]+'&';
            }

            document.write('<script id="'+callId+'" type="text/javascript" src="'+url+qStr+'"></script>');
            return;
        },

        removeCall: function(queryId){
            var e = document.getElementById('call_' + queryId);
            if (typeof(e) != 'undefined' && e != null) {
                e.parentNode.removeChild(e);
            }
            return false;
        },

        setAbHtml: function(place, request, fn, oldMany, rndGroup) {
            if (!advBroker.advFlag) {
                if (request[0] != '&') 
                    request = '&' + request;
                document.write('<script type="text/javascript" src="http://advbroker.ru/html.php?p='+place+request+'"></script>');
                return;
            }

            request = request.replace(/&amp;/g, "&");
            oldMany = typeof(oldMany) == 'boolean' ? oldMany : false;
            fn = typeof(fn) == 'function' ? fn : (oldMany ? null : advBroker.callback);
            rndGroup = typeof(rndGroup) == 'number' ? rndGroup : advBroker.rndGroup;
            
            var queryId = advBroker.placesList.length,
                listenerId = 'advbroker_place_' + queryId,
                reqParam = request.split('&'),
                req = {};
            
            for (i=0;i<reqParam.length;i++) {
                var rp = reqParam[i];
                if (rp.length > 0) {
                    var p = rp.split('=');
                    req[p[0]] = p[1];
                }
            }
            
            if (!oldMany) {
                req['__advjc'] = queryId;
            }
	    
            if (rndGroup >= 0) {
                req['rnd_group'] = rndGroup;
            }
            
            
            advBroker.placesList.push({
                place: place,
                listener: listenerId,
                req: req,
                callback: fn,
                __events: {
                    beforeload: [],
                    afterload: [],
                    aftershow: []
                }
            });

            document.write('<span style="margin:0; padding:0" id="' + listenerId + '"></span>');
        },

        
        load: function() {
            if (!advBroker.placesList.length) {
                return;
            }

            var loads = [];
            for (i=0;i<advBroker.placesList.length;i++) {
                var b = advBroker.placesList[i],
                    req = [];
                for (var j in b.req) {
                    req.push(j+'='+encodeURIComponent(b.req[j]));
                }
                loads.push(b.place+','+i+(req.length ? ','+req.join(':') : ''));

                //advBroker.__runEvent('beforeload', i);
            }

            if (loads.length) {
                //advBroker.__runEvent('beforeload');

                advBroker.call(advBroker.sourceUrl, {
                    places: loads.join(';'),
                    ref: encodeURIComponent(document.location.href)
                });

                //advBroker.__runEvent('afterload');
            }

            return;
        },

        callback: function(queryId, data) {
            if (typeof(data) != 'string') {
                return;
            }

            try {
                var reg = /<script[^>]*?>([\s\S]*?)<\/script>/ig,
                    regRepl = /<script[^>]*?>[\s\S]*?<\/script>/ig,
                    scripts = [],
                    el = document.getElementById(advBroker.placesList[queryId].listener),
                    tmpElId = 'adv_tmp_load_content_' + queryId;

                while ((scriptArray = reg.exec(data)) != null) {
                    if (scriptArray[1].length > 0) {
                        scripts.push(scriptArray[1]);
                    }
                }

                data = data.replace(regRepl, '');
                el.innerHTML = data;
                
                if (scripts.length > 0) {
                    document.write('<span style="margin:0; padding:0; display: none;" id="' + tmpElId + '">');
                    for (i=0;i<scripts.length;i++) {
                        eval(scripts[i]);
                    }
                    document.write('</span>');
                    var tmpEl = document.getElementById(tmpElId);
                    el.innerHTML = el.innerHTML + tmpEl.innerHTML;
                }
            } catch (e) {
                if (advBroker.trace) { throw e; }
            }
            return true;
        }
    };
})();

function ab_place(place, request, fn, oldMany, rndGroup) {
    fn = typeof(fn) == 'function' ? fn : null;
    oldMany = typeof(oldMany) == 'boolean' ? oldMany : false;
    rndGroup = typeof(rndGroup) == 'number' ? rndGroup : false;
    advBroker.setAbHtml(place, request, fn, oldMany, rndGroup);
}


function ab_load_banners() {
    advBroker.load();
}

function ab_register_event(event, func, place) {
    return advBroker.registerEvent(event, func, place);
}
