/* Tree Handling Support JS function library */
/* Taranis Series II */

function createRequestObject()
{
	var request_;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer")
	{
		request_ = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		request_ = new XMLHttpRequest();
	}
	return request_;
}

var http = createRequestObject();

function getInfo(itemCode)
{
	http.open('get', 'gettree?id=' + itemCode);
	http.onreadystatechange = handleInfo;
	http.send(null);
}

function handleInfo(itemCode)
{
	if(http.readyState == 4)
	{
		var response = http.responseText;
		//document.getElementById('my_div').innerHTML = response;
		alert(response);
	}
}

function clickBranch(branchID)
{
	branchRef = document.getElementById(branchID);
	if (branchRef)
	{
		if (branchRef.style.display == 'none')
		{
			branchRef.style.display = 'block';
		}
		else
		{
			branchRef.style.display = 'none';
		}
	}
}

function openBranchNode(branchRef)
{
	branchRef.style.display = 'block';
}

function closeBranchNode(branchRef)
{
	branchRef.style.display = 'none';
}


function initTree(treePrefix)
{
	rootBranchID = treePrefix + "0";

	rootObj = document.getElementById(rootBranchID);
	if (rootObj)
	{
		closeBranch(rootObj);
	}
}

function closeBranch(objRef)
{
	for(var i = 0; i < objRef.childNodes.length; i++)
	{
		var lastItem = objRef.childNodes[i].lastChild;

		if (lastItem.nodeName == 'UL')
		{
			closeBranch(lastItem);
			closeBranchNode(lastItem);
		}
	}
}

function showBranch(objID)
{
	var objRef = document.getElementById(objID);
	if (objRef)
	{
		do
		{
			openBranchNode(objRef);
			objRef = objRef.parentNode.parentNode;
		}
		while (objRef.nodeName == 'UL');
	}
}

var LoadingScreen = {

	show: function() {
		// Create Loading div
		this.create_div();

		// Set initial position				
		this.set_position();

		// Attach event handler to onScroll to keep in position
		this.addEventHandler(window, 'scroll', this.set_position);

		// Start the moving dots
		setInterval(this.moving_dots, 500);

	},

	hide: function() {
		var div = document.getElementById('loading_message');
		if (div == null || div == '' || typeof(div) != 'object') { return false; }

		document.body.removeChild(div);
	},

	moving_dots: function() {
		var div = document.getElementById('loading_message');
		if (div == null || div == '' || typeof(div) != 'object') { return false; }

		var html = div.innerHTML;

		// Add dot or start over?
		var num_dots = html.split('.').length-1;
		if (num_dots > 4) {
			div.innerHTML = 'Betöltés';
		} else {
			div.innerHTML = html + '.';
		}

	},


	set_position: function () {
		var div = document.getElementById('loading_message');
		if (div == null || div == '' || typeof(div) != 'object') { return false; }

		var scrollTop = LoadingScreen.f_scrollTop();
		var scrollLeft = LoadingScreen.f_scrollLeft();
		var clientWidth = LoadingScreen.f_clientWidth();

		// Calculate left position
		var left = clientWidth - div.offsetWidth;
		left = scrollLeft + left;
			
		// Set position
		div.style.position = 'absolute';
		div.style.left = left + 'px';
		div.style.top = scrollTop + 'px';
	},

	create_div: function () {
		var div = document.createElement('DIV');
		div.id = 'loading_message';

		div.innerHTML = 'Betöltés';

		var css = "border: 1px solid black;"
		css += "width: 100px;";
		css += "padding: 10px;";
		css += "background-color: #EFEFEF;";
		css += "color: red;";
		css += "font-weight: bold;";

		div.style.cssText = css;

		document.body.appendChild(div);

		return div;
	},

	f_clientWidth: function () {
		return this.f_filterResults (
			window.innerWidth ? window.innerWidth : 0,
			document.documentElement ? document.documentElement.clientWidth : 0,
			document.body ? document.body.clientWidth : 0
		);
	},

	f_scrollLeft: function () {
		return this.f_filterResults (
			window.pageXOffset ? window.pageXOffset : 0,
			document.documentElement ? document.documentElement.scrollLeft : 0,
			document.body ? document.body.scrollLeft : 0
		);
	},

	f_scrollTop: function () {
		return this.f_filterResults (
			window.pageYOffset ? window.pageYOffset : 0,
			document.documentElement ? document.documentElement.scrollTop : 0,
			document.body ? document.body.scrollTop : 0
		);
	},

	f_filterResults: function (n_win, n_docel, n_body) {
		var n_result = n_win ? n_win : 0;
		if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
		return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
	},

	addEventHandler: function (oTarget, sEventType, fnHandler) {
		if (oTarget.addEventListener) {
			oTarget.addEventListener(sEventType, fnHandler, false);
		} else if (oTarget.attachEvent) {
			oTarget.attachEvent("on" + sEventType, fnHandler);
		} else {
			oTarget["on" + sEventType] = fnHandler;
		} 
	}

}

