var registeredPortlets = {};
var serverBaseName = getServerNameBase();

var working = 0;
var lastAjaxHash = '';

var debugText = '';

function getServerNameBase()
{
    var ret = window.location.href;
    var i = ret.indexOf('://');
    if (i >= 0)
    {
        ret = ret.substring(i + 3);
    }
    i = ret.indexOf('/');
    if (i >= 0)
    {
        rest = ret.substring(i + 1);
        ret = ret.substring(0, i);
        i = rest.indexOf('/');
        if (i >= 0)
        {
            rest = rest.substring(0, i);
        }
    }
    if (rest == 'redakcja')
        rest = 'pl';
    return ret + '/' + rest + '/';
}

function createRequestObject() 
{
    var ret;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ret = new ActiveXObject("Microsoft.XMLHTTP");
        //alert('ok');
    }else{
        ret = new XMLHttpRequest();
    }
    return ret;
}

function doAjax(url, handler)
{
    var client = createRequestObject();
    var handler2 = function() {     
        if(client.readyState == 4)
        {
          if(client.status == 200)
          {
            handler(client.responseText);
          }
        }
    }
    client.onreadystatechange = handler2;
//    alert('o1');
//niestety nie dziala w IE:
//    client.overrideMimeType('text/html; charset=ISO-8859-2');
//    alert('o2');
    client.open("GET", url);
    client.send(null);
}

function replaceAjaxPanel(divID, url)
{
    working += 1;
    showElement('waitMessage');

    handler = function(response) {
//        alert('status: ' + divID + ' - ' + + response);
        working -= 1;
        if (working <= 0)
        {
            hideElement('waitMessage');
        }
        replaceElementHTML(divID, cutBody(response));
    }
    doAjax(url, handler);
    return 1;
}

function cutBody(html)
{
    var ret = html;
    var i1 = ret.indexOf('<body>');
    var i2 = ret.indexOf('</body>');
    ret = html.substring(i1 + 6, i2);
    return ret;
}

function replaceElementHTML(divID, html)
{
    var element = document.getElementById(divID);
    element.innerHTML = html;
}

function changePortlet(portletIID, paramDict, cacheType)
{
    if (working > 0)
    {
        //nie robimy tylu zmian na raz
        return 0;
    }

    var portlet = registeredPortlets[portletIID];
//    portlet[2] = cacheType;
    registeredPortlets[portletIID] = portlet;
//    updatePageHashDict(paramDict);
    var oldDict = urlToDict(dhtmlHistory.getCurrentLocation());
    var newDict = updateDict(oldDict, paramDict);
    var newLocation = dictToUrl(newDict);
    simpleDebug('newLocation=' + desc(newLocation));
    dhtmlHistory.add(newLocation, '');
    newPageHash = newLocation;
//    doChangePortlet(portletIID, paramDict);
}

function doChangePortlet(portletIID, paramDict)
{
    simpleDebug('Line: 1: ' + desc(portletIID));
    var portlet = registeredPortlets[portletIID];
    simpleDebug('Line: 2: ' + desc(portlet));
    var portletID = portlet[0];
    simpleDebug('Line: 3');
    var portletParams = portlet[1];
    simpleDebug('Line: 4');
    var cacheType = portlet[2];
    simpleDebug('Line: 5');

    var portletUrl = 'http://' + serverBaseName + 'portlet2/cache_' + cacheType + '/ajax_html';

//    alert('pp=' + portletParams)

    var url = portletUrl + '?portletIID=' + portletIID + '&portletID=' + portletID;

    for (k in paramDict)
    {
        url += '&' + encodeURIComponent(k) + '=' + encodeURIComponent(paramDict[k]);
    }
    for (k in portletParams)
    {
        url += '&portlet_' + portletIID + '_' + encodeURIComponent(k) + '=' + encodeURIComponent(portletParams[k]);
    }
    simpleDebug('changing now: ' + url);
    replaceAjaxPanel('portlet_' + portletIID, url);
}

function registerPortlet(portletIID, portletID, parametersDict, cacheType)
{
    simpleDebug('Registering portlet for ' + desc(portletIID));
    registeredPortlets[portletIID] = [portletID, parametersDict, cacheType];
}


function showElement(elemID)
{
    var elem = document.getElementById(elemID);
    elem.className = '';
}

function hideElement(elemID)
{
    var elem = document.getElementById(elemID);
    elem.className = 'hidden';
}

var newPageHash = '';

function fragmentsUploader()
{
//    simpleDebug('fragmentsUploader!');
    var newHash = newPageHash;
    var oldHash = lastAjaxHash;
    newPageHash = null;
    //oldPageHash = null;
    if (newHash == null)
    {
        return;
    }
    doChangePageFragments(newHash, oldHash);
    lastAjaxHash = newHash;
}

setInterval('fragmentsUploader()', 100);

function doChangePageFragments(newHash, oldHash)
{
    simpleDebug('do change!');
    var oldDict = urlToDict(oldHash);
    var newDict = urlToDict(newHash);
    var dirtyPortlets = new Array();
    for (var portletIID in registeredPortlets)
    {
        var prefix = 'portlet_' + portletIID + '_';
        var params = new Array();
        var dirty = 0;
        for (key in newDict)
        {
            if ((key.indexOf(prefix) == 0) && (newDict[key] != oldDict[key]))
            {
                params[key] = newDict[key];
                dirty = 1;
                simpleDebug('newV for: ' + key + ' = ' + desc(newDict[key]));
            }
        }
        for (key in oldDict)
        {
            if ((key.indexOf(prefix) == 0) && (newDict[key] != oldDict[key]))
            {
                dirty = 1;
                simpleDebug('no newV for: ' + key);
            }
        }
        if (dirty)
        {
            simpleDebug('dirty: ' + portletIID);
            dirtyPortlets[portletIID] = params;
        }
    }
    for (var portletIID in dirtyPortlets)
    {
        simpleDebug('change:' + portletIID);
        doChangePortlet('' + portletIID, dirtyPortlets[portletIID]);
    }
}

//debug

function simpleDebug(text)
{
    var elem = document.getElementById('simpleDebug');
    debugText += '<br/>\n' + text;
    if (elem != undefined)
    {
//        alert('elem ' + desc(elem));
        elem.innerHTML += debugText;
        debugText = '';
    }
}

function desc(v)
{
    var ret = 'type: ' + getType(v);
    try {
       return ret + ' toSource: ' + v.toSource();
    } catch (e)
    {} 
    try {
       return ret + ' toString: ' + v.toString();
    } catch (e)
    {} 
    try {
       return ret + ' string: ' + v;
    } catch (e)
    {} 
    return ret + ' ?';
}

function getType(x)
{
    return (typeof x);
}

//RSH initialization

window.dhtmlHistory.create({
        toJSON: function(o) {
//                return Object.toJSON(o);
            return "x";
        }
        , fromJSON: function(s) {
            return "y";
//                return s.evalJSON();
        }
});

var rshListener = function(newLocation, historyData) {
    newPageHash = newLocation;
//    simpleDebug('GO!');
}

window.onload = function() {
        dhtmlHistory.initialize();
        dhtmlHistory.addListener(rshListener);
        newPageHash = dhtmlHistory.getCurrentLocation();
};


