/**
 * Forms class to generate form input fields
 * @author Robin van Baalen <robin@stylr.nl>
 * @link http://stylr.nl
 *
 * @version 0.2.2
 *
 * CHANGELOG
 *	0.1		First release
 *	0.2		Prototyped the Forms class
 *	0.2.1	Initiate the class directly
 *	0.2.2	Added Forms.small() function
 */

function Forms(){
    
}
/**
 * New text input field
 */
Forms.prototype.text = function(strLabel, strId, blnOptional){
    var $objBase    = this.__base(blnOptional),
        $objText    = this.__input("text"),
        $objLabel   = this.__label(strLabel, strId);

    $objText
        .attr("name", strId)
        .attr("id", strId)
        .addClass("vf__text");
        
    $objLabel.appendTo($objBase);
    $objText.appendTo($objBase);

    return $objBase;
}

Forms.prototype.textarea = function(strLabel, strId, blnOptional){
    var $objBase    = this.__base(blnOptional),
        $objArea    = this.__textarea(),
        $objLabel   = this.__label(strLabel, strId);

    $objArea
        .attr("id", strId)
        .attr("name", strId)
        .attr("rows", 5)
        .attr("cols", 21)
        .addClass("vf__text");

    $objLabel.appendTo($objBase);
    $objArea.appendTo($objBase);

    return $objBase;
}

Forms.prototype.button = function(strLabel, callback){
    var $objBase    = this.__nav(),
        $objButton  = this.__input("button"),
        callback    = callback || function(){ console.warn("No callback specified for " + strLabel);};

    $objButton
        .val(strLabel)
        .addClass("vf__button")
        .appendTo($objBase)
        .unbind("click")
        .bind("click", callback);

    return $objBase;
}

Forms.prototype.small = function(strContent){
	return $("<small class='vf__tip'>" + strContent + "</small>");
}

Forms.prototype.startMarkup = function(strMsg){
    return $("<small class='vf__tip'><a href='#' class='startEditor'>" + strMsg + "</a></small>");
}

Forms.prototype.success = function(strMsg){
    var $objMsg = this.__message();

    $objMsg
        .addClass("success")
        .text(strMsg);

    return $objMsg;
}

Forms.prototype.error = function(strMsg){
    var $objMsg = this.__message();

    $objMsg.addClass("error");
    $objMsg.text(strMsg);
    
    return $objMsg;
}

Forms.prototype.__message = function(){
    return $("<span class='input-notification></span>");
}

Forms.prototype.__textarea = function(){
    return $("<textarea></textarea>");
}

Forms.prototype.__input = function(strType){
    return $("<input type=\"" + strType + "\" />");
}

Forms.prototype.__label = function(strLabel, strId){
    return $("<label for=\"" + strId + "\">" + strLabel + "</label>");
}

/**
 * Base structure
 *
 * @param boolean blnOptional If true, the base class is optional, false for required
 * @return object jQuery object of the base structure.
 */
Forms.prototype.__base = function(blnOptional){
    var blnOptional = blnOptional || false,
        strOptional = (blnOptional) ? "required" : "optional";

    return $("<div class=\"vf__" + strOptional + "\"></div>");
}

Forms.prototype.__nav = function(){
    var $objNav    = this.__base();

    $objNav
        .removeClass()
        .addClass("vf__navigation");

    return $objNav;
}

/**
 * Make Forms class available to all other javascripts
 */
var Forms = new Forms();
