/**
 * @author Wrzasq <wrzasq@gmail.com>
 * @copyright 2008 - 2010 (C) by Wrzasq
 * @package WrzasqCMF
 * @version 0.0.1
 */

// pagination creation
Element.addMethods( {
	paginate: function(element, count, current, href, closure) {
		element = $(element);
		
        // first page link
        if(current > 1)
        {
            element.insert( new Element("a", {
            	href: href + "1",
            	rel: "start"
            } ).update("«").observe("click", closure(1) ) ).insert(" ");
        }

        // previous page link
        if(current > 2)
        {
            element.insert( new Element("a", {
            	href: href + (current - 1),
            	rel: "prev",
            	rev: "next"
            } ).update("‹").observe("click", closure(current - 1) ) ).insert(" ");
        }

        var stop = current + 5;
        stop = stop > count ? count : stop;

        var start = current - 5;
        start = start < 1 ? 1 : start;
        start = start + 5 > stop ? start - (start + 5 - stop) : start;

        // page links
        for(var i = start; i <= stop; ++i)
        {
            // skips pre-first pages
            if(i < 1)
            {
                continue;
            }

            // no more pages
            if(i > count)
            {
                break;
            }

            // current page
            if(i == current)
            {
                element.insert( new Element("span").update(i) );
            }
            // pager link
            else
            {
                element.insert( new Element("a", {
                	href: href + i
                } ).update(i).observe("click", closure(i) ) );
            }

            element.insert(" ");
        }

        // next page link
        if(current < count - 1)
        {
            element.insert( new Element("a", {
            	href: href + (current + 1),
            	rel: "next",
            	rev: "prev"
            } ).update("›").observe("click", closure(current + 1) ) ).insert(" ");
        }

        // last page link
        if(current < count)
        {
            element.insert( new Element("a", {
            	href: href + count
            } ).update("»").observe("click", closure(count) ) );
        }

		return element;
	}
} );

