﻿//-----------------------------------------------------------------------
// Copyright (C) Playmatcher. All rights reserved.
//-----------------------------------------------------------------------

Playmatcher = {
    Web: {
        UI: {
            defaults: {
                roundedElements: [{ selector: "a.pmPanelLink", bgc: "#666666", fgc: "#949294"}]
            },
            init: function() {
                // No AJAX caching
                $.ajaxSetup({ cache: false });

                this.Docking.init();
                // Make rounded corners for some UI elements
                if (NiftyCheck != null) {
                    if (!NiftyCheck()) {
                        return;
                    }
                    var elements = this.defaults.roundedElements;
                    for (var i = 0; i < elements.length; i++) {
                        Playmatcher.Web.UI.roundCorners(elements[i]);
                    }
                }
                // Apply pipes in IE for the footer
                if ($.browser.msie) {
                    $("#CommonPicks li").not(":last").append("|&nbsp;");
                }
                this.Forms.init();
                this.Animation.init();
                this.PanelBars.init();
            },
            roundCorners: function(options) {
                options = $.extend({}, Playmatcher.Web.UI.defaults.roundedElements[0], options);
                Rounded(options.selector, options.bgc, options.fgc, 4, 4);
            },
            Animation: {
                init: function() {
                    jQuery.fn.fadeToggle = function(speed, easing, callback) {
                        return this.animate({ opacity: 'toggle' }, speed, easing, callback);
                    };
                }
            },
            Templates: {
                clone: function(element, data) {
                    element = $(element);
                    var clone = element.clone();
                    if (data != undefined && data != null) {
                        for (var i in data) {
                            var s = "[name='" + i + "']";
                            $("input[type!='checkbox']" + s + ",textarea" + s + ",select" + s, clone).val(data[i]);
                        }
                    }
                    return clone;
                }
            },
            Docking: {
                init: function() {
                    var boxes = $(".dbx-box");
                    boxes.each(function() {
                        var $$ = $(this);
                        // if not part of a docking group, we will center
                        if ($$.parent(".dbx-group").length < 1) {
                            $$.addClass("pmCenteredDockingBox");
                        }
                        // get the style
                        var css = $$.attr("class");
                        if (css.indexOf('pmDockingBoxStyleA') >= 0) {
                            css = "pmDockingBoxStyleA";
                        }
                        else {
                            css = "pmDockingBoxStyleB";
                        }
                        $(".dbx-content", this).addClass(css + "_content");
                        // for the box..
                        Playmatcher.Web.UI.Docking.createCorners(this, css, 10);
                        // for the title..
                        Playmatcher.Web.UI.Docking.createCorners($(".dbx-handle", this), css + "_title", 2);
                    });
                },
                createCorners: function(box, css, count) {
                    var s1 = "", s2 = "";
                    css += "_frame";
                    for (var i = 0; i < count; i++) {
                        s1 += "<div class='" + css + i + " " + css + "'>";
                        s2 += "</div>";
                    }
                    $(box).wrapInner(s1 + s2);
                }
            },
            Forms: {
                init: function() {
                    jQuery.validator.setDefaults({
                        errorElement: "span",
                        errorClass: "pmFormFieldError",
                        errorPlacement: function(error, element) {
                            element = $(element).parent();
                            if (element[0].tagName == "LABEL") {
                                element = element.parent();
                            }
                            element.find("span.pmFormFieldError").css("display", "none");
                            error.insertAfter(element.children(":not('hr'):last"));
                        }
                    });
                    $("p.pmFormError").each(function(i) {
                        if ($(this).html().length > 0 && $(this).css("display") != "none") {
                            $(this).css("display", "block");
                        }
                    });
                    $("p.pmFormNotification").each(function(i) {
                        if ($(this).html().length > 0 && $(this).css("display") != "none") {
                            $(this).css("display", "block");
                        }
                    });
                    if ($.DirtyForm != null) {
                        $.DirtyForm.changedClass = "pmFormFieldChanged";
                        // make static forms track changes
                        Playmatcher.Web.UI.Forms.setDirtyForms();
                    }
                    if ($.fn.hint != null) {
                        $("input:text").hint();
                    }
                },
                setDirtyForms: function(forms) {
                    if (forms == undefined) {
                        forms = $("form.pmDirtyForm");
                    }
                    if (forms.length > 0) {
                        forms.dirty_form();
                        forms.data("dirty", false);
                        $("a[href!='#'],.pmFormFieldLinkButton").dirty_stopper();
                    }
                },
                getOperation: function(form) {
                    return $('input[name=\'operation\']:first', form);
                },
                prepareAction: function(element, action, operation) {
                    var form = $(element).parents('form:first');
                    form.attr('action', action);
                    this.getOperation(form).val(operation);
                    return true;
                },
                getPanelBarItems: function(form) {
                    var items = $(".pmPanelItem", form);
                    if (items.length < 1) {
                        // we didn't find panel items within form, so we might find one as a parent
                        items = $(form).parents(".pmPanelItem:first");
                    }
                    return items;
                },
                submitHandler: function(form) {
                    ///	<summary>
                    ///		1: $(form) - This function accepts a string containing a form
                    ///	</summary>
                    ///	<param name="form" type="String">
                    ///		1: expression - An expression to search with.
                    ///	</param>
                    var form = $(form);
                    var ns = Playmatcher.Web.UI.Forms;

                    $.ajax({
                        url: form.attr("action"),
                        type: form.attr("method"),
                        data: form.serialize(),
                        beforeSend: function() {
                            ns.getPanelBarItems(form).each(function() {
                                var item = new Playmatcher.Web.UI.PanelBars.PanelBarItem(this);
                                item.beforeSendAjax(ns.getOperation(form).val());
                            });
                        },
                        success: function(data) {
                            setTimeout(function() {
                                ns.getPanelBarItems(form).each(function() {
                                    var item = new Playmatcher.Web.UI.PanelBars.PanelBarItem(this);
                                    item.ajaxCallSuccess(ns.getOperation(form).val(), data);
                                });
                                // reset form
                                Playmatcher.Web.UI.Forms.setDirtyForms(form);
                            }, 750);
                        },
                        error: function(XMLHttpRequest, textStatus, errorThrown) {
                            ns.getPanelBarItems(form).each(function() {
                                var item = new Playmatcher.Web.UI.PanelBars.PanelBarItem(this);
                                item.ajaxCallError(ns.getOperation(form).val());
                            });
                        }
                    });
                    return false;
                }
            },
            Menu: {
                mouseOver: function(menu, args) {
                    $(args.get_item().get_element()).addClass("rmItemHover");
                },
                mouseOut: function(menu, args) {
                    $(args.get_item().get_element()).removeClass("rmItemHover");
                }
            },
            PanelBars: {
                defaults: {
                    panelBar: {
                        template: "<div class=\"pmPanel\"><ul class=\"pmPanelGroup\"></ul></div>",
                        panelCss: "pmPanel",
                        rootCss: "pmPanelGroup",
                        itemCss: "pmPanelItem"
                    },
                    panelBarItem: {
                        template: "<li class=\"pmPanelItem\"><a href=\"#\" class=\"pmPanelLink\"><span class=\"pmPanelText\"></span></a><div class=\"pmPanelContent\"></div></li>",
                        itemCss: "pmPanelItem",
                        linkCss: "pmPanelLink",
                        titleCss: "pmPanelText",
                        expandableCss: "pmPanelExpandable",
                        expandedCss: "pmPanelExpanded",
                        expandablePanelBarItems: ".pmPanelLink",
                        contentCss: "pmPanelContent",
                        contentFromId: "",
                        expanded: true,
                        expandSpeed: "normal",
                        collapseSpeed: "normal",
                        ajaxCallSuccess: null,
                        data: null
                    }
                },
                init: function() {
                },
                PanelBarItem: function(element, data, options) {
                    var self = this;
                    this.options = $.extend({}, Playmatcher.Web.UI.PanelBars.defaults.panelBarItem, options);
                    this.element = null;

                    this.init = function(data) {
                        if (element == undefined || element == null) {
                            this.element = $(self.options.template).parent();
                            self.toggle(self.options.expanded, false);
                        }
                        else {
                            this.element = $(element);
                        }
                        if (data != undefined) {
                            if (data.title != null) {
                                self.getTitle().text(data.title);
                            }
                            if (data.contentFromId.length > 0) {
                                var template = $(data.contentFromId).children();
                                self.getContent().append(Playmatcher.Web.UI.Templates.clone(template, data.data));
                            }
                        }
                        if (self.options.ajaxCallSuccess != undefined && self.options.ajaxCallSuccess != null) {
                            self.element.bind("ajaxCallSuccess", self.options.ajaxCallSuccess);
                        }
                        self.getLink().unbind("click");
                        self.getLink().click(self.click);
                    };
                    this.click = function() {
                        self.toggle();
                        return false;
                    };
                    this.getLink = function() {
                        return self.element.find("." + self.options.linkCss + ":first");
                    };
                    this.getTitle = function() {
                        return self.element.find("." + self.options.titleCss + ":first");
                    };
                    this.getContent = function() {
                        return self.element.find("." + self.options.contentCss + ":first");
                    };
                    this._handleLinkCss = function(addCss, removeCss) {
                        var link = self.getLink();
                        link.addClass(addCss);
                        link.removeClass(removeCss);

                    };
                    this.animate = function(obj, cmd) {
                        $(obj).animate({ height: cmd, opacity: cmd }, "slow");
                    };
                    this.expand = function(animate) {
                        self._handleLinkCss(self.options.expandedCss, self.options.expandableCss);
                        if (animate == undefined || animate) {
                            self.animate(self.getLink().next(), "show");
                        }
                        else {
                            self.getLink().next().show();
                        }

                    };
                    this.collapse = function(animate) {
                        self._handleLinkCss(self.options.expandableCss, this.options.expandedCss);
                        if (animate == undefined || animate) {
                            self.animate(self.getLink().next(), "hide");
                        }
                        else {
                            self.getLink().next().hide();
                        }

                    };
                    this.expanded = function() {
                        return self.getLink().hasClass(self.options.expandedCss);
                    };
                    this.toggle = function(expand, animate) {
                        if (expand == undefined) {
                            expand = !this.expanded();
                        }
                        if (!expand) {
                            self.collapse(animate);
                        }
                        else {
                            self.expand(animate);
                        }
                    };
                    this.beforeSendAjax = function(operation) {
                        if (operation == undefined) {
                            operation = "update";
                        }
                        var content = self.getContent();
                        if (operation != "update" || $(".pmFormFieldChanged", content).length > 0) {
                            self.collapse();
                            content.after("<div class='pmPanelBarSaving'><div><img src='/Images/Spinner.gif' alt='' /><span>Tallennetaan muutoksia...</span></div></div>");
                            Playmatcher.Web.UI.roundCorners({ selector: content.next(), fgc: "#D9D9D9" });
                        }
                    };
                    this.ajaxCallSuccess = function(operation, data) {
                        if (operation == undefined) {
                            operation = "update";
                        }
                        if (operation != "delete") {
                            var content = self.getContent();
                            var dirtyFields = $(".pmFormFieldChanged", content);
                            dirtyFields.removeClass("pmFormFieldChanged");
                            self.getContent().next().remove();
                            if (operation == "insert" || dirtyFields.length > 0) {
                                self.expand();
                            }
                        }
                        this.element.trigger("ajaxCallSuccess", [self, operation, data]);
                        if (operation == "delete") {
                            self.destroy();
                        }
                    };
                    this.ajaxCallError = function(operation) {
                    },
                    this.destroy = function() {
                        self.element.remove();
                        self.element = null;
                    };
                    this.init(data);
                },
                PanelBar: function(element, options) {
                    var self = this;
                    this.options = $.extend({}, Playmatcher.Web.UI.PanelBars.defaults.panelBar, options);
                    this.element = element == undefined || element == null ? $(self.options.template) : $(element);

                    this.init = function() {
                        if (!this.element.hasClass(self.options.panelCss)) {
                            // create panelbar from template
                            var element = $(self.options.template);
                            this.element = $(this.element.append(element).children()[0]);
                        }
                        else {
                            // attach existing panelbar items' events
                            this.element.find("." + self.options.itemCss).each(function() {
                                var item = new Playmatcher.Web.UI.PanelBars.PanelBarItem(this);
                                //item.getLink().click(item.click);
                            });
                        }
                    };
                    this.getRoot = function() {
                        return self.element.find("." + self.options.rootCss + ":first");
                    };
                    this.getItems = function() {
                        var items = new Array();
                        this.element.find("." + self.options.itemCss).each(function() {
                            items.push(new Playmatcher.Web.UI.PanelBars.PanelBarItem(this));
                        });
                        return items;
                    };
                    this.insert = function(pos, item) {
                        var root = self.getRoot();
                        var children = root.children();
                        var attachedItem;
                        if (children.length < 1) {
                            attachedItem = root.append(item.element);
                        }
                        else if (pos < children.length) {
                            attachedItem = item.element.insertBefore($(children[pos]));
                        }
                        else {
                            attachedItem = item.element.insertAfter($(children[children.length - 1]));
                        }
                        //item.element = attachedItem;
                        var link = item.getLink();
                        if ($(link.children()[0]).attr("class") != "rounded") {
                            Playmatcher.Web.UI.roundCorners({ selector: link });
                        }
                        link.click(item.click);
                    };
                    this.move = function(item, pos) {
                        self.insert(pos, new Playmatcher.Web.UI.PanelBars.PanelBarItem(item.element.clone()));
                        item.destroy();
                    }
                    this.append = function(item) {
                        self.insert(99999, item);
                    }
                    this.destroy = function() {
                        self.element.parent().remove(self.element);
                    };
                    this.beforeSendAjax = function() {

                    };
                    this.init();
                }
            }
        }
    }
}

