﻿
// Adds a function to a chain of functions to be called inplace of the standard __doPostBack()
// if the new function returns true then the rest of the chain is canceled
function addDoPostBackHandler(func) {
    var previousDoPostBack = __doPostBack;
    __doPostBack = function (eventTarget, eventArgument) {
        try {
            if (func(eventTarget, eventArgument) != true) {
                previousDoPostBack(eventTarget, eventArgument);
            }
        } catch (ex) {
            // don't want to mask a genuine error
            // lets just restrict this to our 'Unspecified' one
            // This happend when a onbeforeunload is canceled in IE
            if (ex.message.indexOf('Unspecified') == -1) {
                throw ex;
            }
        }
    }
}

// Escapes suspicious character sequences in input fields before postback. 
function cleanInputs() {
    $('input[type=text], textarea').each(function () {
        var $textbox = $(this);
        var value = $textbox.val();
        value = value.replace(/<([^ ])/g, '< $1');
        value = value.replace(/([^ ])>/g, '$1 >');
        $textbox.val(value);
    });
}

var onBeforeUnloadFired = false;
function ResetOnBeforeUnloadFired() {
    onBeforeUnloadFired = false;
}

jQuery.fn.detect_change = function (save_selectors) {
    var $form = $(this);
    $form.data("ChangedFieldCount", 0);

    $form.find("input:not(no-change)").each(function () { install(this) });
    $form.find("select:not(no-change)").each(function () { install(this) });
    $form.find("textarea:not(no-change)").each(function () { install(this) });

    $form.delegate("input:not(no-change)", "keyup", function () { changed(this); });
    $form.delegate("select:not(no-change)", "keyup", function () { changed(this); });
    $form.delegate("textarea:not(no-change)", "keyup", function () { changed(this); });

    $form.delegate("input:not(no-change)", "change", function () { changed(this); });
    $form.delegate("select:not(no-change)", "change", function () { changed(this); });
    $form.delegate("textarea:not(no-change)", "change", function () { changed(this); });

    if (save_selectors != "") {
        $(save_selectors).click(function () { $form.addClass("saving"); });
    }

    $(window).bind("beforeunload", function (event) {
        if (!onBeforeUnloadFired) {
            onBeforeUnloadFired = true;
            if (!$("body").hasClass("session-closed") && !$form.hasClass("saving")) {
                if ($form.hasClass("changed") == true) {
                    event.returnValue = jqSettings.generalmessages.unsavedChangesMessage;
                }
            }
        }
        setTimeout("ResetOnBeforeUnloadFired()", 1000);
        return event.returnValue;
    });

    function changed(el) {
        var $el = $(el);
        if ($el.parents(".ui-dialog").length == 0 && $el.parents(".no-change").length == 0) {
            if (!$el.hasClass("changed") && $el.val() != $el.data("original-value")) {
                $el.addClass("changed");
                $form.addClass("changed");
                $form.data("ChangedFieldCount", $form.data("ChangedFieldCount") + 1);
            } else if ($el.hasClass("changed") && $el.val() == $el.data("original-value")) {
                $el.removeClass("changed");
                $form.data("ChangedFieldCount", $form.data("ChangedFieldCount") - 1);
                if ($form.data("ChangedFieldCount") == 0) {
                    $form.removeClass("changed");
                }
            }
        }
    }

    function install(el) {
        var $el = $(el);
        $el.data("original-value", $el.val());
    }
}