// dynamic forms
Element.addMethods("form", {
	render: function(element, source) {
		element = $(element);
	
	    // form elements container
	    var table = new Element("fieldset");

	    // temporary variables
	    var field;
	    var input;
	    var row;
	    var label;
	    var j;
	
	    // common settings
	    element.action = source.action;
	    element.method = source.method;

	    // form title
	    if(source.title)
	    {
	    	table.insert( new Element("legend").update(source.title) );
	    }

	    // elements ID
	    if(source.id)
	    {
	    	element.id = source.id;
	    }
	
	    // CSS class
	    if(source["class"])
	    {
	    	element.addClassName(source["class"]);
	    }
	
	    // form fields
	    for(var i in source.fields)
    	{
	    	// current field
	    	field = source.fields[i];
	    	
	    	// new table row for field
	    	row = new Element("div");
	    	
	    	if(field.label)
	    	{
	    		field.label = new Element("span").update(field.label + ":");
	    	}
	    	
	    	switch(field.component)
	    	{
                // standard input
                case "FormField":
                    input = new Element("input", {
                        type: field.type,
                        name: field.name
                    } ).addClassName("input");
                    
                    if(field.value)
                    {
                        input.value = field.value;
                    }
                    
                    // element ID
                    if(field.id)
                    {
                        field.id = field.id;
                    }
                    
                    // CSS class
                    if(field["class"])
                    {
                        input.addClassName(field["class"]);
                    }
                    
                    // label
                    if(field.label)
                    {
                        input = new Element("label").update(field.label).insert(input);
                    }
                    
                    row.update(input);

                    break;
	    	
	    		// form break
	    		case "Content":
	    			// message text
	    			label = new Element(field.element).update(field.content);

                    // element ID
                    if(field.id)
                    {
                        field.id = field.id;
                    }
                    
                    // CSS class
                    if(field["class"])
                    {
                        input.addClassName(field["class"]);
                    }
	    			
	                row.update(label);
	
	                break;
	    			
	    		case "MemoField":
	    			input = new Element("textarea", {
	    				name: field.name
	    			} ).addClassName("text");
	    			
                    if(field.value)
                    {
                        input.value = field.value;
                    }
                    
                    // element ID
                    if(field.id)
                    {
                        field.id = field.id;
                    }
                    
                    // CSS class
                    if(field["class"])
                    {
                        input.addClassName(field["class"]);
                    }
                    
                    // label
                    if(field.label)
                    {
                        input = new Element("label").update(field.label).insert(input);
                    }
                    
                    row.update(input);
	    			
	    			break;
	    			
	    		case "SelectField":
                    input = new Element("select", {
                        name: field.name
                    } );
                    
                    // element ID
                    if(field.id)
                    {
                        field.id = field.id;
                    }
                    
                    // CSS class
                    if(field["class"])
                    {
                        input.addClassName(field["class"]);
                    }
                    
                    // available options
                    for(j in field.options)
                    {
                        if( typeof(field.options[j]) == "function")
                        {
                            continue;
                        }

                        var option = new Element("option", {
                            value: j
                        } );
                        option.text = field.options[j];
                        input.add(option, null);
                    }

                    // selects current value
                    if(field.value)
                    {
                        for(j = 0; j < input.options.length; ++j)
                        {
                            if(input.options[j].value == field.value)
                            {
                                input.selectedIndex = j;
                            }
                        }
                    }
                    
                    // label
                    if(field.label)
                    {
                        input = new Element("label").update(field.label).insert(input);
                    }
                    
                    row.update(input);

	    			break;
	    			
	    		case "RadioField":
	    			// label cell
	    			if(field.label)
	    			{
	    				row.update(field.label);
	    			}
	    			
	    			// radio options
	    			for(j in field.options)
	    			{
                        if( typeof(field.options[j]) == "function")
                        {
                        	continue;
                        }

	    				input = new Element("input", {
	    					type: "radio",
	    					name: field.name,
	    					value: j
	    				} ).addClassName("checkbox");
	    				
	    				if( typeof(field.value) != "undefined" && field.value == j)
	    				{
	    					input.checked = true;
	    				}
	        			
		    			// element ID
		    			if(field.id)
		    			{
		    				input.id = field.id + j;
		    			}
		    			
		    			// CSS class
		    			if(field["class"])
		    			{
		    				input.addClassName(field["class"]);
		    			}

		    			// option label
                        row.insert( new Element("label").update(input).insert(field.options[j]) );
	    			}

	    			break;
	    			
	    		case "CheckboxField":
                    // label cell
                    if(field.label)
                    {
                        row.update(field.label);
                    }
                    
                    // radio options
                    for(j in field.options)
                    {
                        if( typeof(field.options[j]) == "function")
                        {
                            continue;
                        }

                        input = new Element("input", {
                            type: "checkbox",
                            name: field.name,
                            value: j
                        } ).addClassName("checkbox");
                        
                        if( typeof(field.values) != "undefined")
                        {
                        	for(var value in field.values)
                        	{
                        		if(field.values[value] == j)
                        		{
                        			input.checked = true;
                        		}
                        	}
                        }
                        
                        // element ID
                        if(field.id)
                        {
                            input.id = field.id + j;
                        }
                        
                        // CSS class
                        if(field["class"])
                        {
                            input.addClassName(field["class"]);
                        }

                        // option label
                        row.insert( new Element("label").update(input).insert(field.options[j]) );
                    }

	    			break;
	    	}
	    	
	    	table.insert(row);
	    }

	    // puts fields on form
	    return element.insert( table.insert( new Element("div").addClassName("submit").update( new Element("input", {
	    	type: "submit",
	    	value: source.submit
	    } ) ) ) );
	}
} );
	
// display layer
var ajaxDialog;

//AJAX dialog initialisation
document.observe("dom:loaded", function() {
	ajaxDialog = new Element("div", {
		id: "ajaxDisplay"
	} ).hide();
	
	// cancel link
	ajaxDialog.closeLink = new Element("a", {
		href: document.location
	} ).update("[X]").observe("click", function(event) {
		ajaxDialog.remove();
		event.stop();
	} );
	
	// displays AJAX layer
	ajaxDialog.display = function(content) {
	    // cleans current display
		this.update(this.closeLink);

		// displays given content
		this.insert(content);
		$(document.body).insert(this);
		this.show();
	};
} );

// displays first message in stack
function displayFirstMessage(stack)
{
	// temporary variable
	var component;
	
	for(var i in stack)
	{
		component = stack[i];
		
		if(component.type == "Content")
		{
			alert(component.data.content);
			return component["class"] != "error";
		}
	}
	
	return true;
}

