﻿/// <reference path="/esn/js/jquery/jquery-1.6.1.min-vsdoc.js" />

var Esnek = { Page: {}, Collections: {}, UI: {}} // namespace declaration

//CLASSES

//Collection
Esnek.Collections.Collection = function () {
    var collection = {};
    var order = [];

    this.item = function (keyOrIndex) {

        if (typeof (keyOrIndex) == "number" || keyOrIndex instanceof Number) {
            var propertyName = order[keyOrIndex];
            return collection[propertyName];
        }
        else if (typeof (keyOrIndex) == "string") {
            return collection[keyOrIndex];
        }


    }

    this.indexOf = function (key) {
        for (var ii = 0; ii < order.length; ++ii) {
            if (order[ii] == key) {
                return ii;
            }
        }
        return -1;
    }

    this.add = function (property, value) {
        if (!this.exists(property)) {
            collection[property] = value;
            order.push(property);
        }
        else alert('Collection -> duplicate key!');
    }

    this.remove = function (property) {
        collection[property] = null;
        var ii = order.length;
        while (ii-- > 0) {
            if (order[ii] == property) {
                order[ii] = null;
                break;
            }
        }
    }

    this.clear = function () {
        collection = {};
        order = [];
    }

    this.getKeys = function () {
        var keys = [];
        for (var ii = 0; ii < order.length; ++ii) {
            if (order[ii] != null) {
                keys.push(order[ii]);
            }
        }
        return keys;
    }

    this.update = function (property, value) {
        if (value != null) {
            collection[property] = value;
        }
        var ii = order.length;
        while (ii-- > 0) {
            if (order[ii] == property) {
                order[ii] = null;
                order.push(property);
                break;
            }
        }
    }

    this.exists = function (property) {
        return collection[property] != null;
    }

    this.count = function () {

        return order.length;
    }

    this.each = function (func) { $.each(collection, func) };

}

//Cms Object
Esnek.UI.CmsObject = function () {
    var t = this;
    t.ID = null;
    t.CmsObject = null;
    t.Element = null;
    
    t.getObjectType = function (Element) {
    
        var objectType;
        if ($(Element).hasClass("zc")) objectType = "Zone";
        else if (Element.id.beginsWith("Page")) objectType = "Page";
        else if (Element.id.beginsWith("Zone")) objectType = "Zone";
        else if (Element.id.beginsWith("Part")) objectType = "Part";
        else if (Element.id.beginsWith("File")) objectType = "File";
        else if (Element.id.beginsWith("Folder")) objectType = "Folder";
        
        return objectType;
    };

    t.getObjectID = function (objectType, typeAndID) {
        if(typeAndID.beginsWith(objectType)) return typeAndID.slice(objectType.length);
        return typeAndID;
    };

}