jQuery.fn.ie_wide_select = function () {
    if (jQuery.browser.msie && $.browser.version.substr(0, 1) < 9) { 
        $(this).each(function () {
            var $this = $(this);
            var $placeholder = $(document.createElement("DIV"));
    
            if ($.browser.version != "8.0") {
                $placeholder.css("display", "inline");
                $placeholder.css("zoom", "1");
            } else {             
                $placeholder.css("display", "inline-block");
                $placeholder.css("zoom", "1");
            }
            $this.after($placeholder);
            $placeholder.hide();
            $this.mousedown(function () {
                if ($this.hasClass("floated")) {
                  //  setTimeout(function () { unfloat(); }, 200);
                } else {
                    float();
                }
            });
            $this.blur(function () {
                unfloat();
            });
            $this.change(function () {
                  $this.blur();
            });

            function float() {
                $placeholder.css("height", $this.outerHeight(true) - 1);
                $placeholder.css("width", $this.outerWidth(true));
                $this.css('position', 'absolute').css('width', 'auto');
                if ($this.outerWidth(true) > $placeholder.outerWidth(true)) {
                    $placeholder.show();
                    var position = $placeholder.position();
                    $this.css("left", position.left);
                    $this.css("top", position.top);
                } else {
                    $this.css('position', '');
                    $this.css('width', '');
                }
                $this.addClass("floated");                
            }

            function unfloat() {
                $placeholder.hide();
                $this.css('position', '');
                $this.css('width', '');
                $this.removeClass("floated");
                $this.show();
            }
        });
    }
}

jQuery.fn.red = function() {
    return $(this).css('backgroundColor', 'red');
}

jQuery.fn.ajaxLoading = function(msg) {
    $(this).empty().html('<span class="ajax-loader">'+msg+'</span>');
};

jQuery.fn.highlight = function(str, className) {
    if (str) {
        var regex = new RegExp("(" + str + ")", "gi");
        return $(this).each(function() {
            this.innerHTML = this.innerHTML.replace(regex, "<span class='" + className + "'>\$1</span>");
        });
    }
};

$.fn.serializeObject = function(exclude) {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if ($.inArray(this.name, exclude) == -1) {
            if (o[this.name]) {
                if (o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        }
    });
    return o;
};

function LoadScript(url) {
    var e = document.createElement("script");
    e.src = url;
    e.type = "text/javascript";
    document.getElementsByTagName("head")[0].appendChild(e);
}

function RestoreOriginalForm() {
    theForm = _theForm;
    theForm.oldSubmit = _theForm_oldSubmit;
    theForm.submit = _theForm_submit;
    theForm.oldOnSubmit = _theForm_oldOnSubmit;
    theForm.onsubmit = _theForm_onsubmit;
}

function htmlEncode(text) {
    var textneu = text.replace(/&/g, "&amp;");
    textneu = textneu.replace(/</g, "&lt;");
    textneu = textneu.replace(/>/g, "&gt;");
    return textneu;
}

function quote(text) {
    return '"' + text.replace(/\\/g, "\\\\").replace(/\"/g, "\\\"") + '"';
}

function is_int(value){ 
  if((parseFloat(value) == parseInt(value)) && !isNaN(value)){
      return true;
  } else { 
      return false;
  } 
}

function unescapeHTML(html) {
    return $("<div />").html(html).text();
}

function escapeHTML(html) {
    return $("<div />").text(html).html();
}

function prependErrorMessageIfExists(text) {
    if ($("div[id*=fsetMessageError]").length > 0) {
        $("div[id*=fsetMessageError] span").prepend(text + "<br />");
    }
}

function appendErrorMessageIfExists(text) {
    if ($("div[id*=fsetMessageError]").length > 0) {
        $("div[id*=fsetMessageError] span").append("<br />" + text);
    }
}

var current = 0;

// iPad Support
var isiPad = navigator.userAgent.match(/iPad/i) != null;

function getiPadOrientation() {
    var orientation = window.orientation;
    if (orientation == 0 || orientation == 180) {
        // Portrait Mode
        return 'portrait';
    }

    // Default to Landscape Mode
    return 'landscape';
}

// Grid Mobilization
var mobileGridBrowserWidthThreshold = 622;

function shouldShowMobileGrids() {
    var windowWidth = document.documentElement.clientWidth;
    return windowWidth <= mobileGridBrowserWidthThreshold;
}

function showMobileGrids() {
    mobilizeGrids();

	var $standardGridInputs = $(".standard-grid,.wide-grid").not(".table-only").find("input:not([data-oldname]),textarea:not([data-oldname])");
	var $mobileGridInputs = $(".mobile-grid").find("input[data-oldname],textarea[data-oldname]");

	$standardGridInputs.each(function(){
		var fieldName = $(this).attr("name");
		$(this).attr("data-oldname",fieldName);
		$(this).removeAttr("name");
	});
    $(".standard-grid,.wide-grid").not(".table-only").hide();

	$mobileGridInputs.each(function(){
		var oldFieldName = $(this).attr("data-oldname");
		$(this).attr("name",oldFieldName);
		$(this).removeAttr("data-oldname");
	});
	$(".mobile-grid").show();
}