function utf16to8(str) {
    var out, i, j, len, c, c2;
    out = [];
    len = str.length;
    for (i = 0, j = 0; i < len; i++, j++) {
        c = str.charCodeAt(i);
        if (c <= 0x7f) {
            out[j] = str.charAt(i);
        }
        else if (c <= 0x7ff) {
            out[j] = String.fromCharCode(0xc0 | (c >>> 6),
                                         0x80 | (c & 0x3f));
        }
        else if (c < 0xd800 || c > 0xdfff) {
            out[j] = String.fromCharCode(0xe0 | (c >>> 12),
                                         0x80 | ((c >>> 6) & 0x3f),
                                         0x80 | (c & 0x3f));
        }
        else {
            if (++i < len) {
                c2 = str.charCodeAt(i);
                if (c <= 0xdbff && 0xdc00 <= c2 && c2 <= 0xdfff) {
                    c = ((c & 0x03ff) << 10 | (c2 & 0x03ff)) + 0x010000;
                    if (0x010000 <= c && c <= 0x10ffff) {
                        out[j] = String.fromCharCode(0xf0 | ((c >>> 18) & 0x3f),
                                                     0x80 | ((c >>> 12) & 0x3f),
                                                     0x80 | ((c >>> 6) & 0x3f),
                                                     0x80 | (c & 0x3f));
                    }
                    else {
                       out[j] = '?';
                    }
                }
                else {
                    i--;
                    out[j] = '?';
                }
            }
            else {
                i--;
                out[j] = '?';
            }
        }
    }
    return out.join('');
}

