/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.    
 */

/**
 * SCDL parsing functions.
 */
var scdl = {};

/**
 * Returns a composite element.
 */
scdl.composite = function(l) {
    var cs = namedElementChildren("'composite", l);
    if (isNull(cs))
        return cs;
    return car(cs);
};

/**
 * Returns a list of components in a composite.
 */
scdl.components = function(l) {
    var cs = namedElementChildren("'composite", l);
    if (isNull(cs))
        return cs;
    return namedElementChildren("'component", car(cs));
};

/**
 * Returns a list of service promotions in a composite.
 */
scdl.promotions = function(l) {
    var cs = namedElementChildren("'composite", l);
    if (isNull(cs))
        return cs;
    return namedElementChildren("'service", car(cs));
};

/**
 * Returns the target of a service promotion.
 */
scdl.promote = function(l) {
    var puri = namedAttributeValue("'promote", l);
    if (isNull(puri))
        return puri;
    return car(tokens(puri));
};

/**
 * Returns the name of a component, componentType, service or reference.
 */
scdl.name = function(l) {
    return namedAttributeValue("'name", l);
};

/**
 * Returns the description of a component, componentType, service or reference.
 */
scdl.documentation = function(l) {
    var d = namedElementChildren("'documentation", l);
    if (isNull(d))
        return null;
    if (!elementHasValue(car(d)))
        return null;
    var v = elementValue(car(d));
    return v;
};

/**
 * Returns the title of a component or componentType.
 */
scdl.title = function(l) {
    return namedAttributeValue("'title", l);
};

/**
 * Returns the display style of a component, componentType, reference or property.
 */
scdl.style = function(l) {
    return namedAttributeValue("'style", l);
};

/**
 * Returns the color of a component or componentType.
 */
scdl.color = function(l) {
    return namedAttributeValue("'color", l);
};

/**
 * Returns the x position of a component.
 */
scdl.x = function(l) {
    return namedAttributeValue("'x", l);
};

/**
 * Returns the y position of a component.
 */
scdl.y = function(l) {
    return namedAttributeValue("'y", l);
};

/**
 * Returns the implementation of a component.
 */
scdl.implementation = function(l) {
    function filterImplementation(v) {
        return isElement(v) && cadr(v).match("implementation.") != null;
    }

    var n = filter(filterImplementation, l);
    if (isNull(n))
        return null;
    return car(n);
};

/**
 * Returns the type of a component or componentType implementation.
 */
scdl.implementationType = function(l) {
    return elementName(l).substring(1);
};

/**
 * Returns the URI of a service, reference or implementation.
 */
scdl.uri = function(l) {
    return namedAttributeValue("'uri", l);
};

/**
 * Returns the align attribute of a service or reference.
 */
scdl.align = function(l) {
    return namedAttributeValue("'align", l);
};

/**
 * Returns the visible attribute of a service or reference.
 */
scdl.visible = function(l) {
    return namedAttributeValue("'visible", l);
};

/**
 * Returns the clonable attribute of a reference.
 */
scdl.clonable = function(l) {
    return namedAttributeValue("'clonable", l);
};

/**
 * Returns a list of services in a component or componentType.
 */
scdl.services = function(l) {
    return namedElementChildren("'service", l);
};

/**
 * Returns a list of references in a component or componentType.
 */
scdl.references = function(l) {
    return namedElementChildren("'reference", l);
};

/**
 * Returns a list of bindings in a service or reference.
 */
scdl.bindings = function(l) {
    function filterBinding(v) {
        return isElement(v) && cadr(v).match("binding.") != null;
    }

    return filter(filterBinding, l);
};

/**
 * Returns the type of a binding.
 */
scdl.bindingType = function(l) {
    return elementName(l).substring(1);
};

/**
 * Returns the target of a reference.
 */
scdl.target = function(l) {
    function targetURI() {
        function bindingsTarget(l) {
            if (isNull(l))
                return null;
            var u = scdl.uri(car(l));
            if (!isNull(u))
                return u;
            return bindingsTarget(cdr(l));
        }
    
        var t = namedAttributeValue("'target", l);
        if (!isNull(t))
            return t;
        return bindingsTarget(scdl.bindings(l));
    }
    var turi = targetURI();
    if (isNull(turi))
        return turi;
    return car(tokens(turi));
};

/**
 * Returns a list of properties in a component or componentType.
 */
scdl.properties = function(l) {
    return namedElementChildren("'property", l);
};

/**
 * Returns the value of a property.
 */
scdl.propertyValue = function(l) {
    if (!elementHasValue(l))
        return '';
    return elementValue(l);
};

/**
 * Convert a list of elements to a name -> element assoc list.
 */
scdl.nameToElementAssoc = function(l) {
    if (isNull(l))
        return l;
    return cons(mklist(scdl.name(car(l)), car(l)), scdl.nameToElementAssoc(cdr(l)));
};

