// 
// Blurb (v. 1.5) jQuery Plug-ins
// Todd Heasley, theasley@urbanoutfitters.com
// Copyright 2008-2009 Urban Outfitters Direct
// GPL'd (http://www.gnu.org/licenses/gpl.txt)
// 

jQuery.fn.blurbPaginate = function(type) {
    var name = $(this).attr("name");
    var element = "select[name='" + name + "']";
    var pages = parseInt($(element + " option").length);
    var page = parseInt($(element + " option:selected").attr("value"));
    var string = "";
    
    if (type == 1) {
        if (page > 1) {
            string += "<a name=\"" + name + "-back\" href=\"\">PREV</a>";
            if (page < pages) {
                string += " | ";
            } 
        }
        if (page < pages) {
            string += "<a name=\"" + name + "-next\" href=\"\">NEXT</a>";
        }
    } else {
        if (pages <= 5) {
            back = 1;
            next = pages;
        } else {
            back = page - 2; 
            next = page + 2;
            if (back <= 0) {
                next = (next + 1) - back;
                back = 1;
            }
            if (next > pages) {
                back = back - (next - pages);
                next = pages;
            }
        }
        for (var i = back; i <= next; i++) {
            if (i == page) {
                string += page;
            } else {
                string += "<a class=\"blurb-page\" href=\"\">" + i + "</a>";
            }
            if (i < pages) {
                string += " ";
            }
        }
        if (back > 1) {
            string = "<a class=\"blurb-page\" href=\"\">1</a> ... " + string;
        }
        if (next < pages) {
            string += " ... <a class=\"blurb-page\" href=\"\">" + pages + "</a>";
        }
    }
    
    $(element).replaceWith("<input type=\"hidden\" name=\"" + name + "\" value=\"\" />" + string);
    $("a.blurb-page").click(function() {
        $("input[name='" + name + "']").val($(this).text());
        $(this).parents("form").submit();
        return false;
    });
    $("a[name='" + name + "-back']").click(function() {
        $("input[name='" + name + "']").attr("value", page - 1);
        $(this).parents("form").submit();
        return false;
    });
    $("a[name='" + name + "-next']").click(function() {
        $("input[name='" + name + "']").val(page + 1);
        $(this).parents("form").submit();
        return false;
    });
}

jQuery.fn.blurbFile = function(root, file, preview) {
    $(this).each(function() {
        var monitor;
        var input = $(this);
        var iframe = document.createElement("iframe");
        var toggle;
        
        $(iframe).attr({src: file, frameBorder: 0, frameMargin: 0, framePadding: 0, scrolling: "no"});
        if (input.attr("class")) {
            $(iframe).addClass(input.attr("class"));
        }
        input.parent().addClass("blurb-file");
        input.before("<a class=\"blurb-highlight\" href=\"\">UPLOAD</a> ");
        if (preview == 1) {
            input.after(" <a href=\"\">Preview</a> <span></span>");
            input.next("a").click(function() {
                var value = input.val();
                if (value.match(".m4a") || value.match(".mp3")) {
                    value = "<embed src=\"" + value + "\" autoplay=\"false\" height=\"20\" pluginspage=\"http://www.apple.com/quicktime/download/\" />";
                } else if (value.match(".mov")) {
                    value = "<embed src=\"" + value + "\" autoplay=\"false\" width=\"600\" height=\"400\" bgcolor=\"#DDDDDD\" pluginspage=\"http://www.apple.com/quicktime/download/\" />";
                } else if (value.match(".png") || value.match(".gif") || value.match(".jpg")) {
                    value = "<img src=\"" + value + "\" alt=\"" + value + "\" />";
                } else if (value.match(".zip")) {
                    value = "<a href=\"" + value + "\"><img src=\"" + root + "misc/blurb_download.gif\" alt=\"DOWNLOAD\" /></a>";
                } else {
                    value = "<img src=\"" + root + "misc/blurb_unknown.gif\" alt=\"?\" />";
                }
                var span = $(this).next("span");
                if (span.html() == "") {
                    span.html(value);
                } else {
                    span.empty();
                }
                return false;
            });
        }
        
        toggle = input.prev("a");
        toggle.click(function() {
            $(this).parent().children("span").empty();
            $(this).toggleClass("blurb-highlight");
            $(this).toggleClass("blurb-selected");
            if ($(this).hasClass("blurb-selected")) {
                enable();
            } else {
                disable();
            }
            return false;
        });
        
        $("form").submit(function() {
            disble();
        });
        
        function enable() {
            input.next("a").hide();
            input.hide().after(iframe);
            
            monitor = setInterval(checkValue, 100);
            function checkValue() {
                var value = getValue();
                if (value !== 0) {
                    clearInterval(monitor);
                    toggle.trigger("click");
                }
            }
        }
        
        function disable() {
            clearInterval(monitor);
            var value = getValue();
            if (value.length > 0) {
                input.attr("value", value).removeClass("blurb-blur");
            }
            $(iframe).remove();
            input.show();
            input.next("a").show();
        }
        
        function getValue() {
            var value = iframe.contentWindow.document.getElementsByTagName("input")[0];
            if (value.type == "hidden") {
                return value.value;
            } else {
                return 0;
            }
        }
    });
}

