﻿/**
 * <pre>
 * 
 *  Accela
 *  File: ProcessLoading.js
 * 
 *  Accela, Inc.
 *  Copyright (C): 2011
 * 
 *  Description:
 * 
 *  Notes:
 * $Id: ProcessLoading.js 183565 2011-01-24 03:26:44Z ACHIEVO\hans.shi $.
 *  Revision History
 *  &lt;Date&gt;,    &lt;Who&gt;,    &lt;What&gt;
 *
 * </pre>
 */

function ProcessLoading() {
    this.initControlLoading = initControlLoading;
    this.showLoading = showLoading;
    this.isShowing = isShowing;
    this.hideLoading = hideLoading;
    this.createLoading = createLoading;
    this.setTitle = setTitle;
    this.loadingId = 'divGlobalLoading';
    this.loadingMaskId = 'divGlobalLoadingMask';
    this.originalScrollTop = 0;
}

function initControlLoading() {
    var loadingId = this.loadingId;
    var processLoading = this;

    $('a').not($('.NotShowLoading')).each(function () {
        if ($(this).attr('disabled') == 'disabled' || $(this).attr('disabled') == true) {
            return;
        }

        var id = $(this).attr('id');
        var href = $(this).attr('href');
        var target = $(this).attr('target');
        var needValidate = true;

        if (typeof(target) != 'undefined' && $.trim(target) != '' && target != '_parent'
            && target != '_self' && target != '_top') {
            return;
        }

        if ($(this).hasClass('NeedValidate') == false && ($.isEmptyObject(href) || href.indexOf('javascript:WebForm_DoPostBackWithOptions') == -1)) {
            needValidate = false;
        }

        // href has not function please bind the click.
        if ($.isEmptyObject(href) || href.indexOf('javascript') == -1 || href.indexOf('javascript:void(0)') != -1) {
            $(this).click(function (e) {
                if (!(e.ctrlKey || e.shiftKey)) {
                    processLoading.showLoading(needValidate);
                }
            })
        }
        else {
            if (href.indexOf('showLoading') != -1) {
                return;
            }

            // append the loading function
            if (href.charAt(href.length - 1) == ';') {
                href = href.substr(0, href.length - 1);
            }

            $(this).attr('href', href + ';var p = new ProcessLoading();p.showLoading(' + needValidate + ');');
        }
    })

    if (isPopup()) {
        var domLoadingMask = $(parent.document).find("#dvACADialogLayerMask");
        domLoadingMask.css('z-index', "999");
        $(parent.document).find('#' + this.loadingId).hide();
    }
}

function isPopup() {
    return window.location.href.indexOf("isPopup") > 0;
}

// show loading, needValidate: it need validate or not
function showLoading(needValidate) {

    this.createLoading();
    if (!needValidate || isAllValidatorsValid()) {
        var domLoading =isPopup() ? $(parent.document).find("#"+this.loadingId): $('#' + this.loadingId);

        var domLoadingMask = isPopup() ? $(parent.document).find("#dvACADialogLayerMask") : $('#' + this.loadingMaskId);
        domLoading.show();
        try{
            domLoading.corner();
        }
        catch (e) { }
        domLoading.css('z-index', '20000');
        domLoadingMask.css('z-index', '2000');
        domLoadingMask.show();

        // if exists vertical scroll bar, the height will be great, so set the body's height.
        var bodyHeight = 0;
        if (!isPopup()) {
            bodyHeight = $('body').height();
        }
        else {
            bodyHeight = $(parent.document.body).height();
        }

        domLoadingMask.height(bodyHeight);
        if (!isPopup()) {
            adjustPosition(domLoading);
        }
        else {
            var p = $(parent.document).find('#dvACADialogLayer').position();
            var height = $(parent.document).find('#dvACADialogLayer').height();
            p.top += height / 2;
            $(parent.document).find('#' + this.loadingId).position(p);
        }

        scrollLoading(domLoading);
    }
}

function isShowing() {
    var domLoading = $('#' + this.loadingId);

    if ($.exists(domLoading) && domLoading.is(":visible")) {
        return true;
    }

    return false;
}

function scrollLoading(popupBox) {
    if ($.exists(popupBox) == false || popupBox.is(":visible") == false) {
        return;
    }

    if (!isPopup()) {
        var bodyScrollTop = window.top.document.body.scrollTop;
 
        if (parent.document.documentElement.scrollTop != 0) {
            bodyScrollTop = parent.document.documentElement.scrollTop;
        }

        if (bodyScrollTop != this.originalScrollTop) {
            this.originalScrollTop = bodyScrollTop;
            adjustPosition(popupBox);
        }
    }
    else {
        var p = $(parent.document).find('#dvACADialogLayer').position();
        var height = $(parent.document).find('#dvACADialogLayer').height();
        p.top += height / 2;
        $(parent.document).find('#' + this.loadingId).position(p);
    }

    setTimeout(function () { scrollLoading(popupBox); }, 100);
}