function mygrid() {
    jQuery("#Grid").jqGrid({
        url: "/profile/getprofiles",
        datatype: "json",
        height: "100%",
        colNames: ['UserId', '', 'LocationDetail', 'Description', 'Nimi', 'Ikä', 'Pääharrastus', 'Paikkakunta', 'Km'],
        colModel: [
   		            { name: 'PlaymatcherId', index: 'PlaymatcherId', hidden: true },
   		            { name: 'PhotoId', index: 'PhotoId', width: 60, resizable: false, sortable: false, formatter: function(el, cellval, opts) {
   		                $("<img alt=''></img>")
   		                    .appendTo(el)
   		                    .attr("src", cellval);
   		            }
   		            },
   		            { name: 'LocationDetail', index: 'LocationDetail', hidden: true },
   		            { name: 'Name', index: 'Name', hidden: true },
   		            { name: 'DisplayName', index: 'DisplayName', width: 224, formatter: function(el, cellval, opts) {
   		                $("<a href='/profile/" + $(opts.rowData.childNodes[0]).text() + "'></a>")
   		                    .appendTo(el)
   		                    .text(cellval);
   		                $("<p style='font-size:9px;letter-spacing:0.01em;line-height:12px'></p>")
   		                    .appendTo(el)
   		                    .html($(opts.rowData.childNodes[3]).html());
   		            }
   		            },
   		            { name: 'Age', index: 'Birthdate', width: 32, resizable: false },
   		            { name: 'ActivityName', index: 'ActivityName', width: 100 },
   		            { name: 'LocationName', index: 'LocationName', width: 159, formatter: function(el, cellval, opts) {
   		                $(el).text(cellval);
   		                $("<div></div>").appendTo(el).text($(opts.rowData.childNodes[2]).text());
   		            }
   		            },
   		            { name: 'Distance', index: 'Distance', width: 35, resizable: false }
   	            ],
        width: 615,
        forceFit: true,
        imgpath: "/scripts/jquery/grid/themes/basic/images",
        mtype: "GET",
        pager: $('#GridPager'),
        prmNames: {
            rows: "RowsPerPage",
            sort: "SortByColumn",
            order: "SortOrder"
        },
        sortname: 'DisplayName',
        viewrecords: true,
        sortorder: "asc"
    });
}