//Context Menu
Esnek.UI.ContextMenu = function () {
    var t = this;
    t.Toggler = null;
    t.Buttons = {};
    t.Element = document.createElement('div');
    t.Element.setAttribute("class", "context_menu");
    t.IsMouseOver = false;
    t.CurrentCmsObject = null;
    $(t.Element).bind('contextmenu', function () { return false; });

    t.Set = function (CmsObject, Element) {
        var element = Element === undefined ? CmsObject.Element : Element;

        $(element).bind('contextmenu', function () { return false; });
        $(element).mousedown(function (e) {
            var evt = e;
            evt.stopPropagation();
            $(this).mouseup(function (e) {
                //e.stopPropagation(); messes with drag drop
                $(this).unbind('mouseup');
                if (evt.button == 2) {
                    t.Show(element, true, evt, CmsObject);
                }
            });
        });
    }

    t.Show = function (toggler, rightClick, e, CmsObject) {



        if (rightClick) {
            //mevlut bad code
            //toggler is the DOM element itself in this case

            var ContextMenu = $(t.Element);

            t.Toggler = {};
            t.Toggler.Element = toggler;
            t.Toggler.CmsObject = t.CurrentCmsObject = CmsObject;

            if ($(t.Element).children().length == 0) $("body").append(t.Element);
            $(t.Element).html("");

            var objectType = CmsObject.ObjectType;

            loop1:
            for (i in t.Buttons) {

                var btn = t.Buttons[i];

                if (btn.IsSeperator) {
                    $(t.Element).append('<div class="seperator"></div>');
                    continue;
                }

                // mevlut bad code
                if (window.allowedContextMenuButtons !== undefined && (objectType == "Part" || objectType == "Zone")) {

                    for (j in allowedContextMenuButtons) {

                        if (objectType == "Part") {

                            if ($(CmsObject.Element).is("." + j)) {

                                if (allowedContextMenuButtons[j][i] === undefined) continue loop1;
                                else break;

                            }

                        }
                        else if (objectType == "Zone") {

                            if ($(CmsObject.Element).has("." + j).size() > 0) {

                                if (allowedContextMenuButtons[j][i] === undefined) continue loop1;
                                else break;

                            }

                        }

                    }

                }
                //////////////////////////


                if (btn.IsAllowed != null) {
                    if (!btn.IsAllowed()) continue;
                }

                $(btn.Element).click(btn.OnClick);
                $(btn.Element).text(btn.Text); // for ie

                $(t.Element).append(btn.Element);
            }

            $(".seperator", t.Element).each(function () {

                var sep = $(this);
                if (sep.next(".seperator").size() > 0 || $(this).next(".context_menu_item").size() == 0)
                    sep.remove();

            });

            var x = e.pageX - 17, y = e.pageY - 4;

            if ($(t.Toggler.CmsObject.Element).is("#admin_panel .treeview_page")) {
                ContextMenu.css({
                    "position": "fixed"
                });
                x -= $(document).scrollLeft();
                y -= $(document).scrollTop();

                var wH = $(window).height();
                var cmH = ContextMenu.height();
                if (y + cmH > wH) {

                    y -= cmH + 3; // 3 for the padding

                }
            }
            else {

                var wH = $(window).height();
                var cmH = ContextMenu.height();
                var sTop = $(document).scrollTop();
                if ((y - sTop) + cmH > wH) {

                    y -= cmH + 3; // 3 for the padding

                }

            }

            ContextMenu.css({
                left: x,
                top: y
            });

            if ($(t.Toggler.Element).parents(".dialog_view").length > 0)
                ContextMenu.css({ "z-index": "50000" });

            ContextMenu.fadeIn(200, function () {
                if (!t.IsMouseOver) {

                    t.Hide(0);

                }

            });


        }
        else {
            t.Toggler = toggler;

            if ($(t.Element).children().length == 0) $("body").append(t.Element);

            $(t.Element).html("");

            var objectType = toggler.CmsObject.Element.id.substr(0, 4);

            loop1:
            for (i in t.Buttons) {
                var btn = t.Buttons[i];

                if (btn.IsSeperator) {
                    $(t.Element).append('<div class="seperator"></div>');
                    continue;
                }


                // mevlut bad code
                if (window.allowedContextMenuButtons !== undefined && (objectType == "Part" || objectType == "Zone")) {

                    for (j in allowedContextMenuButtons) {

                        if (objectType == "Part") {

                            if ($(toggler.CmsObject.Element).is("." + j)) {
                                if (allowedContextMenuButtons[j][i] === undefined) continue loop1;
                                else break;
                            }

                        }
                        else if (objectType == "Zone") {

                            if ($(toggler.CmsObject.Element).has("." + j).size() > 0) {

                                if (allowedContextMenuButtons[j][i] === undefined) continue loop1;
                                else break;

                            }

                        }

                    }

                }
                /////////////


                if (btn.IsAllowed != null) {
                    if (!btn.IsAllowed()) continue;
                }

                $(btn.Element).click(btn.OnClick);
                $(btn.Element).text(btn.Text); // for ie
                $(t.Element).append(btn.Element);

            }

            var pX = 0;
            var pY = 0;

            var element = toggler.CmsObject.Element;

            var paddingX = parseInt($(element).css("padding-right").replace("px", "")) + parseInt($(element).css("padding-left").replace("px", ""));
            pX += paddingX;

            while (element) {
                pX += element.offsetLeft;
                pY += element.offsetTop;
                element = element.offsetParent;
            }

            var ContextMenu = $(t.Element);
            var menuX = 0;
            var menuY = 5; // $(toggler.Element).height();

            if ($(toggler.CmsObject.Element).is(".treeview_page, .treeview_folder, .treeview_file, .treeview_trashitem")) {
                menuY += 8;
            }
            else menuX = $(toggler.CmsObject.Element).width() - ContextMenu.width() - 5;

            if ($(toggler.CmsObject.Element).is("#admin_panel .treeview_page")) {
                ContextMenu.css({
                    "position": "fixed"
                });
            }


            var sTop = 0;
            $(toggler.CmsObject.Element).parents().each(function () {
                sTop += $(this).scrollTop();
            });


            //var sTop = $(document).scrollTop();
            //var dH = $(document).height();


            var wH = $(window).height();


            if ((pY + menuY + ContextMenu.height() - sTop) > wH) {

                menuY = -ContextMenu.height() + menuY;
            }


            if ($("body").css("overflow") == "hidden") {
                ContextMenu.css({
                    "top": (pY + menuY - sTop) + "px",
                    "left": (pX + menuX) + "px"
                });
            }
            else {
                ContextMenu.css({
                    "top": (pY + menuY) + "px",
                    "left": (pX + menuX) + "px"
                });
            }


            if ($(toggler.Element).parents(".dialog_view").length > 0)
                ContextMenu.css({ "z-index": "50000" });

            ContextMenu.fadeIn(200, function () {
                var delay = function () {
                    if (!t.IsMouseOver) {
                        t.Hide(0);
                    }
                }
                setTimeout(delay, 1000);
            });
        }

    };

    t.Hide = function (timeout, fadeout) {
        t.IsMouseOver = false;
        if (timeout === undefined) timeout = 400;
        var delay = function () {
            if (t.IsMouseOver == true) return;
            if (fadeout === undefined) fadeout = 300;
            $(t.Element).fadeOut(fadeout, function () {

                if ($(t.Toggler.Element).parents(".dialog_view").length > 0)
                    $(t.Element).css({ "z-index": "1000" });

            });
        }

        setTimeout(delay, timeout);
    };

    $(t.Element).mouseover(function () {
        t.IsMouseOver = true;
    });

    $(t.Element).mouseleave(function () {
        t.Hide(0)
    });



}

