/* ***** BEGIN LICENSE BLOCK *****
 * Distributed under the BSD license:
 *
 * Copyright (c) 2010, Ajax.org B.V.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Ajax.org B.V. nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * ***** END LICENSE BLOCK ***** */

define(function (require, exports, module) {
    "use strict";

    var propertyMap = {
        "background": {"#$0": 1},
        "background-color": {"#$0": 1, "transparent": 1, "fixed": 1},
        "background-image": {"url('/$0')": 1},
        "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1},
        "background-position": {"bottom": 2, "center": 2, "left": 2, "right": 2, "top": 2, "inherit": 2},
        "background-attachment": {"scroll": 1, "fixed": 1},
        "background-size": {"cover": 1, "contain": 1},
        "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1},
        "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1},
        "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1},
        "border-color": {"#$0": 1},
        "border-style": {
            "solid": 2,
            "dashed": 2,
            "dotted": 2,
            "double": 2,
            "groove": 2,
            "hidden": 2,
            "inherit": 2,
            "inset": 2,
            "none": 2,
            "outset": 2,
            "ridged": 2
        },
        "border-collapse": {"collapse": 1, "separate": 1},
        "bottom": {"px": 1, "em": 1, "%": 1},
        "clear": {"left": 1, "right": 1, "both": 1, "none": 1},
        "color": {"#$0": 1, "rgb(#$00,0,0)": 1},
        "cursor": {
            "default": 1,
            "pointer": 1,
            "move": 1,
            "text": 1,
            "wait": 1,
            "help": 1,
            "progress": 1,
            "n-resize": 1,
            "ne-resize": 1,
            "e-resize": 1,
            "se-resize": 1,
            "s-resize": 1,
            "sw-resize": 1,
            "w-resize": 1,
            "nw-resize": 1
        },
        "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1},
        "empty-cells": {"show": 1, "hide": 1},
        "float": {"left": 1, "right": 1, "none": 1},
        "font-family": {
            "Arial": 2,
            "Comic Sans MS": 2,
            "Consolas": 2,
            "Courier New": 2,
            "Courier": 2,
            "Georgia": 2,
            "Monospace": 2,
            "Sans-Serif": 2,
            "Segoe UI": 2,
            "Tahoma": 2,
            "Times New Roman": 2,
            "Trebuchet MS": 2,
            "Verdana": 1
        },
        "font-size": {"px": 1, "em": 1, "%": 1},
        "font-weight": {"bold": 1, "normal": 1},
        "font-style": {"italic": 1, "normal": 1},
        "font-variant": {"normal": 1, "small-caps": 1},
        "height": {"px": 1, "em": 1, "%": 1},
        "left": {"px": 1, "em": 1, "%": 1},
        "letter-spacing": {"normal": 1},
        "line-height": {"normal": 1},
        "list-style-type": {
            "none": 1,
            "disc": 1,
            "circle": 1,
            "square": 1,
            "decimal": 1,
            "decimal-leading-zero": 1,
            "lower-roman": 1,
            "upper-roman": 1,
            "lower-greek": 1,
            "lower-latin": 1,
            "upper-latin": 1,
            "georgian": 1,
            "lower-alpha": 1,
            "upper-alpha": 1
        },
        "margin": {"px": 1, "em": 1, "%": 1},
        "margin-right": {"px": 1, "em": 1, "%": 1},
        "margin-left": {"px": 1, "em": 1, "%": 1},
        "margin-top": {"px": 1, "em": 1, "%": 1},
        "margin-bottom": {"px": 1, "em": 1, "%": 1},
        "max-height": {"px": 1, "em": 1, "%": 1},
        "max-width": {"px": 1, "em": 1, "%": 1},
        "min-height": {"px": 1, "em": 1, "%": 1},
        "min-width": {"px": 1, "em": 1, "%": 1},
        "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
        "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
        "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1},
        "padding": {"px": 1, "em": 1, "%": 1},
        "padding-top": {"px": 1, "em": 1, "%": 1},
        "padding-right": {"px": 1, "em": 1, "%": 1},
        "padding-bottom": {"px": 1, "em": 1, "%": 1},
        "padding-left": {"px": 1, "em": 1, "%": 1},
        "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
        "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1},
        "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1},
        "right": {"px": 1, "em": 1, "%": 1},
        "table-layout": {"fixed": 1, "auto": 1},
        "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1},
        "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1},
        "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1},
        "top": {"px": 1, "em": 1, "%": 1},
        "vertical-align": {"top": 1, "bottom": 1},
        "visibility": {"hidden": 1, "visible": 1},
        "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1},
        "width": {"px": 1, "em": 1, "%": 1},
        "word-spacing": {"normal": 1},

        // opacity
        "filter": {"alpha(opacity=$0100)": 1},

        "text-shadow": {"$02px 2px 2px #777": 1},
        "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1},

        // border radius
        "-moz-border-radius": 1,
        "-moz-border-radius-topright": 1,
        "-moz-border-radius-bottomright": 1,
        "-moz-border-radius-topleft": 1,
        "-moz-border-radius-bottomleft": 1,
        "-webkit-border-radius": 1,
        "-webkit-border-top-right-radius": 1,
        "-webkit-border-top-left-radius": 1,
        "-webkit-border-bottom-right-radius": 1,
        "-webkit-border-bottom-left-radius": 1,

        // dropshadows
        "-moz-box-shadow": 1,
        "-webkit-box-shadow": 1,

        // transformations
        "transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
        "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1},
        "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}
    };

    var CssCompletions = function () {

    };

    (function () {

        this.completionsDefined = false;

        this.defineCompletions = function () {
            //fill in missing properties
            if (document) {
                var style = document.createElement('c').style;

                for (var i in style) {
                    if (typeof style[i] !== 'string')
                        continue;

                    var name = i.replace(/[A-Z]/g, function (x) {
                        return '-' + x.toLowerCase();
                    });

                    if (!propertyMap.hasOwnProperty(name))
                        propertyMap[name] = 1;
                }
            }

            this.completionsDefined = true;
        }

        this.getCompletions = function (state, session, pos, prefix) {
            if (!this.completionsDefined) {
                this.defineCompletions();
            }

            var token = session.getTokenAt(pos.row, pos.column);

            if (!token)
                return [];
            if (state === 'ruleset') {
                //css attribute value
                var line = session.getLine(pos.row).substr(0, pos.column);
                if (/:[^;]+$/.test(line)) {
                    /([\w\-]+):[^:]*$/.test(line);

                    return this.getPropertyValueCompletions(state, session, pos, prefix);
                } else {
                    return this.getPropertyCompletions(state, session, pos, prefix);
                }
            }

            return [];
        };

        this.getPropertyCompletions = function (state, session, pos, prefix) {
            var properties = Object.keys(propertyMap);
            return properties.map(function (property) {
                return {
                    caption: property,
                    snippet: property + ': $0',
                    meta: "property",
                    score: Number.MAX_VALUE
                };
            });
        };

        this.getPropertyValueCompletions = function (state, session, pos, prefix) {
            var line = session.getLine(pos.row).substr(0, pos.column);
            var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1];

            if (!property)
                return [];
            var values = [];
            if (property in propertyMap && typeof propertyMap[property] === "object") {
                values = Object.keys(propertyMap[property]);
            }
            return values.map(function (value) {
                return {
                    caption: value,
                    snippet: value,
                    meta: "property value",
                    score: Number.MAX_VALUE
                };
            });
        };

    }).call(CssCompletions.prototype);

    exports.CssCompletions = CssCompletions;
});
