﻿var Container = (function() {

    var Guid = (function() {
        function randomString() {
            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        }
        function guid() {
            return (randomString() + randomString() + "-" + randomString() + "-" + randomString() + "-" + randomString() + "-" + randomString() + randomString() + randomString());
        }

        function uniqueId() {
            return guid().replace(/-/gi, "");
        }

        return new function() {
            this.NewGuid = guid;
            this.UniqueID = uniqueId;
            this.Random = randomString;
        }
    })();


    var elements = [];

    Array.prototype.find = function(id) {
        for (var i = 0; i < this.length; i++) {
            var item = this[i];
            if (item.id === id) {
                return item;
            }
        }
    }


    var _clearInterval = function(item, prop) {
        clearInterval(item[prop]);
        delete item[prop];
    }

    var _clearScrollInterval = function(item) {
        _clearInterval(item, "scroll");
    }

    var _clearFadeInterval = function(item) {
        _clearInterval(item, "fade");
    }

    var _setOpacity = function(node, value) {
        if (node.style.filter != undefined) {
            node.style.filter = 'alpha(opacity = ' + (value * 100) + ')';
        } else {
            node.style.opacity = value;
        }
        return value;
    }

    var _setNodeHeight = function(node, value) {
        node.style.height = value + "px";
        return value;
    }

    var _fadeIn = function(node) {
        var item = elements.find(node.guid);
        if (item != undefined) {
            if (item.fade != undefined) { _clearFadeInterval(item); }
            var opacity = item.opacity || 0;
            item.fade = setInterval(function() {
                item.opacity = _setOpacity(node, opacity);
                if (opacity >= 1) {
                    _clearFadeInterval(item);
                } else {
                    opacity += 0.02;
                }
            }, 10);
        }
    }

    var _fadeOut = function(node) {
        var item = elements.find(node.guid);
        if (item != undefined) {
            if (item.fade != undefined) { _clearFadeInterval(item); }
            var opacity = item.opacity || 1;
            item.fade = setInterval(function() {
                item.opacity = _setOpacity(node, opacity);
                if (opacity <= 0) {
                    _clearFadeInterval(item);
                } else {
                    opacity -= 0.01;
                }
            }, 10);
        }
    }

    var _scrollIn = function(node, fade) {
        node.scrollOut = false;
        var item = elements.find(node.guid);
        if (item != undefined) {
            if (item.scroll != undefined) { _clearScrollInterval(item); }
            if (fade) { _fadeOut(node); }
            item.offsetHeight = node.offsetHeight;
            var height = item.offsetHeight;
            item.scroll = setInterval(function() {
                item.currentHeight = height;
                if (height <= 0) {
                    _clearScrollInterval(item);
                    _setNodeHeight(node, 0);
                    item.currentHeight = 0;
                } else {
                    _setNodeHeight(node, height);
                    height -= 5;
                }
            }, 10);
        }
    }

    var _scrollOut = function(node, fade) {
        node.scrollOut = true;
        var item = elements.find(node.guid);
        if (item != undefined) {
            if (item.scroll != undefined) { _clearScrollInterval(item); }
            if (fade) { _fadeIn(node); }
            var height = item.currentHeight;
            item.scroll = setInterval(function() {
                item.currentHeight = height;
                if (height >= item.offsetHeight) {
                    _clearScrollInterval(item);
                    _setNodeHeight(node, item.offsetHeight);
                    node.style.height = "100%";
                } else {
                    _setNodeHeight(node, height);
                    height += 5;
                }
            }, 10);
        }
    }



    var _click = function(event, fade) {
        if (event == undefined) {
            event = window.event;
        }
        var target = event.target || event.srcElement;
        var className = target.className.toLowerCase();
        if (className == "panel") {
            var nextElement = target.nextSibling;
            while (nextElement.className === undefined) {
                nextElement = nextElement.nextSibling;
            }
            if (event.stopPropagation) {
                event.stopPropagation();
            } else {
                event.cancelBubble = true;
            }

            if (!nextElement.guid) {
                nextElement.guid = Guid.UniqueID();
                elements.push({
                    id: nextElement.guid,
                    offsetHeight: nextElement.offsetHeight
                });
            }

            if (nextElement.scrollOut == false) {
                _scrollOut(nextElement, fade);
            } else {
                _scrollIn(nextElement, fade);
            }
        }
    }
    return new function() {
        this.Click = _click;
    }
})();




