
/*
 $Id: cross.js 9862 2011-12-08 11:03:30Z bizi $

 ticket session forwarding
 <!--- slouzi pro presmerovani mezi domenami, doplni se domeny podle configu --->
*/



var CROSS = {
    version     : '0.0.2',
    classYes    : 'cross',
    classNo     : ['nocross'],
    mode        : 'marked',       // marked,all
    sharedDomain: ['osobnosti.cz','hudebniskupiny.cz','financnici.cz','panovnici.cz','spisovatele.cz','atlasrostlin.cz'], // jeden ticket pro vice subdomen (session se sdili v teto globalni domene!)
    head        : document.getElementsByTagName('head')[0],
    lockGo      : 0,
    debugDiv    : null,
    debugList   : [],
    debug       : 0,
    session     : 'session',
    timeStart   : null,
    '':''
}
CROSS.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;
}
CROSS.log = function(txt,color) {
    if (this.debug!=1) {
        this.debugList.push({txt:txt,color:color}) // pokud netisknu, tak jen skladuju
        return;
    }
    var line = document.createElement('li');
    if(color) {
        line.style.color = color;
    }
    line.innerHTML = txt;
    line.className = 'dbglog';
    this.debugDiv.appendChild(line);
    this.debugDiv.scrollTop = this.debugDiv.scrollHeight;
}
CROSS.startDebug = function() {
    var body = document.getElementsByTagName('body')[0];
    if (this.debug==1 && this.debugDiv==null) {
        var div = document.createElement('ul');
        div.id = 'dbglog';
        var prvni = body.childNodes[0];
        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';
        }
    }
}

//addEvent = function(obj, evType, fn) {
//    //if (obj.addEventListener) { obj.addEventListener(evType, fn, false); return true; }
//    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }
//    else if (obj.attachEvent) { var r = obj.attachEvent("on"+evType, fn); return r; }
//    return false;
//}
CROSS.setMode = function(mode) {
    this.mode = mode
    this.log('setMode: '+mode)
}
CROSS.setClassYes = function(name) {
    this.log('set classYes: '+name)
    this.classYes = name
}
CROSS.addClassNo = function(name) {
    this.log('add classNo: '+name)
    this.classNo.push( name )
}
CROSS.setDebug = function(debug) {
    this.log('set debug: '+debug)
    this.debug = debug;
    this.startDebug();
}
CROSS.init = function() {
    /* vlozi styly */
    this.log('init');
    var el = document.createElement('style');
    var txt = "#dbglog { z-index:100; text-align:left; margin:0!important; padding:2px; border: 1px solid red; position: absolute; " +
              "top:0; right: 0; background: #fff; color:#000; max-height: 60%; _height: 300px; min-height: 100px; overflow: auto; width:320px; font-size: 11px; font-family: sans-serif; }"+
              "li.dbglog { margin:0!important; padding:0!important; line-height: 12px; list-style: inside decimal; } " +
              "#dbglog a { color: blue; } ";
    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);

}
CROSS.go = function(options) {

    this.log('=== start: ver='+this.version+' ===')
    if (this.lockGo) {
        this.log('end: locked')
        return
    }

    this.init()
    if(typeof options=='undefined') {
        options = {}
    }

    if (options.mode) { this.setMode(options.mode); }
    if (options.addClassNo) { this.addClassNo( options.addClassNo ); }
    if (options.debug!=undefined) { this.setDebug( options.debug ); }

    this.lockGo = 1
    if (this.readCookie(this.session)==null) {
        this.log('end: empty session cookie')
        return
    }


    if (!this.timeStart) { this.timeStart = new Date().getTime()/1000; }


    this.log('mode: '+this.mode)

    //this.sharedDomain.length--
    //this.domain.length--

    if (this.mode=='all') {
        /* najde vse co neni 'a' a ma class ktery se nema delat */
        var elems = []
        var aa = document.getElementsByTagName('*');
        for (i=0;i<aa.length;i++) {
            elems.push( aa[i] )
        }
        this.log('elems cnt='+elems.length)
        for (i=0;i<elems.length;i++) {
            var elem = elems[i]
            if(elem.id=='dbglog') { continue }
            if(elem.className=='dbglog') { continue }
            //this.log('elem '+i+' '+elem.tagName)
            if(elem.tagName.toLowerCase()=='a') { continue }


            //continue

            var skip = 0
            /* zjistim, ze ma zakazany class */
            for (ii=0; ii<this.classNo.length;ii++) {
                var className = this.classNo[ii]
                if (elem.className && (' '+elem.className+' ').indexOf(' '+className+' ') > -1) {
                    this.log('skip block: '+className+' '+elem.tagName)
                    skip = 1
                    break
                }
            }
            if (skip) {
                var elems2 = elem.getElementsByTagName('a');
                for (i2=0;i2<elems2.length;i2++) {
                    elem2 = elems2[i2]
                    if (elem2.className && (' '+elem2.className+' ').indexOf(' '+this.classYes+' ') == -1) {
                        continue
                    }
                    elem2.className += ' '+this.classNo[0];
                    this.log('skip link in block: add '+className+' to '+elem2.href)
                }
            }
        }
    }

    var elems = document.getElementsByTagName('a');
    for (i=0;i<elems.length;i++) {
        var elem = elems[i]
        var proto = (elem.href || '').split(':')[0]
        if (proto!='http' && proto!='https') {
            this.log('wrong proto: '+elem.href)
            continue
        }
        if (this.mode=='all') {
            /* vse az na oznacene vyjimky */
            var skip = 0
            for (ii in this.classNo) {
                var className = this.classNo[ii]
                if (elem.className && (' '+elem.className+' ').indexOf(' '+className+' ') > -1) {
                    this.log('skip: '+className+': '+elem.href)
                    skip = 1
                    break
                }
            }
            if (skip) {
                continue;
            }
        }
        else {
            /* jen oznacene */
            if (!elem.className || (' '+elem.className+' ').indexOf(' '+this.classYes+' ') == -1) {
                this.log('skip: missing class yes: '+elem.href)
                continue
            }
        }
        this.log('add event: '+elem.tagName+' class=' +elem.className+' id='+elem.id);
        //this.addEvent(elem, 'mousedown', function(){alert(this.href)})
        elem.onmousedown=function(){CROSS.addTicket(this)}
    }
    var runTime = (new Date().getTime()/1000) - this.timeStart;
    this.log("Runtime: "+runTime+" sec");

}
CROSS.addTicket = function(el) {
    /* onclick */

    if (!el.href) { return }
    var hostname_port = el.href.split('/')[2]
    //alert(hostname_port+' '+document.location.host)
    if (hostname_port == document.location.host) {
        this.log('same domain: '+el.href);
        return
    }
    var hostname = hostname_port.split(':')[0]
    if (hostname.split('.')[0]=='ticket') {
        this.log('ticket exist: '+el.href);
        return
    }
    var ticketserver = "ticket."+location.hostname

    for (i in this.shareDomain) {
        var domain = this.shareDomain[i];
        if (location.hostname.match(domain+"$")==domain) {
            ticketserver = "ticket."+domain;
            break;
        }
    }
    this.log('add ticket '+ticketserver+' for='+el.href)
    el.href = "http://"+ticketserver+"/set?url="+escape(el.href)
}
function DOMReady(f){
  if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)){ // Feeling dirty yet?
    document.addEventListener("DOMContentLoaded", f, false);
  }  else {
    window.setTimeout(f,0);
  }
}
DOMReady( function() { CROSS.go() } )

