/*
Example:
<div id="zone-tiscali-wide"></div>
<script src="zone.js"></script>
<script>
    ZONE.setDebug(1)
    ZONE.setPrefix('zone-')
    ZONE.setCond({'sex':'m','age':17}) // cileni
    ZONE.setCharset('iso-8859-2')
</script>
<div style="sourceadv">
    <div><script>ZONE.place('tiscali-wide');</script></div> <!-- nacteni reklamy do stranky -->
</div>
<script>
    ZONE.move();                        // presun vsech reklam na spravne pozice
</script>
*/

var ZONE = {
    author      : 'bizi',
    version     : '2.0.1',
    condVars    : {},
    clearTarget : 1,    // smazat na zacatku obsah divu
    prefix      : '',
    debug       : 0,
    debugOpacity: 75,
    debugDiv    : null,
    debugList   : [],
    noCache     : 0,    /* 0/1 ... nic nechci cachovat */
    presetHeight: 1,    /* 0/1 ... prednastavit vysku? */
    urlZone     : ['http://ad1.net4ge.net/zone','http://ad2.net4ge.net/zone'],
    urlBann     : ['http://ad1.net4ge.net/bann','http://ad2.net4ge.net/bann'],
    urlDot      : 'http://dot.net4ge.net/dot/dot.gif',
    urlClick    : 'http://ad1.net4ge.net/redir', // TODO: sledovani prokliku k url se doplni ?zoneId=xxx&bannerId=xxx&url=escapovane_url
    useClick    : 0,
    fake        : 0, // pokud je pozice prazdna, vlozi jen prazdnej box a nazev pozice + pripadny text, 'flash'=vsude vlozi demo flash
    fakeFlash   : '<embed src="/fake.swf?clickthru=/demo/bla1/bla2?a%3D10" width="100%" height="300" />',

    conflictDict: {}, // TODO: nutne doresit reload


    body        : document.getElementsByTagName('body')[0],
    head        : document.getElementsByTagName('head')[0],
    charset     : 'utf8',
    className   : 'titadv',     // class pro reklamni boxy

    bannerCache : {}, // cache na samotna data banneru, aby se nestahoval znovu
    zoneInfoDict: {}, // hlavne na jakou zonu jakej banner
    zoneId      : null,  // jaka zona se prave zpracovava (pri seriovem zpracovani)
    zoneIdLast  : null,
    writeTarget : null, // kam zapisovat pro fake document.write
    randInt     : Math.round( Math.random()*9999 ),     // TODO: pro nahodne pojmenovani vsech vytvarenych elementu

    cookBanShow    : 'ZONEban',    // pod co ukladat pocet zobrazeni
    cookBanInterval: 'ZONEbanInterval', // pod co ukladat interval mezi zobrazenimi
    cookExpire  : 21*86400,  // 21 dnu, na jak dlouho ulozim kukinu s poctem zobrazeni banneru

    timeStart   : null,

    testZoneBanner : {},   // umozni natvrdo vynutit banner na pozici (pro testovani)

    '':'' // vycpavka kvuli carkam na konci
};
ZONE.init = function() {

    var obj = this.urlZone;
    if (typeof obj=='object' && obj.length) {
        // vyberu jeden
        this.urlZone = obj[Math.floor(Math.random()*obj.length)];
    }
    var obj = this.urlBann;
    if (typeof obj=='object' && obj.length) {
        this.urlBann = obj[Math.floor(Math.random()*obj.length)];
    }

    /* vlozi styly */
    var el = document.createElement('style');
    var txt = "#sourceadv { display:none; } " +
              "#dbglog"+this.randInt+" { z-index:100; text-align:left; margin:0!important; padding:2px; padding-left: 1px; border: 1px solid red; position: absolute; " +
              "top:0; right: 0; background: #fff; max-height: 60%; _height: 300px; min-height: 100px; overflow: auto; width:320px; font-size: 11px; font-family: sans-serif; "+
              "         opacity: 0."+this.debugOpacity+"; filter: alpha(opacity="+this.debugOpacity+"); -moz-opacity: 0."+this.debugOpacity+"; -khtml-opacity: 0."+this.debugOpacity+"; } " +
              "li.dbglog { margin:0!important; padding:0!important; line-height: 12px; list-style: inside decimal; } " +
              ".zonedot { position: absolute; visibility: hidden; top: -10px; left: -10px; } " +
              ".zonefake { height: 100px; background: yellow; border:none; text-align: center; font-family: Arial; } " +
              ".titadv  { padding-top: 12px; background: url(http://ad1.net4ge.cz/img/nadpis.gif) no-repeat top left; }";
    el.type= 'text/css';
    el.media= 'screen';
    if(el.styleSheet) el.styleSheet.cssText= txt;      // ie method
    else el.appendChild(document.createTextNode(txt)); // others
    this.head.appendChild(el);

    this.log("Zone version: "+this.version);

}
/* konfigurace */
ZONE.setPrefix = function(prefix) {
    this.prefix = prefix;
}
ZONE.setFake = function(fake) {
    this.fake = fake;
}
ZONE.setDebug = function(debug) {
    this.debug = debug;
    this.startDebug();
}
ZONE.testBanner = function(zoneId,bannerId) {
    this.testZoneBanner[zoneId] = bannerId;
}
ZONE.startDebug = function() {
    if (this.debug==1 && this.debugDiv==null) {
        var div = document.createElement('ul');
        div.id = 'dbglog'+this.randInt;
        //this.body.appendChild(div);
        var prvni = this.body.childNodes[0];
        this.body.insertBefore(div, prvni); // do body jako prvni elem
        this.debugDiv = div;
        this.debugDiv.style.display = 'block';
        for(i=0;i<this.debugList.length;i++) {
            this.log(this.debugList[i].txt, this.debugList[i].color);
        }
        this.debugList = [];
    }
    else {
        if (this.debugDiv) {
            this.debugDiv.style.display = 'none';
        }
    }
}
ZONE.setCond = function(condVars) {
    this.condVars = condVars;
}
ZONE.setClass = function(className) {
    this.className = className;
}
ZONE.setCharset = function(val) {
    this.charset = val;
}
/* uzitecne funkce */
ZONE.log = function(txt,color) {


    if (this.debug!=1) {
        this.debugList.push({txt:txt,color:color}) // pokud netisknu, tak jen skladuju
        return;
    }
    var div = document.createElement('li');
    if(color) {
        div.style.color = color;
    }
    div.innerHTML = txt;
    div.className = 'dbglog';
    this.debugDiv.appendChild(div);
    this.debugDiv.scrollTop = this.debugDiv.scrollHeight;
}
ZONE.$ = function(name) {
    return document.getElementById(name);
}
ZONE.fetchURLjs = function(url) {
    document.write("<sc"+"ript src='"+url+"' charset='"+this.charset+"' type='text/javascript'></scr"+"ipt>");
}
//ZONE.randTime = function() {
ZONE.cacheTime = function() {
    /* pro lepsi cachovani na 30 minut */
    var d = new Date();
    return Math.floor(d.getTime()/1000/1800);
}
/* reklama */
ZONE.place = function(zoneId) {

    /* prvni stazeni reklamy zaznamena start time */
    if (!this.timeStart) { this.timeStart = new Date().getTime()/1000; }

    if (zoneId.substring(0,this.prefix.length) == this.prefix) {
        /* kdyby nahodou nekdo napsal prefix i k vlozeni banneru */
        zoneId = zoneId.substring(this.prefix.length,zoneId.length);
    }

    var target = this.$(this.prefix+zoneId);
    if (!target) {
        this.log("Cilovy div "+this.prefix+zoneId+" nenalezen! (nestahuju)",'red');
        return;
    }

    this.zoneInfoDict[zoneId] = null;

    var sourceId = "tmp-source-"+zoneId;
    document.write('<div id="'+sourceId+'">');

    // prazdna struktura (bannerIdList - jake bannery zobrazit)
    var zoneInfo = { useBannerList:[], errZone:1, control:{}, bannerList: [], bannerDict:{} };
    this.zoneInfoDict[zoneId] = zoneInfo;
    // zruseno: bannerId: 0, placed: 0,  errBann:1

    /* nechce jen testovat? */
    if (window.location.hash) {
        var re = /testBanner\((.+),(\d+)\)/;
        var m = re.exec(window.location.hash);
        if (m) {
            this.log("Hash: zone="+m[1]+' bannerId='+m[2], 'Indigo');
            this.testZoneBanner[m[1]] = m[2];
        }
    }
    if (this.testZoneBanner[zoneId]) {
        var bannerId = this.testZoneBanner[zoneId];
        var bi = {id:bannerId, ver:Math.random(),click:0,err:1};
        this.log("Test bannerId="+bannerId+' zone='+zoneId);
        zoneInfo.useBannerList.push(bi);
        zoneInfo.errZone=0;
        zoneInfo.bannerDict[bannerId] = bi;
        if (this.clearTarget) {
            target.innerHTML = '';
        }
        this.fetchBanner(zoneId, bi);
        return;
    }

    /* stahnu seznam banneru na pozici */
    url = this.urlZone+"/"+zoneId+".js?rand="+this.cacheTime();
    if (this.noCache) { url += "&rand2="+Math.random() }
    this.log('stahuji zonu '+zoneId);
    this.fetchURLjs(url);
    document.write('</div>');
}
ZONE.chooseBanner = function(zoneId, bannerList, control) {
    /* vyberu ze seznamu jeden vhodny banner pro tuto pozici */

    if (bannerList[ bannerList.length-1 ] == 0) {
        bannerList.length--;
    }

    var target = this.$(this.prefix+zoneId);
    if (!target) {
        this.log('mas blbe nazev zony v zone/'+zoneId+'.js','red');
        return;
    }
    if (this.clearTarget && bannerList.length>0) {
        target.innerHTML = '';
    }
    if (bannerList.length==0) {
        this.zoneInfoDict[zoneId].errZone = 0;
        this.log("No banners zone="+zoneId, 'blue');
        return;
    }


    /* vyrobim dict a pomocne polozky */
    var bannerDict = {}
    for (i=0;i<bannerList.length;i++) {
        var ban = bannerList[i];
        ban.click = 0;
        ban.err = 1;
        bannerDict[ban.id] = ban;
    }

    /* cileni: nejdriv oznacim to co nevyhovuje cileni */
    vars = this.condVars;
    if (vars != {}) {
        for (i=0;i<bannerList.length;i++) {
            var ban = bannerList[i];
            ban.skip = 0;
            if (!ban.cond) continue;
            try {
                ban.skip = !eval(ban.cond);
            }
            catch(err) {
                this.log('chybne zapsane cileni: zone='+zoneId+' bannerId='+ban.id+ ' err='+err, 'red');
                ban.skip = 1;
            }
            if (ban.skip) { this.log('choose: zone='+zoneId+' condition skip bannerId='+ban.id); }
        }
    }
    /* cileni end */

    /* max pocet zobrazeni a interval */
    for (i=0;i<bannerList.length;i++) {
        var ban = bannerList[i];
        var keyShow = this.cookBanShow+ban.id;
        var keyInterval = this.cookBanInterval+ban.id;

        var cntShow = Number(this.readCookie(keyShow));
        if (ban.maxShow && cntShow>ban.maxShow) {
            ban.skip = 1;
            this.log('Max show: limit='+ban.maxShow+' show='+cntShow+ ' zone='+zoneId+' ban='+ban.id, 'blue');
        }
        var showIntervalExist = Number(this.readCookie(keyInterval));
        if (ban.showInterval && showIntervalExist) {
            ban.skip = 1;
            this.log('Interval exist: limit='+ban.showInterval+' zone='+zoneId+' ban='+ban.id, 'blue');
        }
    }

    /* konflikty - zjistim jestli tam je neco aktivniho a bez konfliktu (z minule zony) a pokud ano, konfliktni polozky oznacim jako skip*/
    // spocitam pocet nekonfliktnich
    unconfCnt = 0;
    for (i=0;i<bannerList.length;i++) {
        var ban = bannerList[i];
        if (ban.skip) { continue }
        if (!this.conflictDict[ban.id]) {
            unconfCnt++;
        }
    }
    if(unconfCnt>0) {
        for (i=0;i<bannerList.length;i++) {
            var ban = bannerList[i];
            if (ban.skip) { continue }
            // jsem v konfliktu, tak vynecham
            if(this.conflictDict[ban.id]) {
                this.log('Conflict zoneId='+zoneId+' banId='+ban.id+' with '+this.conflictDict[ban.id],'pink');
                ban.skip = 1;
            }
        }
    }
    /* konflikty end */


    // doplnim polozku pro nevyuzita procenta (pokud jsou)
    var rateSum = 0;
    for (i=0;i<bannerList.length;i++) { rateSum += bannerList[i].rate; }
    if (rateSum<100) { bannerList.push({id:0, rate:100-rateSum}) } // empty vypln

    // filtrovani do noveho pole podle skip
    var rateSumF = 0;
    var bannerListF = [];
    for (i=0;i<bannerList.length;i++) {
        var item = bannerList[i];
        if (item.skip) { continue }
        bannerListF.push( item );
        rateSumF += item.rate;
    }

    if (!control) { control = {} }
    if (!control.quantity) { control.quantity = 'one' }

    if (control.quantity == 'all' && control.quantitySort == 'rand') {
        bannerListF.sort(function() {return 0.5 - Math.random()});
    }

    zoneInfo = this.zoneInfoDict[zoneId];
    zoneInfo.errZone = 0;
    zoneInfo.control = control;
    zoneInfo.bannerList = bannerList; // vsechno na pozici
    zoneInfo.useBannerList = []; // jen co pouziju
    zoneInfo.bannerDict = bannerDict; // pro lepsi hledani banneru na pozici (multipozici)

    /* nahodny vyber podle vahy */
    var rand = Math.round( Math.random()*rateSumF ); // nemusim prepocitavat rate, kdyz zmenim max
    this.log("choose banner: zone="+zoneId+" rand="+rand+ ' banners='+bannerListF.length+' sum='+rateSumF);


    var offset = 0;
    for (i=0;i<bannerListF.length;i++) {
        offset += bannerListF[i].rate;
        var use = 0;
        if (rand<=offset) {
            use = 1;
        }
        var ban = bannerListF[i];
        if (!ban.id) { continue } // empty vypln vynecham (je az na konci, takze se nic nestane)

        if (control.quantity == 'all') {
            use = 1;
        }
        if (use==1) {
            var height = 0;
            if (ban.height && this.presetHeight==1) {
                if (document.all) {
                    target.style.height = ban.height+'px';
                }
                else {
                    target.style.minHeight = ban.height+'px';
                }
                height = ban.height;
            }
            this.log('choose: zone='+zoneId+' bann_id='+ban.id+' minHeight='+height);
            zoneInfo.useBannerList.push(ban)
            this.fetchBanner(zoneId, ban);
            // vlozim konflikty ( a[kdo] = s cim(kdo_vlozil)
            if (ban.conflict) {
                for (j=0;j<ban.conflict.length;j++) { this.conflictDict[ ban.conflict[j] ] = ban.id; }
            }

            if (control.quantity != 'all') {
                //return;
                break;
            }
        }
    }
    if (zoneInfo.useBannerList.length==0) {
        this.log("EMPTY zone="+zoneId);
        zoneInfo.errZone=0;
    }

    if (this.zoneIdLast && zoneId!=this.zoneIdLast) {
        this.moveZone(this.zoneIdLast); // stehuju predchozi
        this.look(this.zoneIdLast);
    }
    this.zoneIdLast = zoneId;
}
ZONE.fetchBanner = function(zoneId, bannerInfo) {

    this.zoneId = zoneId;
    bannerId = bannerInfo.id;

    if(this.bannerCache[bannerId]) {
        this.log("banner in cache: zone="+zoneId+" banner "+bannerId,'magenta');
        this.addBanner(bannerId, this.bannerCache[bannerId]);
    }
    else {
        this.log("fetch banner: zone="+zoneId+" banner="+bannerId,'green');
        var url = this.urlBann+"/bann"+bannerId+".js?ver="+bannerInfo.ver;
        if (this.noCache) { url += "&rand="+Math.random() }
        this.fetchURLjs(url);
    }
}
ZONE.addBanner = function(bannerId, data) {
    var zoneId = this.zoneId; // lze pouzit jen pri JS v kodu bez defer
    var zoneInfo = this.zoneInfoDict[zoneId];
    if(!this.bannerCache[bannerId]) {
        this.bannerCache[bannerId] = data;
    }
    // obalim kazdej banner kvuli quantity:all a zapocitani zobrazeni do cookie pocitane v place
    if (this.fake == 'flash') {
        data = this.fakeFlash;
    }
    data = '<div id="place-'+zoneId+'-'+bannerId+'">'+data+'</div>';
    document.write(data);       // html i js reklamu vkladam na konec a presunu. usnadnuje to praci :)
    zoneInfo.bannerDict[bannerId].err = 0;
}
ZONE.move = function() {
    /* musi se delat az mimo divy s reklamou! */
    this.log("moving");
    var zoneId = 0;

    if (this.zoneIdLast) {
        this.moveZone(this.zoneIdLast); // stehuju predchozi
        this.look(this.zoneIdLast);
    }

    //for (zoneId in this.zoneInfoDict) {
    //    this.moveZone(zoneId);
    //}
    this.zoneId = null;

    // dodatecne upravy vzhledu a dot
    //for (zoneId in this.zoneInfoDict) {
    //    this.look(zoneId);
    //}
    var runTime = (new Date().getTime()/1000) - this.timeStart;
    this.log("Runtime: "+runTime+" sec");
}
ZONE.moveZone = function(zoneId) {

    this.log("moving zone="+zoneId);


    var zoneInfo = this.zoneInfoDict[zoneId];
    if (!zoneInfo || zoneInfo.errZone) {
        this.log("Zone error zoneId="+zoneId+" (404 nebo syntax)",'red');
        return;
    }

    var target = this.$(this.prefix+zoneId);
    if (!target) {
        this.log("Cilovy div "+this.prefix+zoneId+" nenalezen!",'red');
        return;
    }

    if (zoneInfo.useBannerList.length==0) {
        this.log("Zone "+zoneId+" empty",'blue');
        return;
    }

    for (i=0;i<zoneInfo.useBannerList.length;i++) {
        var ban = zoneInfo.useBannerList[i];
        if(ban.err == 1) {
            this.log("Banner error bannerId="+ban.id+" zoneId="+zoneId+" (404 nebo syntax)" ,'red');
        }
    }

    var sourceId = "tmp-source-"+zoneId;
    var source = this.$(sourceId);
    if (source) {
        // samotny presun
        target.appendChild(source.parentNode);
    }
    else {
        this.log("Source "+sourceId+" neexistuje!",'red');
    }
}
ZONE.look = function(zoneId) {
    // dodatecne upravy vzhledu a dot
    var target = this.$(this.prefix+zoneId);
    if (!target) { return }
    var zoneInfo = this.zoneInfoDict[zoneId];

    this.log("start look zone "+zoneId+' height='+target.offsetHeight,'gray');

    var cntFull = 0;
    /* doplnim dot a pocitani do cookie */
    var dotTxt = '';
    for (i=0;i<zoneInfo.useBannerList.length;i++) {
        var ban = zoneInfo.useBannerList[i];
        var bannerId = ban.id;
        var place = this.$('place-'+zoneId+'-'+bannerId);
        var emptyPlace = 0;
        if (!place) {
            this.log('No place: zone='+zoneId+' banner='+bannerId, 'red');
        }
        var testing = place; // u slozitejsich js (opera, ie) jsou data mimo place
        if (zoneInfo.useBannerList.length==1) { testing = target; }
        if (!testing || testing.offsetHeight<14 || testing.innerHTML=='') {
            emptyPlace = 1;
        }

        if (emptyPlace==0) {
            cntFull++;
            var domain = this.hostLevel2(location.hostname);
            if (ban.maxShow) {
                var key = this.cookBanShow+bannerId;
                this.createCookie(key, Number(this.readCookie(key))+1, this.cookExpire, domain);
            }
            if (ban.showInterval) {
                var key = this.cookBanInterval+bannerId;
                this.createCookie(key, 1, ban.showInterval, domain);
            }
            this.link(place, zoneId, bannerId);
        }
        dotTxt += '<img src="'+this.urlDot+'?banId='+bannerId+'&zoneId='+zoneId+'&empty='+emptyPlace+'&click='+ban.click+'&err='+ban.err+'&rand='+Math.random()+'" style="position:absolute;width:1px;height:1px;top:-100px;left:-100px;">';
        this.log("dot: "+zoneId+' bannerId='+bannerId+' empty='+emptyPlace+' click='+ban.click+' err='+ban.err);
    }
    if (zoneInfo.useBannerList.length==0) {
        dotTxt += '<img src="'+this.urlDot+'?banId=0&zoneId='+zoneId+'&empty=1&click=0&err=0&rand='+Math.random()+'" style="position:absolute;width:1px;height:1px;top:-100px;left:-100px;">';
        this.log("dot: "+zoneId+' bannerId=0 empty=1 click=0 err=0 (no banners)');
    }


    var dot = document.createElement('div');
    dot.className = 'dotzone';
    dot.id = 'dotzone'+zoneId;
    dot.innerHTML = dotTxt;
    target.appendChild(dot);

    /* nadpis */
    if (cntFull==0) {
        if (this.className && target.className) {
            target.className = target.className.replace(this.className,'');
        }
    }
    else {
        if (this.className && target.className.indexOf(this.className) == -1) {
            target.className += ' '+this.className;
        }
    }

    /* fake mode */
    if (cntFull==0) {
        if (this.fake) {
            this.log("Fake empty "+zoneId,"gray");
            var msg = "Fake mode: prazdna";
            if (typeof this.fake == 'string') {
                msg = this.fake;
            }
            var div = document.createElement('div')
            if (this.fake=='flash') {
                div.innerHTML = this.fakeFlash;
            }
            else {
                div.innerHTML = '<div class="zonefake"><br><br>'+msg+'<br><small>(zona '+zoneId+')</small></div>';
            }
            target.appendChild( div );
            target.className = this.className;
        }
    }


}
ZONE.link = function(banElem, zoneId, bannerId) {
    /* proklik - pokud uz neni hlidany */
    if (!this.urlClick || this.useClick==0) {
        return
    }
    /* a href */
    var els = banElem.getElementsByTagName('a');
    for (x=0; x<els.length; x++) {
        var el = els[x];
        if (el.href.indexOf(this.urlClick) == -1) {
            this.log("href: zone="+zoneId+" ban="+bannerId+" "+el.href)
            el.href = this.urlClick+'?zoneId='+zoneId+'&bannerId='+bannerId+'&url='+encodeURIComponent(el.href);
            this.zoneInfoDict[zoneId].bannerDict[bannerId].click = 'href';
        }
        else {
            this.zoneInfoDict[zoneId].bannerDict[bannerId].click = 'href-inline';       // uz je presmerovani v kodu banneru
        }
    }
    /* flash - clickthru, clickTag */
    // pres innerHTML (pres atriguty nefungovalo spravne v IE
    var re_flash = /(clickthru|clickTag)=([^\&\"]+)/ig;      // "
    this.tmp_zoneId = zoneId
    this.tmp_bannerId = bannerId

    data = banElem.innerHTML
    if (data.indexOf('object')>-1 || data.indexOf('embed')>-1) {
        banElem.innerHTML = data.replace(re_flash, ZONE.flashReplace)
    }
}
ZONE.flashReplace = function(m) {
    var aa = m.split('=');
    if (aa[1].indexOf(ZONE.urlClick) == -1) {
        ZONE.log("flash: zone="+ZONE.tmp_zoneId+" ban="+ZONE.tmp_bannerId+" "+m)
        var ret = aa[0]+'='+encodeURIComponent(ZONE.urlClick+'?zoneId='+ZONE.tmp_zoneId+'&bannerId='+ZONE.tmp_bannerId+'&url='+encodeURIComponent(aa[1]));
        ZONE.zoneInfoDict[ZONE.tmp_zoneId].bannerDict[ZONE.tmp_bannerId].click = 'flash';
    }
    else {
        ZONE.zoneInfoDict[ZONE.tmp_zoneId].bannerDict[ZONE.tmp_bannerId].click = 'flash-inline'; // presmerovani clickthru je uz v banneru
        var ret = m;
    }
    return ret
}

/* reload */
ZONE.write = function(data) {
    /* fake za document.write(), this nelze pouzit */

    var target = ZONE.writeTarget;
    ZONE.log('write '+target.id);

    var node = document.createElement('span');
    node.innerHTML = '&nbsp;'+data+'&nbsp;';
    //alert(data);
    //var target = ZONE.$(ZONE.prefix+ZONE.zoneId);
    var scriptList = node.getElementsByTagName('script');
    target.innerHTML += data;
    for (var i=0; i<scriptList.length; i++) {
        var newScript = document.createElement('script');
        var s = scriptList[i];
        //if (s.id == 'skip') { /*s.parentNode.removeChild(s);*/ continue }
        newScript.type = "text/javascript";
        newScript.language = "javascript";
        //newScript.id = 'skip';
        if (s.charset) {
            newScript.charset = s.charset;
        }
        if (s.src) {
            ZONE.log("script src="+s.src);
            newScript.src  = s.src;
            //alert("src="+s.src)
        }
        else if(s.text) {
            ZONE.log("script inline");
            newScript.text = s.text;
        }
        if(s.src) {
            ZONE.head.appendChild(newScript);
        }
        else {
            target.appendChild(newScript);
        }
    }
    //target.innerHTML += node.innerHTML;
}
ZONE.reload = function(zoneId) {
    /* vzhledem k asynchnosti dotahovanych JS nelze pouzit na vic jak jednu reklamu v jeden okamzik !!! */
    this.log("Reload "+zoneId, 'gray');
    bannerList = this.zoneInfoDict[zoneId].bannerList;
    control = this.zoneInfoDict[zoneId].control;
    var dw = document.write;
    document.write = this.write; //function(data) { alert(data) }
    if (bannerList) {
        var target = this.$(this.prefix+zoneId);
        if (!target) { return }
        target.innerHTML = '';
        //this.zoneId = zoneId;
        this.writeTarget = target;
        this.chooseBanner(zoneId,bannerList,control);
    }
    setTimeout("ZONE.look('"+zoneId+"');",500); // nutne kvuli async js
    //document.write = dw;
    //this.look(zoneId)
}
ZONE.reloadElem = function(name,data) {
    /* bez 'data' prakticky nepouzitelne */
    this.log("Reload elem "+name, 'gray');
    var target = this.$(name);
    if (!target) { return }
    if (!data) { data = target.innerHTML; }
    this.writeTarget = target;
    target.innerHTML = '';
    document.write = this.write; //function(data) { alert(data) }
    document.write(data);
}

/* cookie a domeny */
ZONE.hostLevel2 = function(hostname) {
    /* z domeny udela jen level2 domenu napr .tiscali.cz */
    if (/^(\d{1,3}\.){3}\d{1,3}$/.test(hostname)) {
         return hostname;
    }
    else {
        var arr = hostname.split('.');
        return "."+arr[arr.length-2]+"."+arr[arr.length-1];
    }
}
ZONE.createCookie = function(name,value,expire,domain) {
    var txt = name+"="+value+"; path=/;";
    if (expire) {
        var date = new Date();
        //date.setTime(date.getTime()+(days*24*60*60*1000));
        date.setTime(date.getTime()+(expire*1000));
        txt += "; expires="+date.toGMTString();
    }
    if (domain) {
        txt += "domain="+domain+";";
    }
    document.cookie = txt;
}
ZONE.readCookie = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
ZONE.eraseCookie = function(name) {
    createCookie(name,"",-1);
}
/* John Resig events */
ZONE.addEvent = function(obj, type, fn) {
    if (obj.addEventListener)
        obj.addEventListener( type, fn, false );
    else if (obj.attachEvent) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
        obj.attachEvent( "on"+type, obj[type+fn] );
    }
}
ZONE.removeEvent = function(obj, type, fn) {
    if (obj.removeEventListener)
        obj.removeEventListener( type, fn, false );
    else if (obj.detachEvent) {
        obj.detachEvent( "on"+type, obj[type+fn] );
        obj[type+fn] = null;
        obj["e"+type+fn] = null;
    }
}
/* end */
ZONE.DOMReady = function(f){
  if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)){ // Feeling dirty yet?
    document.addEventListener("DOMContentLoaded", f, false);
  }
  else {
    window.setTimeout(f,0);
  }
}
/* string addon - only for ZONE */
ZONE.trim = function(txt) { return (txt.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, "")) }
ZONE.endswith = function(txt,str) { return (txt.match(str+"$")==str) }
ZONE.startswith = function(txt,str) { return (txt.match("^"+str)==str) }

ZONE.init();