//Context Menu Button
Esnek.UI.ContextMenuButton = function (properties) {
    var t = this;
    t.Text = null;
    t.CssClass = null;
    t.OnClick = null;
    t.IsAllowed = null;
    for (i in properties) {
        if (t[i] !== undefined)
            t[i] = properties[i];
    }
    t.Element = document.createElement('div');
    t.CssClass == null ? t.CssClass = "context_menu_item" : t.CssClass = "context_menu_item " + t.CssClass;
    t.Element.setAttribute("class", t.CssClass);
    $(t.Element).text(t.Text);
    //$(t.Element).bind('click', OnClick);

}

//Context Menu Toggler
Esnek.UI.ContextMenuToggler = function (CmsObject, ContextMenu) {
    var t = this;
    t.Element = document.createElement('div');
    t.CmsObject = CmsObject;
    t.ContextMenu = ContextMenu;
    t.Enabled = true;
    t.Element.setAttribute("class", "context_menu_toggler");
    $(t.CmsObject.Element).append(t.Element);

    t.Show = function () {

        var toggler = $(t.Element);

        if ($(t.CmsObject.Element).is(".treeview_page, .treeview_folder, .treeview_file, .treeview_trashitem")) {
            toggler.width($(t.CmsObject.Element).width());
        }


        $(t.Element).fadeIn(200, function () {

            if ($(t.CmsObject.Element).is(".treeview_page, .treeview_folder, .treeview_file, .treeview_trashitem")) {
                setTimeout(t.Hide, 700);
            }
            
        });

    }

    t.Hide = function () {
        if (t.IsMouseOver == true) return;
        $(t.Element).fadeOut(200)
    };

    $(t.Element).mouseover(function () {
        t.Hide();
        t.IsMouseOver = true;
        t.ContextMenu.CurrentCmsObject = t.CmsObject;
  
        t.ContextMenu.Show(t);
    });


    $(t.Element).mouseleave(function () {
        t.IsMouseOver = false;
    });

}


//END CLASSES


//UTILS

//String format
String.prototype.format = function () {
    var txt = this, i = -1;
    while (i++ < arguments.length) {
        txt = txt.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
    }
    return txt;
};

//String beginsWith
String.prototype.beginsWith = function (t, i) {
    if (i == false) {
        return (t == this.substring(0, t.length));
    }
    else {
        return (t.toLowerCase() == this.substring(0, t.length).toLowerCase());
    }
}

//String endsWith
String.prototype.endsWith = function (t, i) {
    if (i == false) {
        return (t == this.substring(this.length - t.length));
    }
    else {
        return (t.toLowerCase() == this.substring(this.length - t.length).toLowerCase());
    }
}



Esnek.QueryString = (function (a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i) {
        var p = a[i].split('=');
        if (p.length != 2) continue;
        b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));




function Dispatcher(s) {
    this.scope = s || this;
    this.listeners = [];
    var t = this;
    t.add = function (cb, s) {

        this.listeners.push({ cb: cb, scope: s || this.scope });

        return cb;
    };

    t.addToTop = function (cb, s) {
        this.listeners.unshift({ cb: cb, scope: s || this.scope });

        return cb;
    };

    t.remove = function (cb) {
        var l = this.listeners, o = null;

        $(l).each(function (c, i) {
            alert(this);
            if (cb == c.cb) {
                o = cb;
                l.splice(i, 1);
                return false;
            }
        });

        return o;
    };

    t.dispatch = function () {
        var s, a = arguments, i, li = this.listeners, c;

        // Needs to be a real loop since the listener count might change while looping
        // And this is also more efficient
        for (i = 0; i < li.length; i++) {
            c = li[i];
            s = c.cb.apply(c.scope, a);

            if (s === false)
                break;
        }

        return s;
    };
}

//END UTILS

Esnek.Page.Editor = { ActivePlugin: null, LastSelectionBookmark: null };
Esnek.Page.ContextMenus = {};