function hideMobileGrids() {
	var $standardGridInputs = $(".standard-grid,.wide-grid").not(".table-only").find("input[data-oldname],textarea[data-oldname]");
	var $mobileGridInputs = $(".mobile-grid").find("input:not([data-oldname]),textarea:not([data-oldname])");

	$standardGridInputs.each(function(){
		var oldFieldName = $(this).attr("data-oldname");
		$(this).attr("name",oldFieldName);
		$(this).removeAttr("data-oldname");
	});
    $(".standard-grid,.wide-grid").not(".table-only").show();

	$mobileGridInputs.each(function(){
		var fieldName = $(this).attr("name");
		$(this).attr("data-oldname",fieldName);
		$(this).removeAttr("name");
	});
    $(".mobile-grid").hide();
}

function mobilizeGrids() {
    $(".standard-grid,.wide-grid").not(".table-only").not(".mobilized").each(function () {
        var $grid = $(this);
        var $gridHeaders = $grid.find(".grid-header th");
        var $gridDataRows = $grid.find("tbody tr:not(.grid-header,.dynamic-pager,.dynamic-pager tr)");
        var $gridPagers = $grid.find("div.pager");
        var $gridToolbars = $grid.find("div.grid-toolbar");
        var $mobileGrid = $(document.createElement("div")).addClass("mobile-grid");
        var $emptyGridRow = $(this).find("tr.empty-grid")

        if ($gridToolbars.length > 0) {
            var $topToolbar = $($gridToolbars[0]);
            var $newTopToolbar = $(document.createElement("div"));
            $newTopToolbar.attr("class", $topToolbar.attr("class"));
            $newTopToolbar.append($topToolbar.children().clone(true));
            $mobileGrid.append($newTopToolbar);
        }

        if ($emptyGridRow.length == 0) {


            if ($gridPagers.length > 0) {
				var $newTopPager = $($gridPagers[0]).clone(true);
				$mobileGrid.append($newTopPager);
            }


            $gridDataRows.each(function () {
                var $sourceDataRow = $(this);
                var $dataRow = $(document.createElement("div")).addClass($sourceDataRow.attr("class")).addClass("row");

                for (var i = 0; i < $gridHeaders.length; i++) {
                    var $gridHeader = $($gridHeaders[i]);
                    var $gridValue = $($sourceDataRow.children()[i]);
                    var $dataCell = $(document.createElement("div")).addClass("cell");
                    var $dataCellHeader = $(document.createElement("div")).addClass("header");
                    var $dataCellValue = $(document.createElement("div")).addClass("value");
                    var numHeaderChildren = $gridHeader.children().length;
                    var numValueChildren = $gridValue.children().length;

                    if (numHeaderChildren == 0) {
                        $dataCellHeader.html($gridHeader.html());
                    } else {
                        $dataCellHeader.append($gridHeader.children().clone(true));
                    }

                    if (numValueChildren == 0) {
                        $dataCellValue.html($gridValue.html());
                    } else {
                        $dataCellValue.append($gridValue.children().clone(true));
                    }

                    $dataCell.append($dataCellHeader);
                    $dataCell.append($dataCellValue);
                    $dataRow.append($dataCell);
                }
                $mobileGrid.append($dataRow);
            });

            if ($gridPagers.length > 1) {
                var $bottomPager = $($gridPagers[1]);
                var $newBottomPager = $(document.createElement("div"));
                $newBottomPager.attr("class", $bottomPager.attr("class"));
                $newBottomPager.append($bottomPager.children().clone(true));
                $mobileGrid.append($newBottomPager);
            }

        } else {
            var $emptyGridCell = $(document.createElement("div")).addClass("empty-grid");
            $emptyGridCell.html($emptyGridRow.find("td").html());
            $mobileGrid.append($emptyGridCell);
        }

        if ($gridToolbars.length > 1) {
            var $bottomToolbar = $($gridToolbars[1]);
            var $newBottomToolbar = $(document.createElement("div"));
            $newBottomToolbar.attr("class", $bottomToolbar.attr("class"));
            $newBottomToolbar.html($bottomToolbar.html());
            $mobileGrid.append($newBottomToolbar);
        }
        $grid.addClass("mobilized");
        $grid.after($mobileGrid);
    });
}