jQuery.fn.blurbEdit = function(root, file) {
    
    // 
    // Based on jQuery RTE plugin
    // http://batiste.dosimple.ch/blog/2007-09-11-1/
    // c 2007 Batiste Bieler
    // 
    
    if (document.designMode || document.contentEditable) {
        $(this).each(function() {
            enable($(this));
        });
        
        $("form").submit(function() {
            var iframes = document.getElementsByTagName("iframe")
            for (var i = 0; i < iframes.length; i++) {
                if ($(iframes[i]).attr("name").length > 0) {
                    $(this).append("<textarea style=\"display: none;\" name=\"" + $(iframes[i]).attr("name") + "\">" + iframes[i].contentWindow.document.getElementsByTagName("body")[0].innerHTML + "</textarea>");
                }
            }
        });
    }
    
    function tryEnable(iframe, src, callback) {
        try {
            iframe.contentWindow.document.open();
            iframe.contentWindow.document.write(src);
            iframe.contentWindow.document.close();
        } catch(e) {
            console.log(e);
        }
        if (document.contentEditable) {
            iframe.contentWindow.document.designMode = "on";
            callback();
            return true;
        } else if (document.designMode != null) {
            try {
                iframe.contentWindow.document.designMode = "on";
                callback();
                return true;
            } catch (e) {
                console.log(e)
            }
        }
        
        setTimeout(function () {
            tryEnable(iframe, src, callback)
        }, 250);
        return false;
    }
    
    function enable(textarea) {
        var iframe = document.createElement("iframe");
        iframe.frameBorder = 0;
        iframe.frameMargin = 0;
        iframe.framePadding = 0;
        if (textarea.attr("class")) {
            iframe.className = textarea.attr("class");
        }
        if (textarea.attr("id")) {
            iframe.id = textarea.attr("id");
        }
        if (textarea.attr("name")) {
            iframe.name = textarea.attr("name");
        }
        textarea.after(iframe);
        var content = textarea.val();
        if ($.trim(content) == "") {
            content = "";
        }
        var src = "<html><body>" + content + "</body></html>";
        tryEnable(iframe, src, function() {
            textarea.prev().remove();
            textarea.remove();
            $(iframe).before(menu(iframe));
        });
    }
    
    function disable(iframe) {
        var textarea = $("<textarea>" + iframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML + "</textarea>");
        element = textarea.get(0);
        if (iframe.className) {
            element.className = iframe.className;
        }
        if (iframe.id) {
            element.id = iframe.id;
        }
        if (iframe.name) {
            element.name = iframe.name;
        }
        $(iframe).before(textarea);
        $(iframe).remove();
        return textarea;
    }
    
    function menu(iframe) {
        var menu = $("<span class=\"blurb-edit\"><a class=\"blurb-selected\" href=\"\">RICH TEXT</a> </span> ");
        menu.append("<a href=\"\" name=\"blurb-edit-b\"><img src=\"" + root + "misc/blurb_edit_b.gif\" alt=\"[B]\" /></a>");
        menu.append("<a href=\"\" name=\"blurb-edit-i\"><img src=\"" + root + "misc/blurb_edit_i.gif\" alt=\"[I]\" /></a>");
        menu.append("<a href=\"\" name=\"blurb-edit-a\"><img src=\"" + root + "misc/blurb_edit_a.gif\" alt=\"[A]\" /></a>");
        menu.append("<a href=\"\" name=\"blurb-edit-img\"><img src=\"" + root + "misc/blurb_edit_img.gif\" alt=\"[IMG]\" /></a>");
        menu.append("<a href=\"\" name=\"blurb-edit-left\"><img src=\"" + root + "misc/blurb_edit_left.gif\" alt=\"[<<]\" /></a>");
        menu.append("<a href=\"\" name=\"blurb-edit-center\"><img src=\"" + root + "misc/blurb_edit_center.gif\" alt=\"[><]\" /></a>");
        
        menu.append(" <span></span>");
        $("span", menu).hide();
        
        $("a.blurb-selected, a.blurb-highlight", menu).click(function() {
            var dis = disable(iframe);
            $(this).parent().empty().append($(this));
            $(this).removeClass("blurb-selected").addClass("blurb-highlight").click(function() {
                enable(dis);
                return false;
            });
            return false; 
        });
        $("a[name='blurb-edit-b']", menu).click(function() {
            format(iframe, "bold");
            return false;
        });
        $("a[name='blurb-edit-i']", menu).click(function() {
            format(iframe, "italic");
            return false;
        });
        $("a[name='blurb-edit-a']", menu).click(function() {
            if ($("span", menu).hasClass("blurb-edit-url")) {
                $("span", menu).empty().hide();
            } else {
                $("span", menu).html("<input class=\"blurb-text-long\" type=\"text\" value=\"\" title=\"URL\" /> <input type=\"checkbox\" />New window <a name=\"blurb-url-link\" href=\"\">Insert</a>").show();
                $("span input", menu).blurbHint();
            }
            $("span", menu).toggleClass("blurb-edit-url");
            $("span", menu).removeClass("blurb-edit-img");
            $("span a[name='blurb-url-link']", menu).click(function() {
                var url = $("span input", menu).attr("value");
                if (url.length > 0 && url != $("span input", menu).attr("title")) {
                    if ($("input:checked", menu).length > 0) {
                        url += "\" target=\"_blank";
                    }
                    format(iframe, "CreateLink", url);
                    $("span", menu).toggleClass("blurb-edit-url");
                }
                $("span", menu).empty().hide();
                return false;
            });
            return false;
        });
        $("a[name='blurb-edit-img']", menu).click(function() {
            if ($("span", menu).hasClass("blurb-edit-img")) {
                $("span", menu).empty().hide();
            } else {
                $("span", menu).html("<input class=\"blurb-file\" type=\"text\" value=\"\" title=\"File URL\" /> <a name=\"blurb-file-link\" href=\"\">Insert</a>").show();
                $("span input", menu).blurbHint();
                $("span input", menu).blurbFile(root, file);
            }
            $("span", menu).toggleClass("blurb-edit-img");
            $("span", menu).removeClass("blurb-edit-url");
            $("span a[name='blurb-file-link']", menu).click(function() {
                var img = $("span input", menu).attr("value");
                if (img.length > 0) {
                    format(iframe, "InsertImage", img);
                    $("span", menu).toggleClass("blurb-edit-img");
                }
                $("span", menu).empty().hide();
                return false;
            });
            
            return false;
        });
        $("a[name='blurb-edit-left']", menu).click(function() {
            format(iframe, "justifyleft");
            return false;
        });
        $("a[name='blurb-edit-center']", menu).click(function() {
            format(iframe, "justifycenter");
            return false;
        });
        var iframeDoc = $(iframe.contentWindow.document);
        iframeDoc.mouseup(function() {
            setSelected(getSelection(iframe), select);
            return true;
        });
        iframeDoc.keyup(function() {
            setSelected(getSelection(iframe), select);
            return true;
        });
        return menu;
    }
    
    function format(iframe, command, option) {
        iframe.contentWindow.focus();
        try {
            iframe.contentWindow.document.execCommand(command, false, option);
        } catch(e) {
            console.log(e);
        }
        iframe.contentWindow.focus();
    }
    
    function setSelected(node, select) {
        while(node.parentNode) {
            var name = node.nodeName.toLowerCase();
            for(var i = 0; i < select.options.length; i++) {
                if (name == select.options[i].value) {
                    select.selected = i;
                    return true;
                }
            }
            node = node.parentNode;
        }
        select.selected = 0;
        return true;
    }
    
    function getSelection(iframe) {
        if (iframe.contentWindow.document.selection) {
            selection = iframe.contentWindow.document.selection;
            range = selection.createRange();
            try {
                node = range.parentElement();
            } catch (e) {
                return false;
            }
        } else {
            try {
                selection = iframe.contentWindow.getSelection();
                range = selection.getRangeAt(0);
            } catch(e) {
                return false;
            }
            node = range.commonAncestorContainer;
        }
        return node;
    }
}
 
