function sack(file) {
    this.xmlhttp = null;
    this.resetData = function () {
        this.method = "POST";
        this.queryStringSeparator = "?";
        this.argumentSeparator = "&";
        this.URLString = "";
        this.encodeURIString = true;
        this.execute = false;
        this.element = null;
        this.elementObj = null;
        this.requestFile = file;
        this.vars = new Object();
        this.responseStatus = new Array(2)
    };
    this.resetFunctions = function () {
        this.onLoading = function () {};
        this.onLoaded = function () {};
        this.onInteractive = function () {};
        this.onCompletion = function () {};
        this.onError = function () {};
        this.onFail = function () {}
    };
    this.reset = function () {
        this.resetFunctions();
        this.resetData()
    };
    this.createAJAX = function () {
        try {
            this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP")
        } catch(e1) {
            try {
                this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
            } catch(e2) {
                this.xmlhttp = null
            }
        }
        if (!this.xmlhttp) {
            if (typeof XMLHttpRequest != "undefined") {
                this.xmlhttp = new XMLHttpRequest()
            } else {
                this.failed = true
            }
        }
    };
    this.setVar = function (name, value) {
        this.vars[name] = Array(value, false)
    };
    this.encVar = function (name, value, returnvars) {
        if (true == returnvars) {
            return Array(encodeURIComponent(name), encodeURIComponent(value))
        } else {
            this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true)
        }
    }
    this.processURLString = function (string, encode) {
        encoded = encodeURIComponent(this.argumentSeparator);
        regexp = new RegExp(this.argumentSeparator + "|" + encoded);
        varArray = string.split(regexp);
        for (i = 0; i < varArray.length; i++) {
            urlVars = varArray[i].split("=");
            if (true == encode) {
                this.encVar(urlVars[0], urlVars[1])
            } else {
                this.setVar(urlVars[0], urlVars[1])
            }
        }
    }
    this.createURLString = function (urlstring) {
        if (this.encodeURIString && this.URLString.length) {
            this.processURLString(this.URLString, true)
        }
        if (urlstring) {
            if (this.URLString.length) {
                this.URLString += this.argumentSeparator + urlstring
            } else {
                this.URLString = urlstring
            }
        }
        this.setVar("rndval", new Date().getTime());
        urlstringtemp = new Array();
        for (key in this.vars) {
            if (false == this.vars[key][1] && true == this.encodeURIString) {
                encoded = this.encVar(key, this.vars[key][0], true);
                delete this.vars[key];
                this.vars[encoded[0]] = Array(encoded[1], true);
                key = encoded[0]
            }
            urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0]
        }
        if (urlstring) {
            this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator)
        } else {
            this.URLString += urlstringtemp.join(this.argumentSeparator)
        }
    }
    this.runResponse = function () {
        eval(this.response)
    }
    this.runAJAX = function (urlstring) {
        if (this.failed) {
            this.onFail()
        } else {
            this.createURLString(urlstring);
            if (this.element) {
                this.elementObj = document.getElementById(this.element)
            }
            if (this.xmlhttp) {
                var self = this;
                if (this.method == "GET") {
                    totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
                    this.xmlhttp.open(this.method, totalurlstring, true)
                } else {
                    this.xmlhttp.open(this.method, this.requestFile, true);
                    try {
                        this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
                    } catch(e) {}
                }
                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;
                        if (self.execute) {
                            self.runResponse()
                        }
                        if (self.elementObj) {
                            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
                            }
                        }
                        if (self.responseStatus[0] == "200") {
                            self.onCompletion()
                        } else {
                            self.onError()
                        }
                        self.URLString = "";
                        break
                    }
                };
                this.xmlhttp.send(this.URLString)
            }
        }
    };
    this.reset();
    this.createAJAX()
}
function ajaxHelper(functionName, additionalArgs) {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest()
    } catch(e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP")
        } catch(e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
            } catch(e) {
                alert("Sorry, your browser does not support AJAX.");
                return false
            }
        }
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4) {
            var response = xmlHttp.responseText;
            eval(functionName + "_ajax" + '(\'' + response + '\')')
        }
    }
    if (additionalArgs !== undefined && additionalArgs.length > 0) {
        var requestString = eval(functionName + "_init" + '(' + additionalArgs + ')')
    } else {
        var requestString = eval(functionName + "_init" + '()')
    }
    if (requestString) {
        xmlHttp.open("GET", requestString, true);
        xmlHttp.send(null)
    }
}
function ajax_sightings(form, site_url, link_id) {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest()
    } catch(e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP")
        } catch(e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
            } catch(e) {
                alert("Sorry, your browser does not support AJAX.");
                return false
            }
        }
    }
    var req = jQuery.post(site_url, jQuery('#' + form).serialize(), function (html) {
        var explode = html.split("\n");
        var shown = false;
        var msg = '<b>You have errors in your form. Please check the following fields and try again:</b><br /><br /><ol>';
        for (var i in explode) {
            var explode_again = explode[i].split("|");
            if (explode_again[0] == 'error') {
                if (!shown) {
                    jQuery('#' + link_id).show()
                }
                shown = true;
                add_remove_class('ok', 'error', explode_again[1]);
                jQuery('#err_' + explode_again[1]).html(explode_again[2]);
                msg += "<li>" + explode_again[1] + "</li>"
            } else if (explode_again[0] == 'ok') {
                add_remove_class('error', 'ok', explode_again[1]);
                jQuery('#err_' + explode_again[1]).hide()
            }
        }
        if (!shown) {
            jQuery('#' + link_id).html("Thank you for your Sighting Report: SUCCESSFUL");
            add_remove_class('error', 'success', link_id);
            jQuery('#' + link_id).show();
            setTimeout('window.location = \"sightings.php\"', 1200)
        } else {
            add_remove_class('success', 'error', link_id);
            jQuery('#' + link_id).html(msg + "</ol>")
        }
        req = null
    })
}
function add_remove_class(search, replace, element_id) {
    if (jQuery('#' + element_id).hasClass(search)) {
        jQuery('#' + element_id).removeClass(search)
    }
    jQuery('#' + element_id).addClass(replace)
}