function hideLoading() {
    var domLoading = $('#' + this.loadingId);
    //var domLoadingMask = $('#' + this.loadingMaskId);
    var domLoadingMask = isPopup() ? $(parent.document).find("#dvACADialogLayerMask") : $('#' + this.loadingMaskId);
    if ($.exists(domLoading)) {
        if (isChrome()) {
            domLoading.fadeOut('fast');
        }
        else {
            domLoading.hide();
        }

        // reset the title
        this.setTitle(getText.global_js_showLoading_title);
    }

    if (!isPopup()) {
        if ($.exists(domLoadingMask)) {
            if (isChrome()) {
                domLoadingMask.fadeOut('fast');
            }
            else {
                domLoadingMask.hide();
            }
        }
    }
}

function createLoading() {
    var domLoading = isPopup() ? $(parent.document.body).find("#" + this.loadingId) : $('#' + this.loadingId);
    if ($.exists(domLoading) == false) {
        var imgUrl = getText.global_js_showLoading_src;
        var title = getText.global_js_showLoading_title;

        var divContainer = $('<div>').addClass('ACA_Global_Loading').attr('id', this.loadingId).appendTo('body');

        // if direction is right to left, render title first.
        if ($(divContainer).css('direction') == 'rtl') {
            createLoadingTitle(divContainer, title);
            createLoadingImage(divContainer, imgUrl);
        }
        else {
            createLoadingImage(divContainer, imgUrl);
            createLoadingTitle(divContainer, title);
        }
    }

    if (!isPopup()) {
        var domLoadingMask = $('#' + this.loadingMaskId);
        if ($.exists(domLoadingMask) == false) {
            $('<div>').addClass('ACA_MaskDiv ACA_Hide').attr('id', this.loadingMaskId).appendTo('body');
        }
    }
}

function createLoadingImage(pContainer, imgUrl) {
    var divImg = $('<div>').css('float', 'left').appendTo(pContainer);
    var img = $('<img>').attr({ src: imgUrl, alt: "" }).appendTo(divImg);
}

function createLoadingTitle(pContainer, title) {
    var divTitle = $('<div>').addClass('ACA_Global_Loading_Title').css('float', 'left').appendTo(pContainer);
    var span = $('<span>').addClass('ACA_SmLabel ACA_SmLabel_FontSize').text(title).appendTo(divTitle);
}

function setTitle(title) {
    var domLoading = $('#' + this.loadingId);

    if ($.exists(domLoading)) {
        $(domLoading).find('.ACA_Global_Loading_Title').children('span').text(title);
        adjustPosition(domLoading);
    }
}

function GetAbsoluteLocation(element) {
    if (arguments.length != 1 || element == null) {
        return null;
    }
    var elmt = element;
    var offsetTop = elmt.offsetTop;
    var offsetLeft = elmt.offsetLeft;
    var offsetHeight = elmt.offsetHeight;
    while (elmt = elmt.offsetParent) {
        // add this judge
        if (elmt.style.position == 'absolute' || elmt.style.position == 'relative'
            || (elmt.style.overflow != 'visible' && elmt.style.overflow != '')) {
            break;
        }
        offsetTop += elmt.offsetTop;
        offsetLeft += elmt.offsetLeft;
    }
    return { absoluteTop: offsetTop, absoluteLeft: offsetLeft, offsetHeight: offsetHeight };
}

function adjustPosition(popupBox) {
    var bodyObj = document.body;
    if (parent.document.documentElement.scrollTop != 0) {
        bodyObj = parent.document.documentElement;
    }

    var iframeOffsetTop = 0;
    if (popupBox != undefined && popupBox != null && popupBox.is(':visible')) {
        var scrollTop = bodyObj.scrollTop;
        var oLeft = (document.body.clientWidth - popupBox.width()) / 2 + "px";
        var oTop = 0;

        if (this.frameElement != "undefined" && this.frameElement != null) {
            if (this.frameElement.src.indexOf("isPopup=Y") == -1) {//is not a popup iframe  
                var iframe = GetAbsoluteLocation(this.parent.document.getElementById(this.frameElement.id));
                if (iframe.offsetHeight < (window.top.document.body.clientHeight - iframe.absoluteTop)) {
                    oTop = (iframe.offsetHeight - popupBox.height()) / 2 + window.top.document.body.scrollTop;
                } else {
                    oTop = (window.top.document.body.clientHeight - iframe.absoluteTop - popupBox.height()) / 2 + window.top.document.body.scrollTop;
                }
            } else {
                oTop = (bodyObj.clientHeight - scrollTop - popupBox.height()) / 2 + scrollTop + "px";
            }
        }
        else {
            oTop = (bodyObj.clientHeight - popupBox.height()) / 2 + scrollTop + "px";
        }

        popupBox.css('left', oLeft);
        popupBox.css('top', oTop);
    }
}

function isAllValidatorsValid() {
    if ((typeof (Page_Validators) != "undefined") && (Page_Validators != null)) {
        for (var i = 0; i < Page_Validators.length; i++) {
            if (!Page_Validators[i].isvalid) {
                return false;
            }
        }
    }
    return true;
}
