﻿// JScript File

var s_stringutil = {
    replaceAll: function (str, str1, str2) {
		if (str2.indexOf(str1) != -1) return str; // to avoid infinite loop
		while (str.indexOf(str1) != -1) {
			str = str.replace(str1, str2);
		}
		return str;
    },

    urlEncode: function (str) {
        return escape(str).replace("/", "%2F").replace("+", "%2B");
	}

}

var s_arrayutil = {

    getForm: function (formId) {
        var ret = new Array();
		var elmts = document.getElementById(formId).elements;
        var values = "", lastName = "";
        for (var i = 0; i < elmts.length; i++) {
            if (!elmts[i].name) continue;
            switch (elmts[i].type) {
                case "select-multiple":
                    values = "";
                    for (var j = 0; j < elmts[i].options.length; j++) {
                        if (elmts[i].options[j].selected)
                            values += elmts[i].options[j].value + ",";
                    }
                    if (values.length > 0) {
                        values = values.substring(0, values.length - 1);
                        ret[elmts[i].name] = values;
                    }
                    break;
                case "checkbox":
                    if (elmts[i].checked) {
                        if (elmts[i].name != lastName || !ret[elmts[i].name])
                            ret[elmts[i].name] = elmts[i].value;
                        else // name == lastName && ret[name]
                            ret[elmts[i].name] = ret[elmts[i].name] + "," + elmts[i].value;
                        lastName = elmts[i].name;
                    }
                    break;
                case "button":
                    break;
                default:
                    if (elmts[i].value != "")
                        ret[elmts[i].name] = elmts[i].value;
                    break;
            }
        }
        return ret;
    },

    serializeForm: function (formId) {
        var elmts = document.getElementById(formId).elements;
		var ret = "", values = "", lastName = "";
        for (var i = 0; i < elmts.length; i++) {
			if (!elmts[i].name) continue;
            switch (elmts[i].type) {
				case "select-multiple":
					values = "";
                    for (var j = 0; j < elmts[i].options.length; j++) {
						if (elmts[i].options[j].selected)
							values += elmts[i].options[j].value + ",";
					}
					if (values.length > 0) {
                        values = values.substring(0, values.length - 1);
						ret += elmts[i].name + "=" + values + "&";
					}
					break;
				case "checkbox":
					if (elmts[i].checked) {
						if (elmts[i].name != lastName)
							ret += elmts[i].name + "=" + elmts[i].value + "&";
						else
							ret = ret.substring(0, ret.length - 1) + "," + elmts[i].value + "&";
						lastName = elmts[i].name;
					}
					break;
				case "button":
					break;
				default:
					if (elmts[i].value != "")
						ret += elmts[i].name + "=" + elmts[i].value + "&";
					break;
			}
		}
		if (ret.length > 0) ret = ret.substring(0, ret.length - 1);
		return ret;
  },

    deserializeForm: function (formId, queryString) {
		var qsArr = this.queryStringToArray(queryString);
		var elmts = document.getElementById(formId).elements;
        for (var i = 0; i < elmts.length; i++) {
			if (!elmts[i].name || !qsArr[elmts[i].name]) continue;
            switch (elmts[i].type) {
				case "select-multiple":
					this.assignMultiSelectValues(elmts[i], qsArr[elmts[i].name]);
					break;
				case "checkbox":
					this.assignMultiCheckboxValues(elmts[i], qsArr[elmts[i].name]);
					break;
				case "button":
					break;
				default:
					elmts[i].value = qsArr[elmts[i].name];
					break;
			}
		}
  },

    queryStringToArray: function (queryString) {
		var ret = new Array();
		var pairs = queryString.split("&");
        for (i in pairs) {
			var keyval = pairs[i].split("=");
            ret[keyval[0]] = keyval[1];
		}
		return ret;
  },

    arrayToQueryString: function (qsArr) {
		var ret = "";
		for (key in qsArr) {
			ret += key + "=" + qsArr[key] + "&";
		}
        if (ret.length > 0) ret = ret.substring(0, ret.length - 1);
		return ret;
  },

    setValueQueryString: function (queryString, name, value) {
		var qsArr = this.queryStringToArray(queryString);
		if (qsArr[name])
			qsArr[name] = value;
		return arrayToQueryString(qsArr);
  },

    assignMultiSelectValues: function (elmt, values) {
		var valArr = values.split(",");
        for (var i = 0; i < elmt.options.length; i++) {
			elmt.options[i].selected = false;
            for (var j = 0; j < varArr.length; j++) {
				if (elmt.options[i].value == valArr[j])
					elmt.options[i].selected = true;
			}
		}
  },

    assignMultiCheckboxValues: function (elmt, values) {
		var valArr = values.split(",");
		elmt.checked = false;
        for (var i = 0; i < valArr.length; i++) {
			if (elmt.value == valArr[i])
				elmt.checked = true;
		}
  },

    getPage: function (input, pageNum, pageSize) {
		if (pageNum > 0 && input.length > pageNum * pageSize)
			input = this.removeRange(input, 0, pageNum * pageSize);
		if (input.length > pageSize)
            input = this.removeRange(input, pageSize, input.length - pageSize);
		return input;
  },

    removeRange: function (arr, startIndex, count) {
		var newArr = new Array();
		var i;
        for (i = 0; i < startIndex; i++) {
			newArr.push(arr[i]);
		}
        for (i = startIndex + count; i < arr.length; i++) {
			newArr.push(arr[i]);
		}
		return newArr;
  },

    makeCopy: function (input) {
		var newArr = new Array();
        for (var i = 0; i < input.length; i++) {
			newArr[i] = input[i];
		}
		return newArr;
  }

}