$(document).bind("pageLoad", function(){
	$(".updown input:not(.updown-attached):not([disabled]),input.updown:not(.updown-attached):not([disabled])").each(function(){
		var $srcTextbox = $(this);
		var minVal = $(this).attr("data-updown-min");
		var maxVal = $(this).attr("data-updown-max");
		var $upbutton = $("<div class='updown-button updown-up-button'></div>");
		makeUnselectable($upbutton[0]);
		$upbutton.bind("mouseup", function(event){
			if(is_int($srcTextbox.val())){
				if(is_int(maxVal)){
					if(parseInt($srcTextbox.val()) < parseInt(maxVal)){
						$srcTextbox.val((parseInt($srcTextbox.val())+1).toString());
					}
				}else{
					$srcTextbox.val((parseInt($srcTextbox.val())+1).toString());
				}
			}else{
				if(is_int(minVal) && parseInt(maxVal) < 1){
					$srcTextbox.val(maxVal);
				}else{
					$srcTextbox.val("1");
				}
			}
		});
		var $downbutton = $("<div class='updown-button updown-down-button'></div>");
		makeUnselectable($downbutton[0]);
		$downbutton.bind("mouseup", function(event){
			if(is_int($srcTextbox.val())){
				if(is_int(minVal)){
					if(parseInt($srcTextbox.val()) > parseInt(minVal)){
						$srcTextbox.val((parseInt($srcTextbox.val())-1).toString());
					}
				}else{
					$srcTextbox.val((parseInt($srcTextbox.val())-1).toString());
				}
			}else{
				if(is_int(minVal) && parseInt(minVal) > 0){
					$srcTextbox.val(minVal);
				}else{
					$srcTextbox.val("0");
				}
			}
		});
		$(this).after($upbutton);
		$(this).after($downbutton);
		$(this).addClass("updown-attached");
	});
});

function makeUnselectable(elem) {
  if (typeof(elem) == 'string')
    elem = document.getElementById(elem);
  if (elem) {
    elem.onselectstart = function() { return false; };
    elem.style.MozUserSelect = "none";
    elem.style.KhtmlUserSelect = "none";
    elem.unselectable = "on";
  }
}

jQuery.fn.focusout = function (lostfocusCallback) {
    var $this = $(this);
    var _checkMouse = function (e) {
        var el = e.target;

        while (true) {
            if (el == $this[0]) {
                return true;
            } else if (el == document) {
                $(document).unbind('mousedown', this._checkMouse);
                lostfocusCallback();
                return false;
            } else {
                el = $(el).parent()[0];
            }
        }
    };
    this._checkMouse = _checkMouse;
    $(document).bind('mousedown', this._checkMouse);
}

var delay = (function () {
    var timer = 0;
    return function (callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();

jQuery.fn.clickonce = function () {
    var $this = this;
    $this.click(function (event) {
        if ($this.hasClass("clicked")) {
            event.stopPropagation();
            event.preventDefault();
            return false;
        } else {
            $this.addClass("clicked");
        }
    });
}

// Web Custom Control Container
jQuery.fn.controlcontainer = function () {
    var $this = $(this);
    $this.each(function () {
        var $controlcontainer = $(this);
        var $controlcontainerdiv = $controlcontainer.find(".control-container");
        var $controlselect = $controlcontainer.find(".optional-field input");

        if ($controlselect.length > 0) {
            $controlcontainerdiv.css('display', ($controlselect[0].checked) ? '' : 'none');
            $controlselect.click(function () {
                if ($controlselect[0].checked == true) {
                    $controlcontainerdiv.fadeIn();
                } else {
                    $controlcontainerdiv.fadeOut();
                }
            });
        }

    });
}


