/* Simple AJAX Code-Kit (SACK) */
/* ©2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence, see documentation or authors website for more details */
 
function sack(file){
	this.AjaxFailedAlert = "Your browser does not support the enhanced functionality of this website, and therefore you will have an experience that differs from the intended one.\n";
	this.requestFile = file;
	this.method = "POST";
	this.URLString = "";
	this.encodeURIString = true;
	this.execute = false;
	this.id = 0;
	this.isComplete = false;
	this.isBookmark = false; // gestione evento back/forw del browser

	this.onLoading = function() { };
	this.onLoaded = function() { };
	this.onInteractive = function() { };
	this.onCompletion = function() { };

	this.createAJAX = function() {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (err) {
				this.xmlhttp = null;
			}
		}
		if(!this.xmlhttp && typeof XMLHttpRequest != "undefined")
			this.xmlhttp = new XMLHttpRequest();
		if (!this.xmlhttp){
			this.failed = true; 
		}
	};
	
	this.setVar = function(name, value){
		if (this.URLString.length < 3){
			this.URLString = name + "=" + value;
		} else {
			this.URLString += "&" + name + "=" + value;
		}
	}
	
	this.encVar = function(name, value){
		//var varString = encodeURIComponent(name) + "=" + encodeURIComponent(value);
		var varString = encodeURIComponent(name) 
		// check if value already encoded
		if (value.indexOf('%3C') != -1)	
			varString += "=" + value;
		else
			varString += "=" + encodeURIComponent(value);
	return varString;
	}
	
	this.encodeURLString = function(string){
		varArray = string.split('&');
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split('=');
			if (urlVars[0].indexOf('amp;') != -1){
				urlVars[0] = urlVars[0].substring(4);
			}
			varArray[i] = this.encVar(urlVars[0],urlVars[1]);
		}
	return varArray.join('&');
	}
	
	this.runResponse = function(){
		eval(this.response);
	}

	this.runAJAX = function(urlstring) {

	    this.responseStatus = new Array(2);
	    if (this.failed && this.AjaxFailedAlert) {
	        alert(this.AjaxFailedAlert);
	    } else {
	        if (urlstring) {
	            if (this.URLString.length) {
	                this.URLString = this.URLString + "&" + urlstring;
	            } else {
	                this.URLString = urlstring;
	            }
	        }
	        if (this.encodeURIString) {
	            var timeval = new Date().getTime();
	            this.URLString = this.encodeURLString(this.URLString);
	            this.setVar("rndval", timeval);
	        }
	        if (this.element) { this.elementObj = document.getElementById(this.element); }
	        if (this.xmlhttp) {
	            var self = this;
	            if (this.method == "GET") {
	                var totalurlstring = this.requestFile + "?" + this.URLString;
	                this.xmlhttp.open(this.method, totalurlstring, true);
	            } else {
	                this.xmlhttp.open(this.method, this.requestFile, true);
	            }
	            if (this.method == "POST") {
	                try {
	                    this.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
	                } catch (e) { }
	            }

	            this.xmlhttp.send(this.URLString);
	            this.xmlhttp.onreadystatechange = function() {
	                switch (self.xmlhttp.readyState) {
	                    case 1:
	                        self.onLoading();
	                        break;
	                    case 2:
	                        self.onLoaded();
	                        break;
	                    case 3:
	                        self.onInteractive();
	                        break;
	                    case 4:
	                        self.response = self.xmlhttp.responseText;
	                        self.responseXML = self.xmlhttp.responseXML;
	                        self.responseStatus[0] = self.xmlhttp.status;
	                        self.responseStatus[1] = self.xmlhttp.statusText;
	                        self.isComplete = true;
	                        self.onCompletion();
	                        if (self.execute) { self.runResponse(); }
	                        if (self.elementObj) {
	                            var elemNodeName = self.elementObj.nodeName;
	                            elemNodeName.toLowerCase();
	                            if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea") {
	                                self.elementObj.value = self.response;
	                            } else {
	                                self.elementObj.innerHTML = self.response;
	                            }
	                        }

	                        self.URLString = "";
	                        break;
	                }
	            };
	        }
	    }
	};
