// JS functionality for back button [bardzs]

window.dhtmlHistory.create({
//	debugMode: true ,//set this to false, or just don't pass in an options bundle, to see real-world, non-debug conditions 
	toJSON: function(o) {
		return serialize(o);    //return JSON.stringify(o);
	}
	, fromJSON: function(s) {
	    var tmp = _unserialize(s);       //return JSON.parse(s);
		return tmp[0];
	}
});

window.onload = function() {
	dhtmlHistory.initialize();  	//initialize our DHTML history
	dhtmlHistory.addListener(historyChange);
};

function historyChange(newLocation, historyData, wer) {
	var historyMsg = (typeof historyData == "object" && historyData != null ? historyStorage.toJSON(historyData) : historyData);
	if(newLocation == '' && historyMsg == null){
	    init('force');
	} else {
	    if(historyMsg && typeof(historyMsg) != 'object') {
	        historyMsg = _unserialize(historyMsg);
	        historyMsg = historyMsg[0];
//	        try {eval('historyMsg = ' + historyMsg);}catch(e){}     // this vas used for JSON
	    }
	    if(typeof(historyMsg) == 'object')
    	    dhtmlHistory['currentLocationData'] = historyMsg;
	    updateFromHistory();
	}
};

function updateFromHistory() {  //update page content on back or refresh
    if(dhtmlHistory['currentLocationData'] && typeof(dhtmlHistory['currentLocationData']) == 'object') {
        for(cnt in dhtmlHistory['currentLocationData']['data']) { //restore current state var "initState" from history in case of refresh or if coming back from other page.
            if(!dhtmlHistory['initState'][cnt]) { //use serialize unserialize to brak reference
                tmpdata = _unserialize(serialize(dhtmlHistory['currentLocationData']['data'][cnt]));
                tmpdata = tmpdata[0];
                tmpdata['page'] = 0;
                dhtmlHistory['initState'][cnt] =  tmpdata;
            }
        }
        for(p in dhtmlHistory['currentLocationData']['data']) {
            if(dhtmlHistory['currentLocationData']['data'][p]['page'] != dhtmlHistory['initState'][p]['page'] && dhtmlHistory['initState'][p]['page']) {
                data = null;
                if(dhtmlHistory['currentLocationData']['data'][p]['data'])
                    data = dhtmlHistory['currentLocationData']['data'][p]['data'];
                else
                    data = {0:p, 
                            1:{ type:dhtmlHistory['initState'][p]['data'][1]['type'],
                                perpage:dhtmlHistory['initState'][p]['data'][1]['perpage'],
                                sort:dhtmlHistory['initState'][p]['data'][1]['sort'],
                                page:dhtmlHistory['currentLocationData']['data'][p]['page']},
                            2:dhtmlHistory['initState'][p]['data'][2]};
                if(typeof(data) == 'object') {
                    //update curent state;
                    data = _unserialize(serialize(data));
                    data = data[0];
                    dhtmlHistory['initState'][p]['page'] = data[1]['page'];
                    dhtmlHistory['initState'][p]['data'] = data;
                    LoadContent(data[0], data[1], data[2]);
                }
            }
            if(dhtmlHistory['initState'][p]['page'] == 0) {
                if(dhtmlHistory['initState'][p]['data']) {
                    LoadContent(
                        dhtmlHistory['initState'][p]['data'][0], 
                        dhtmlHistory['initState'][p]['data'][1], 
                        dhtmlHistory['initState'][p]['data'][2]);
                    dhtmlHistory['initState'][p]['page'] = dhtmlHistory['initState'][p]['data'][1]['page'];
                } else
                    dhtmlHistory['initState'][p]['page'] = 1;
            }
        }
    }
}

function addHistory(key, data) {
    dhtmlHistory['initState'][data[0]]['page'] = data[1]['page'];
    dhtmlHistory['initState'][data[0]]['data'] = data;
    var tmpData = serialize(dhtmlHistory['initState']);     //to brak reference
    tmpData = _unserialize(tmpData);
    dhtmlHistory.add(key, {key:data[0], data:tmpData[0]});
    return;
}

function _unserialize(input) {
    type = input.charAt(0);
    input = input.substring(2);
    switch(type) {
        case 'a':
                lenght = Number(input.substr(0, input.indexOf(':')));
                input  = input.substr(String(lenght).length + 2);
                var arr = new Array();
                var key = null;
                var value = null;
                for (var i = 0; i < lenght; ++i) {
                    key = _unserialize(input);
                    input = key[1];
                    value = _unserialize(input);
                    input = value[1];
                    arr[key[0]] = value[0];
                }
                return new Array(arr, input.substr(1));
            break;
        case 's':
            var lenght = Number(input.substr(0, input.indexOf(':')));
            var val = String(input.substr(String(lenght).length + 2, lenght));
            input = input.substr(String(lenght).length + 4 + lenght);
            return new Array(val, input);
            break;
        case 'i':
        case 'd':
            var val = Number(input.substr(0, input.indexOf(';')));
            input = input.substr(input.indexOf(';') + 1);
            return new Array(val, input);
            break;
        case 'b':
            return new Array((input.substr(0, 1) == 1), input.substr(2));
            break;
        case 'N':
            return new Array(null, input);
            break;
    }
}
function serialize(x){function sN(x){return((parseInt(x)==x)&&(x<2147483648)?'i':'d')+':'+x+';'}function sS(x){if(!UTF)x=escape(x);return 's:'+(UTF?utf8len(x):x.length)+':"'+x+'";'}function sB(x){return 'b:'+(x?1:0)+';'}function sO(x){var a=[];for(var i in x)if('function'!=typeof(x[i]))a[a.length]=sX(i.toString().match(/^\d+$/)?parseInt(i):i)+sX(x[i]);return 'a:'+a.length+':{'+a.join('')+'}'}function sX(x){if(x==null)return 'N;';switch(typeof(x)){case 'string':return sS(x);case 'number':return sN(x);case 'boolean':return sB(x);case 'object':return sO(x)}}return sX(x)}
var UTF=1;
function utf8len(s){var l=0,c;for(var i=0;i<s.length;i++){c=s.charCodeAt(i);if(c<128)l++;else if(c<2048)l+=2;else l+=3;}return l;}
