var LFM = {
    set: function (namespace, property) {
        if (!LFM[namespace]) {
            LFM[namespace] = property;
        } else {
            for (key in property) {
                LFM[namespace][key] = property[key];
            }
        }
    },
    get: function (namespace, key) {
        if (!LFM[namespace]) {
            return false;
        }
        return LFM[namespace][key];
    },
    
    setCookie: function (name, val, expiry, path, domain) {
        if (!path) {
            path = '/';
        }
        if (!domain) {
            domain = '.last.fm';
        }
        if (!expiry) {
            var expiry = new Date();
            expiry = expiry.getTime();
            expiry = new Date(expiry + 365*24*3600*1000);
        }
        var cookie = name + "=" + escape(val) + ";expires=" + expiry.toGMTString() + ';path=' + path + ';domain=' + domain;
        log(cookie);
        document.cookie = cookie;
    },
    
    deleteCookie: function(name, path, domain) {
        LFM.setCookie(name, '', new Date(0), path, domain);
    },
    
    getCookie: function (c_name) {
        if (document.cookie.length > 0) {
            c_start=document.cookie.indexOf(c_name + "=");
            if (c_start != -1) {
                c_start = c_start + c_name.length + 1;
                c_end = document.cookie.indexOf(";", c_start);
                if (c_end == -1) {
                    c_end = document.cookie.length;
                }
                return unescape(document.cookie.substring(c_start, c_end));
            }
        }
        return null;
    },
    
    Methods: {
        getResource: function (element, property) {
            var res = element.id.substr(1).split('_');
            var resource = {
                type: res[0],
                id: res[1]
            };
            return property ? resource[property] : resource;
        },
        
        scrollToDescendant: function (element, child, options) {
            element = $(element);
            child = $(child);
            var positionedOffset = child.positionedOffset();
            options = options || { };
            //console.log(positionedOffset, "positionedOffset", Math.max(positionedOffset.top - 30, 0));
            return new Effect.Tween(null,
                element.scrollTop,
                Math.max(positionedOffset.top - 30, 0),
                options,
                function(p){ element.scrollTop = p.round(); }
            );
        },
        
        incrementAttribute: function (element, attribute) {
            // increments the first occurance of a numeric character in an element’s attribute
            // use this to dynamically generate inputs by cloning previous once etc.
            // sample: clonedNode[i].htmlFor = clonedNode[i].incrementAttribute("htmlFor");
            if (element[attribute]) {
                var newId = element[attribute].match(/\d+/);
                if (newId && !isNaN(newId[0])) {
                    newId = newId[0] * 1 + 1;
                    newId = element[attribute].replace(/(\D*)(\d*)(\D*)/, '$1' + newId + '$3');
                } else {
                    newId = element[attribute] + "1";
                }
                return newId;
            } else {
                return "";
            }
        },
        
        isInViewport: function (element)
        {
            var offset = element.cumulativeOffset();
            var viewportScrollOffset = document.viewport.getScrollOffsets().top;
            var min = viewportScrollOffset;
            var max = viewportScrollOffset + document.viewport.getHeight();
            return !(offset.top < min || offset.top > max);
        }
    }
};

Element.addMethods(LFM.Methods);