jQuery.fn.blurbHint = function() {
    $(this).each(function() {
        var element = $(this);
        var hint = element.attr("title");
        
        if (hint) {
            element.focus(function() {
                if (element.val() == hint && element.hasClass("blurb-blur")) {
                    element.val("").removeClass("blurb-blur");
                }
            });
            element.blur(function() {
                if (element.val() == "") {
                    element.val(hint).addClass("blurb-blur");
                }
            });
            $("form").submit(function() {
                   element.focus();
            });
            element.blur();
        }
    });
}

jQuery.fn.blurbHide = function() {
    $(this).each(function() {
        var element = $(this);
        var title = element.attr("title");
        var className = "";
        if (element.attr("class")) {
            className = "class=\"" + element.attr("class") + "\" ";
        }
        if (title) {
            element.wrap("<div></div>").hide().before("<p><a " + className + "href=\"\">" + title + "</a></p>");
            element.prev().children("a").click(function() {
                var parent = element.parent();
                if (parent.hasClass("blurb-highlight")) {
                    parent.removeClass("blurb-highlight");
                } else {
                    parent.addClass("blurb-highlight");
                }
                element.toggle();
                return false;
            });
        }
    });
}

jQuery.fn.blurbCalendar = function(calendar, limit) {
    var id = $(this).attr("id");
    var parent = $(this).parent();
    var now = new Date();
    
    enable();
    
    function enable() {
        text = $("#" + id + " td[colspan='7']").text();
        $("#" + id + " td[colspan='7']").replaceWith("<td><a name=\"" + id + "-back\" href=\"\"><</a></td><td colspan=\"5\"><a name=\"" + id + "\" href=\"\">" + text + "</a></td><td><a name=\"" + id + "-next\" href=\"\">></a></td>");
        text = text.split("/");
        text[0] = parseInt(text[0]);
        text[1] = parseInt(text[1]);
        
        $("#" + id + " table em").each(function() {
            $(this).wrap("<a href=\"\"></a>").parent().click(function() {
                text[2] = $(this).text();
                text[2] = parseInt(text[2]);
                $(parent).load(calendar, { year:text[1], month:text[0], day:text[2] }, enable);
                return false;
            });
        });
        
        truncate();
        
        if (text[1] == now.getFullYear() && text[0] == now.getMonth() + 1) {
            $("a[name='" + id + "-back']").hide();
        }
        
        $("a[name='" + id + "-back']").click(function() {
            text[0] = text[0] - 1;
            if (text[0] < 1) {
                text[1] = text[1] - 1;
                text[0] = 12;
            }
            $(parent).load(calendar, { year:text[1], month:text[0] }, enable);
            return false;
        });
        $("a[name='" + id + "-next']").click(function() {
            text[0] = text[0] + 1;
            if (text[0] > 12) {
                text[1] = text[1] + 1;
                text[0] = 1;
            }
            $(parent).load(calendar, { year:text[1], month:text[0] }, enable);
            return false;
        });
        $("a[name='" + id + "']").click(function() {
            $(parent).load(calendar, { year:text[1], month:text[0] }, enable);
            return false;
        });
        
        $("#" + id + " p > span").hide();
        $("#" + id + " p em").wrap("<a href=\"\"></a>").parent().click(function() {
            $(this).next().toggle();
            return false;
        });
        
        function truncate() {
            events = $("#" + id + " p");
            if (events.length > limit) {
                for (var i = limit; i < events.length; i++) {
                    $(events[i]).addClass(id + "-more");
                }
                $("." + id + "-more").hide();
                $("a[name='" + id + "-more']").remove();
                $("#" + id).append("<p><a name=\"" + id + "-more\" href=\"\">more >></a></p>");
                $("a[name='" + id + "-more']").click(function() {
                    $("." + id + "-more").show();
                    $(this).text("<< less").click(truncate);
                    return false;
                });
            }
        }
    }
}