this.createAJAX();
}


/*---------------------------------------------------------------- */
/* Bookmarks                                                       */
/* ---------------------------------------------------------------- */

var bookmarks = function() {
    var lasthash = '';
    var isie = false;
    var iec = 0;
    var iev = 0;
    var intCheck = 0;
    var isinit = false;
    var iframeset = false;

    var bookmarked = new Array();
    return {
        initialize: function() {
            var quirks = document.compatMode;
            if (document.all) {

                if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
                    iev = new Number(RegExp.$1);
                    if (typeof document.documentElement.style.opacity != 'undefined') {
                        //this must be at least IE9
                        iev = 9;
                    }
                }
                // alert(navigator.userAgent)
                if (/NT (\d+\.\d+);/.test(navigator.userAgent)) { iev1 = new Number(RegExp.$1); }
                if (iev == 8 && (quirks == 'BackCompat' || quirks == 'CSS1Compat') || (iev < 8 && iev1 < 6.1)) {
                    bookmarks.iframe();
                    isie = true;
                }
            }
            bookmarks.startcheck();
        },
        startcheck: function() {
            lasthash = '';
            intCheck = setInterval("bookmarks.checkhash();", 500);
        },
        stopcheck: function() {
            if (intCheck > 0) clearInterval(intCheck);
            intCheck = 0;
        },
        sethash: function(hash) {
            iframeset = false;

            if (hash == '#' || hash == '#!') return;
            if (hash) {
                if (isie) { iec++; }
                //var str = hash + ',' + url + ',' + container + ',' + iec;
                var str = hash + ',' + iec;
                var num = '';
                var partof = false;
                lasthash = hash;
                window.location.href = hash;
                for (var i = 0; i < bookmarked.length; i++) {
                    var tmp = bookmarked[i].split(",");
                    if (tmp[0] == hash) {
                        partof = true;
                        num = tmp[1];
                    }
                }
                if (isie) {
                    if (!partof) {
                        bookmarks.setiframe(hash, iec);
                    } else {
                        bookmarks.setiframe(hash, num);
                    }
                }
                if (!partof) {
                    bookmarked.push(str);
                }
            }
            iframeset = true;
        },
        checkhash: function() {

            var obj = window.location.hash;
            var purl, pctn, phas;
            var ajax;
            if (obj) {
                if (obj != lasthash) {
                    if (lasthash == '') {
                        lasthash = obj
                    } else {
                        for (var i = 0; i < bookmarked.length; i++) {
                            var tmp = bookmarked[i].split(",");
                            if (tmp[0] == obj) {
                                phas = tmp[0]; purl = tmp[1];
                                break;
                            }
                        }
                        if (phas && purl) {
                            lasthash = phas;
                            var params = {}, queryString = lasthash,
      						re = /([^&=]+)=([^&]*)/g, m;
                            queryString = queryString.replace('#!', '');
                            while (m = re.exec(queryString)) {
                                params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
                            }
                            mostra(params);
                        }
                    }
                }
            }
        },
        iframe: function() {
            var bug = document.createElement("iframe");
            bug.src = '/webiris/ajax/blank.html';
            bug.id = 'bugframe';
            bug.style.width = '100px';
            bug.style.height = '100px';
            bug.style.display = 'none';
            document.body.appendChild(bug);
        },
        setiframe: function(f, num) {
            document.getElementById('bugframe').src = '/webiris/ajax/blank.html?' + num + f;
        },
        fixiframe: function(f) {
            if (intCheck > 0 && iframeset) {
                var obj = window.location.hash;
                if (f) {
                    if (f != obj && obj.length>2) {
                        //alert(f + '---' + obj)
                        window.location.hash = f;
                    }
                }
            }
        }
    };
} ();