var s_webutil = {

    checkAll: function (chk, elmt) {
        for (var i = 0; i < elmt.length; i++) {
			elmt[i].checked = chk;
		}
	},

    addFav: function (title) {
		var url = location.href;
		if (window.sidebar) { // Mozilla Firefox Bookmark
            window.sidebar.addPanel(title, url, "");
        } else if (window.external) { // IE Favorite
            window.external.AddFavorite(url, title);
        } else if (window.opera) { // Opera 7+
			return false; // do nothing - the rel="sidebar" should do the trick
		} else { // for Safari, Konq etc - browsers who do not support bookmarking scripts (that i could find anyway)
			 alert('Unfortunately, this browser does not support the requested action,'
			 + ' please bookmark this page manually.');
		}
	}
}

var s_dhtmlutil = {

    moveLayer: function (layer, destElmt, xOffSet, yOffSet) {
        var cleft = 0;
        var ctop = 0;
        var obj = destElmt;
        while (obj.offsetParent) {
            cleft += obj.offsetLeft;
            ctop += obj.offsetTop;
            obj = obj.offsetParent;
        }
        cleft += destElmt.offsetWidth + xOffSet;
        if (document.body.currentStyle && document.body.currentStyle['marginLeft']) {
            cleft += parseInt(document.body.currentStyle['marginLeft']);
        }
        layer.css("left", cleft + 'px');
        //layer.style.left = cleft + 'px';
        ctop += destElmt.offsetHeight + yOffSet;
        if (document.body.currentStyle && document.body.currentStyle['marginTop']) {
            ctop += parseInt(document.body.currentStyle['marginTop']);
        }
        //layer.style.top = ctop + 'px';
        layer.css("top", ctop + 'px');
    },

    moveTo: function (elmt, destElmt, xOffSet, yOffSet) {
        var pos = destElmt.offset();
        elmt.css({ "left": (pos.left + xOffSet) + "px", "top": (pos.top + yOffSet) + "px" });
    },

    center: function (elmt) {
        elmt.css("position", "absolute");
        var topPx = ($(window).height() - elmt.height()) / 2 + $(window).scrollTop();
        if (topPx < 0) topPx = 0;
        elmt.css("top", topPx + "px");
        elmt.css("left", ($(window).width() - elmt.width()) / 2 + $(window).scrollLeft() + "px");
    },

    dropDownMenu: function (opts) {
        $(":not(" + opts.link + ")").click(function () {
            if ($(opts.menu).css("display") != "none") $(opts.menu).slideUp();
        });
        $(opts.link).click(function (e) {
            e.stopPropagation();
            if ($(opts.menu).css("display") == "none") {
                if (opts.position == "center")
                    s_dhtmlutil.center($(opts.menu));
                else //if (opts.position == "offset") // offset is the default
                    s_dhtmlutil.moveTo($(opts.menu), $(opts.link), opts.xOffSet, opts.yOffSet);
                $(opts.menu).slideDown();
            }
            else
                $(opts.menu).slideUp();
        });
    },

    fitHeight: function (elmt) {
        if ($(document).height() > $(window).height()) {
            $(elmt).height($(elmt).height() - ($(document).height() - $(window).height()));
        }
        else if ($(document).height() < $(window).height()) {
            $(elmt).height($(elmt).height() + ($(window).height() - $(document).height()));
        }
        // $(document).height() == $(window).height()
        while ($(document).height() <= $(window).height()) {
            $(elmt).height($(elmt).height() + 10);
        }
        $(elmt).height($(elmt).height() - ($(document).height() - $(window).height()));
    }
}

var s_querystring = {

    params: null,

    parse: function () {
        if (this.params == null) {
            var ret = new Array();
            var params = location.search.substring(1).split('&');
            for (var i = 0; i < params.length; i++) {
                var nv = params[i].split('=');
                ret[nv[0]] = nv[1];
            }
            this.params = ret;
        }
        return this.params;
    },

    serialize: function (params) {
        var ret = "";
        for (key in params) {
            ret += key + "=" + params[key] + "&";
        }
        if (ret != "") ret = ret.substring(0, ret.length - 1);
        return ret;
    },

    get: function (fieldName) {
        return this.parse()[fieldName];
    },

    change: function (fieldName, fieldValue) {
        var params = this.parse();
        params[fieldName] = fieldValue;
        return "?" + this.serialize(params);
    }
}

var s_geoutil = {

    EarthRadiusInMiles: 3956.0,
    Rad2Deg: 180.0 / Math.PI,
    Deg2Rad: Math.PI / 180.0,

    changeLat: function (miles) { // Given a distance north (+) or south (-), return the change in latitude.
        return (miles / this.EarthRadiusInMiles) * this.Rad2Deg;
    },

    changeLng: function (miles, lat) { // Given a latitude and a distance west (-) or east (+), return the change in longitude.
        var r = this.EarthRadiusInMiles * Math.cos(lat * this.Deg2Rad);
        return (miles / r) * this.Rad2Deg;
    }
}