jQuery.fn.blurbDays = function(year, month) {
    var day = "select[name='" + $(this).attr("name") + "']";
    
    $(year + ", " + month).change(function() {
        $(day + " option:disabled").removeAttr("disabled");
        
        value = $(month + " option:selected").attr("value");
        if (value == 2 || value == 4 || value == 6 || value == 9 || value == 11) {
            $(day + " option[value='31']").attr("disabled", "disabled");
            if (value == 2) {
                $(day + " option[value='30']").attr("disabled", "disabled");
                if ($(year + " option:selected").attr("value") % 4 !== 0) {
                    $(day + " option[value='29']").attr("disabled", "disabled");
                }
            }
        }
    });
}

jQuery.fn.blurbNow = function(year, month, day, hour, minute, meridiem) {
    $(this).append(" <a name=\"blurb-now\" href=\"\">Now</a>");
    $("a[name='blurb-now']").click(function() {
        var now = new Date();
        var hourNow = now.getHours();
        var meridiemNow;
        if (hourNow > 11) {
            meridiemNow = "PM";
            if (hourNow > 12) {
                hourNow = hourNow - 12;
            }
        } else {
            meridiemNow = "AM";
            if (hourNow == 0) {
                hourNow = 12;
            }
        }
        
        $(year + " option:selected").removeAttr("selected");
        $(year + " option[value='" + now.getFullYear() + "']").attr("selected", "selected");
        $(month + " option:selected").removeAttr("selected");
        $(month + " option[value='" + format(now.getMonth() + 1) + "']").attr("selected", "selected");
        $(day + " option:selected").removeAttr("selected");
        $(day + " option[value='" + format(now.getDate()) + "']").attr("selected", "selected");
        $(hour + " option:selected").removeAttr("selected");
        $(hour + " option[value='" + format(hourNow) + "']").attr("selected", "selected");
        $(minute + " option:selected").removeAttr("selected");
        $(minute + " option[value='" + format(now.getMinutes()) + "']").attr("selected", "selected");
        $(meridiem + " option:selected").removeAttr("selected");
        $(meridiem + " option[value='" + meridiemNow + "']").attr("selected", "selected");
        
        function format(number) {
            if (String(number).length < 2) {
                number = "0" + number;
            }
            return number;
        }
        
        return false;
    });
}

jQuery.fn.blurbURL = function(target, separator) {
    var element = $(this);
    var value = "";
    
    element.keyup(function() {
        if (element.attr("value") != value) {
        var url = element.attr("value");
        url = url.toLowerCase();
        url = url.replace(/\s+/g, separator);
        url = url.replace(/\//g, separator);
        url = url.replace(/[^a-z0-9-_]/g, "");
        target.attr("value", url).removeClass("blurb-blur");
        value = element.attr("value");
        }
    });
    
    element.blur(function() {
        target.blur();
    });
}

jQuery.fn.blurbSelect = function() {
    $(this).each(function() {
        var element = $(this);
        
        element.after(" <select class=\"blurb-text\" multiple disabled></select>");
        element.change(function() {
            var selected = "";
            
            element.children("option:selected").each(function() {
                selected += "<option>" + $(this).text() + "</option>";
            });
            element.next("select").html(selected);
        }).change();
    });
}