function utf8to16(str) {
    var out, i, j, len, c, c2, c3, c4, s;

    out = [];
    len = str.length;
    i = j = 0;
    while (i < len) {
        c = str.charCodeAt(i++);
        switch (c >> 4) { 
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
            // 0xxx xxxx
            out[j++] = str.charAt(i - 1);
            break;
            case 12: case 13:
            // 110x xxxx   10xx xxxx
            c2 = str.charCodeAt(i++);
            out[j++] = String.fromCharCode(((c  & 0x1f) << 6) |
                                            (c2 & 0x3f));
            break;
            case 14:
            // 1110 xxxx  10xx xxxx  10xx xxxx
            c2 = str.charCodeAt(i++);
            c3 = str.charCodeAt(i++);
            out[j++] = String.fromCharCode(((c  & 0x0f) << 12) |
                                           ((c2 & 0x3f) <<  6) |
                                            (c3 & 0x3f));
            break;
            case 15:
            switch (c & 0xf) {
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                // 1111 0xxx  10xx xxxx  10xx xxxx  10xx xxxx
                c2 = str.charCodeAt(i++);
                c3 = str.charCodeAt(i++);
                c4 = str.charCodeAt(i++);
                s = ((c  & 0x07) << 18) |
                    ((c2 & 0x3f) << 12) |
                    ((c3 & 0x3f) <<  6) |
                     (c4 & 0x3f) - 0x10000;
                if (0 <= s && s <= 0xfffff) {
                    out[j] = String.fromCharCode(((s >>> 10) & 0x03ff) | 0xd800,
                                                  (s         & 0x03ff) | 0xdc00);
                }
                else {
                    out[j] = '?';
                }
                break;
                case 8: case 9: case 10: case 11:
                // 1111 10xx  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx
                i+=4;
                out[j] = '?';
                break;
                case 12: case 13:
                // 1111 110x  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx
                i+=5;
                out[j] = '?';
                break;
            }
        }
        j++;
    }
    return out.join('');
}

 function serialize(o) {
     var p = 0, sb = [], ht = [], hv = 1;
     var classname = function(o) {
         if (typeof(o) == "undefined" || typeof(o.constructor) == "undefined") return '';
         var c = o.constructor.toString();
         c = utf16to8(c.substr(0, c.indexOf('(')).replace(/(^\s*function\s*)|(\s*$)/ig, ''));
         return ((c == '') ? 'Object' : c);
     };
     var is_int = function(n) {
         var s = n.toString(), l = s.length;
         if (l > 11) return false;
         for (var i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {
             switch (s.charAt(i)) {
                 case '0':
                 case '1':
                 case '2':
                 case '3':
                 case '4':
                 case '5':
                 case '6':
                 case '7':
                 case '8':
                 case '9': break;
                 default : return false;
             }
         }
         return !(n < -2147483648 || n > 2147483647);
     };
     var in_ht = function(o) {
         for (k in ht) if (ht[k] === o) return k;
         return false;
     };
     var ser_null = function() {
         sb[p++] = 'N;';
     };
     var ser_boolean = function(b) {
         sb[p++] = (b ? 'b:1;' : 'b:0;');
     };
     var ser_integer = function(i) {
         sb[p++] = 'i:' + i + ';';
     };
     var ser_double = function(d) {
         if (isNaN(d)) d = 'NAN';
         else if (d == Number.POSITIVE_INFINITY) d = 'INF';
         else if (d == Number.NEGATIVE_INFINITY) d = '-INF';
         sb[p++] = 'd:' + d + ';';
     };
     var ser_string = function(s) {
         var utf8 = utf16to8(s);
         sb[p++] = 's:' + utf8.length + ':"';
         sb[p++] = utf8;
         sb[p++] = '";';
     };
     var ser_array = function(a) {
         sb[p++] = 'a:';
         var lp = p;
         sb[p++] = 0;
         sb[p++] = ':{';
         for (var k in a) {
             if (typeof(a[k]) != 'function') {
                 is_int(k) ? ser_integer(k) : ser_string(k);
                 __serialize(a[k]);
                 sb[lp]++;
             }
         }
         sb[p++] = '}';
     };
     var ser_object = function(o) {
         var cn = classname(o);
         if (cn == '') ser_null();
         else if (typeof(o.serialize) != 'function') {
             sb[p++] = 'O:' + cn.length + ':"';
             sb[p++] = cn;
             sb[p++] = '":';
             var lp = p;
             sb[p++] = 0;
             sb[p++] = ':{';
             if (typeof(o.__sleep) == 'function') {
                 var a = o.__sleep();
                 for (var kk in a) {
                     ser_string(a[kk]);
                     __serialize(o[a[kk]]);
                     sb[lp]++;
                 }
             }
             else {
                 for (var k in o) {
                     if (typeof(o[k]) != 'function') {
                         ser_string(k);
                         __serialize(o[k]);
                         sb[lp]++;
                     }
                 }
             }
             sb[p++] = '}';
         }
         else {
             var cs = o.serialize();
             sb[p++] = 'C:' + cn.length + ':"';
             sb[p++] = cn;
             sb[p++] = '":' + cs.length + ':{';
             sb[p++] = cs;
             sb[p++] = "}";
         }
     };
     var ser_pointref = function(R) {
         sb[p++] = "R:" + R + ";";
     };
     var ser_ref = function(r) {
         sb[p++] = "r:" + r + ";";
     };
     var __serialize = function(o) {
         if (o == null || o.constructor == Function) {
             hv++;
             ser_null();
         }
         else switch (o.constructor) {
             case Boolean: {
                 hv++;
                 ser_boolean(o);
                 break;
             }
             case Number: {
                 hv++;
                 is_int(o) ? ser_integer(o) : ser_double(o);
                 break;
             }
             case String: {
                 hv++;
                 ser_string(o);
                 break;
             }
 /*@cc_on @*/
 /*@if (@_jscript)
             case VBArray: {
                 o = o.toArray();
             }
 @end @*/
             case Array: {
                 var r = in_ht(o);
                 if (r) {
                     ser_pointref(r);
                 }
                 else {
                     ht[hv++] = o;
                     ser_array(o);
                 }
                 break;
             }
             default: {
                 var r = in_ht(o);
                 if (r) {
                     hv++;
                     ser_ref(r);
                 }
                 else {
                     ht[hv++] = o;
                     ser_object(o);
                 }
                 break;
             }
         }
     };
     __serialize(o);
     return sb.join('');
 }
  
 function unserialize(ss) {
     var p = 0, ht = [], hv = 1; r = null;
     var unser_null = function() {
         p++;
         return null;
     };
     var unser_boolean = function() {
         p++;
         var b = (ss.charAt(p++) == '1');
         p++;
         return b;
     };
     var unser_integer = function() {
         p++;
         var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
         p++;
         return i;
     };
     var unser_double = function() {
         p++;
         var d = ss.substring(p, p = ss.indexOf(';', p));
         switch (d) {
             case 'NAN': d = NaN; break;
             case 'INF': d = Number.POSITIVE_INFINITY; break;
             case '-INF': d = Number.NEGATIVE_INFINITY; break;
             default: d = parseFloat(d);
         }
         p++;
         return d;
     };
     var unser_string = function() {
         p++;
         var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         var s = utf8to16(ss.substring(p, p += l));
         p += 2;
         return s;
     };
     var unser_array = function() {
         p++;
         var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         var a = [];
         ht[hv++] = a;
         for (var i = 0; i < n; i++) {
             var k;
             switch (ss.charAt(p++)) {
                 case 'i': k = unser_integer(); break;
                 case 's': k = unser_string(); break;
                 case 'U': k = unser_unicode_string(); break;
                 default: return false;
             }
             a[k] = __unserialize();
         }
         p++;
         return a;
     };
     var unser_object = function() {
         p++;
         var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         var cn = utf8to16(ss.substring(p, p += l));
         p += 2;
         var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
             eval(['function ', cn, '(){}'].join(''));
         }
         var o = eval(['new ', cn, '()'].join(''));
         ht[hv++] = o;
         for (var i = 0; i < n; i++) {
             var k;
             switch (ss.charAt(p++)) {
                 case 's': k = unser_string(); break;
                 case 'U': k = unser_unicode_string(); break;
                 default: return false;
             }
             if (k.charAt(0) == '\0') {
                 k = k.substring(k.indexOf('\0', 1) + 1, k.length);
             }
             o[k] = __unserialize();
         }
         p++;
         if (typeof(o.__wakeup) == 'function') o.__wakeup();
         return o;
     };
     var unser_custom_object = function() {
         p++;
         var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         var cn = utf8to16(ss.substring(p, p += l));
         p += 2;
         var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
             eval(['function ', cn, '(){}'].join(''));
         }
         var o = eval(['new ', cn, '()'].join(''));
         ht[hv++] = o;
         if (typeof(o.unserialize) != 'function') p += n;
         else o.unserialize(ss.substring(p, p += n));
         p++;
         return o;
     };
     var unser_unicode_string = function() {
         p++;
         var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
         p += 2;
         var sb = [];
         for (var i = 0; i < l; i++) {
             if ((sb[i] = ss.charAt(p++)) == '\\') {
                 sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += 4), 16));
             }
         }
         p += 2;
         return sb.join('');
     };
     var unser_ref = function() {
         p++;
         var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
         p++;
         return ht[r];
     };
     var __unserialize = function() {
         switch (ss.charAt(p++)) {
             case 'N': return ht[hv++] = unser_null();
             case 'b': return ht[hv++] = unser_boolean();
             case 'i': return ht[hv++] = unser_integer();
             case 'd': return ht[hv++] = unser_double();
             case 's': return ht[hv++] = unser_string();
             case 'U': return ht[hv++] = unser_unicode_string();
             case 'r': return ht[hv++] = unser_ref();
             case 'a': return unser_array();
             case 'O': return unser_object();
             case 'C': return unser_custom_object();
             case 'R': return unser_ref();
             default: return false;
         }
     };
     return __unserialize();
 }

function createRequestObject()
{
	var request_;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer")
	{
		request_ = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		request_ = new XMLHttpRequest();
	}
	return request_;
}

var http = createRequestObject();

function getInfo(itemCode, select)
{
	branchRef = document.getElementById('gob_' + itemCode);
	if (branchRef)
	{
		if (branchRef.style.display == 'none')
		{
			LoadingScreen.show();
			http.open('get', 'gettree?id=' + itemCode + '&selector=' + select);
			http.onreadystatechange = handleInfo;
			http.send(null);
		}
		else
		{
			branchRef.style.display = 'none';
		}
	}
}

function handleInfo()
{
	if(http.readyState == 4)
	{
		LoadingScreen.hide();
		var response = http.responseText;
		id = response.substring(0, response.indexOf(';', 0));
		data = response.substring(response.indexOf(';', 0)+1);
		document.getElementById('gob_' + id ).innerHTML = data;
		clickBranch('gob_' + id);
	}
}