var Page = (function() {
var updateProgress = null;

var _getEventElement = function(event) {
    _stopEvent(event);
    _lastEvent = event;
    return event.target;
}

var _stopEvent = function(e) {
    if (e.stopPropagation) {
        e.stopPropagation();
    } else {
        e.cancelBuble = true;
    }
}

var _getContent = function(template) {
    for (var i = 0; i < Page.Content.length; i++) {
        Page.CurrentContent = Page.Content[i];
        if (Page.CurrentContent.Template == template) {
            Page.CurrentTemplate = Page.CurrentContent.Template;
            Page.CurrentValue = Page.CurrentContent.Value;
            return true;
        }
    }
    return false;
}

var _serializeFormElements = function(frm, template) {
    if (_getContent(template)) {
        frm.find("input, select, textarea").each(function(index, element) {
            switch (element.type.toLowerCase()) {
                case "text":
                    Page.CurrentContent.DataObjekt[element.name] = element.value;
                    break;
                case "select":
                    Page.CurrentContent.DataObjekt[element.name] = element.options[element.selectedIndex].value;
                    break;
                case "radio":
                case "checkbox":
                    Page.CurrentContent.DataObjekt[element.name] = element.checked;
                    break;
                case "textarea":
                    Page.CurrentContent.DataObjekt[element.name] = element.value;
                    break;
                default:
                    break;
            }

        });
    }
}

var _serializeDataObjektElements = function() {
    for (var name in Page.CurrentContent.DataObjekt) {
        if (document.getElementsByName(name).length > 0) {
            var element = document.getElementsByName(name)[0];
            switch (element.type.toLowerCase()) {
                case "text":
                    element.value = Page.CurrentContent.DataObjekt[name];
                    break;
                case "select":
                    element.options[element.selectedIndex].value = Page.CurrentContent.DataObjekt[name];
                    break;
                case "radio":
                case "checkbox":
                    element.checked = Page.CurrentContent.DataObjekt[name];
                    break;
                case "textarea":
                    element.value = Page.CurrentContent.DataObjekt[name];
                    break;
                default:
                    break;
            }

        }
    }
    updateProgress.hide();
}

var _lastEvent = null;

var _loadData = function() {
    if (Page.CurrentTemplate == 0 && Page.CurrentCustomerID != undefined) {
        updateProgress.show();
        AjaxExecute.GetTemplateDaten(Page.CurrentTemplate, Page.CurrentCustomerID, function(result) {
            if (result.error == null && result.value != null) {
                eval("Page.CurrentContent.DataObjekt = " + result.value);
                _serializeDataObjektElements();
            }
        });
    } else {
        updateProgress.hide();
    }
}

var _clickEvent = function(event) {
    if (updateProgress == null) {
        updateProgress = $("#updateProgress").hide();
    }

    var element = _getEventElement(event);
    element.value = $(element).find(":hidden").val();
    if (element.tagName.toLowerCase().indexOf("li") > -1) {
        var ul = element.parentNode;
        for (var i = 0; i < ul.childNodes.length; i++) {
            if (ul.childNodes[i].nodeType == 1) {
                ul.childNodes[i].style.borderBottomColor = "#d9d9d9";
            }
        }
        element.style.borderBottomColor = "#fff";
        if (_getContent(element.value)) {
            Page.Response.Write(Page.CurrentValue);
            Page.LoadData();
        } else {
            updateProgress.show();
            AjaxExecute.GetTemplate(element.value, function(result) {
                if (result.error == null && result.value != null) {
                    var form = $(result.value);
                    form.find("input[id*=VIEWSTATE]").parent("div").remove();
                    var content = {
                        Template: result.request.args.template,
                        Value: form.html()
                    }
                    eval("content.DataObjekt =" + form.find(':hidden[id$=dataObject]').val());
                    Page.Content.push(content);
                    _serializeFormElements(form, content.Template);
                    Page.Response.Write(Page.CurrentValue);
                    Page.LoadData();
                }
            });
        }

    } else if (element.tagName.toLowerCase().indexOf("a") > -1) {
        if (Page.CurrentTemplate == 1) {
            Page.CurrentCustomerID = element.innerHTML;
            $("#tab1").focus().trigger("click");
        }
    }

    return false;
}




    return new function() {
        this.Response = (function() {

            var _write = function(value) {
                $(document).ready(function() {
                    var result = Page.Response.ServerResult || $("#ServerResult");
                    Page.Response.ServerResult = result;
                    if (value.length != 0) {
                        $(value).appendTo(result.empty());
                    }
                });
            }

            return new function() {
                this.Write = _write;
            }
        })();
        this.Click = _clickEvent;
        this.Content = [];
        this.LoadData = _loadData;
    }
})();

