var Page = {
	
	start: function(){
		MooTools.lang.setLanguage("en-US");		
		
		// Launch-in-new-window links automagically created
		var extLinks = $$('a.external');
		if ( extLinks.length ) {
			extLinks.each(function(elem, idx) { 
				elem.setProperty('target', '_blank');
			});
		}
	}
}

/** Generic functions */
/** Form functions */

function setupFormValidator(){
	FormValidator.add('validate-required-if-checked', validateRequiredIfChecked);
	FormValidator.add('validate-equal-to', validateEqualTo);
	
	// Additional custom form validators
	var validateRequiredIfChecked = {
		errorMsg: 'This field is required.',
		test: function(field, props) {
		    	if ( $(props.dependant) && $(props.dependant).checked ) {
					return ( field.value.length != 0 );
		    	} else {
		    		return true;
		    	}
			}
		};

	var validateEqualTo = {
		errorMsg: 'Fields do not match.',
		test: function(field, props) {
		    	if ( $(props.dependant) ) {
					return ( field.value == $(props.dependant).value );
		    	} else {
		    		return true;
		    	}
			}
		};
}
function validateForm(){
	var valForms = $$('form.validate-form');
	if ( valForms.length ) {
		valForms.each(function(elem, idx) { 
			new FormValidator.Inline(elem, {
				'onFormValidate': Page.formHandler,
				'errorPrefix': '',
				'useTitles': true
			});
		});
	}
}
/** ------------------------ */
/** Show Hide and Toggle elements */
function toogleElementNone(element) {
	$(element).toggle();
}
function hideElement(element){
	$(element).setStyle('display', 'none');
}
function showElement(element){
	$(element).setStyle('display', '');
}
function toogleElement(element){
	var myFx = new Fx.Slide(element, {
	    transition: Fx.Transitions.Pow.easeOut
	});
	myFx.toggle();
}
/** ------------------------------ */

/** Generic functions End*/
var Dashboard = new Class({

    Implements: [Events,Options],
    
    getOptions: function () {
        return {
            LeftCol: 'holder1',
            RightCol: 'holder2',
            HtmlElement: 'div',
            InjectPosition: 'top',
            HighlightColor: '#ddf,#ccc',
            CookieLifeTime: '100'
        }
    },

    initialize: function ( elDragable,elDroppable, options ) {
        this.setOptions( this.getOptions(), options);
        this.dragable = $$(elDragable);
        this.droppable = elDroppable;

        this.getDragableDashboard();
        this.setDashboard();
    },

    getDragableDashboard: function () {
    
        this.dragable.each(function(drag) {
        
            //make it dragable, and set the destination divs
            var myDrag = new Drag.Move(drag, { 
                droppables: this.droppable,
                onDrop: function(el,droppable) {
                        el.inject(droppable,this.options.InjectPosition);
                        el.setStyles({'left':0,'top':0,'position':'relative','zIndex':'100'}); //hack -- wtf?
                        
                        droppable.removeClass('mo');
                        var Color = this.options.HighlightColor.split(',')
                        el.highlight(Color[0], Color[1]);
                        // Save Dashboard into Cookie
                        this.saveDashboard();
                }.bind(this),
                onDrag: function(el,droppable) {
                    el.setStyle('zIndex','200');
                },
                onEnter: function(el,droppable) {
                    droppable.addClass('mo');
                },
                onLeave: function(el,droppable) {
                    droppable.removeClass('mo');
                }
            });
            
            drag.setStyles({ 'top':0, 'left':0, 'margin-right':'20px' });
                
        }.bind(this));  
    },
    
    saveDashboard: function () {
        var arrDroppables = $$(this.droppable);
        var holder1string = '';
        var holder2string = '';
        arrDroppables.each( function(elDropable,intIdx) {
            var arrChildren = elDropable.getChildren(this.options.HtmlElement);
            
            if( intIdx == 0 ) {
                holder1string+= arrChildren.getProperty('id');
            } else {
                holder2string+= arrChildren.getProperty('id');
            }
        }.bind(this));
        
        Cookie.write(this.options.LeftCol, holder1string, {duration: this.options.CookieLifeTime});
        Cookie.write(this.options.RightCol, holder2string, {duration: this.options.CookieLifeTime});    
    },
    
    setDashboard: function () {
        if( Cookie.read(this.options.LeftCol) != null ) {
            var arrHolder1 = Cookie.read(this.options.LeftCol).split(',');
            if( arrHolder1 != "" ) {
                arrHolder1.each( function(elString) {
                    var Element = $(elString);
                
                    Element.inject($(this.options.LeftCol));
                }.bind(this));
            }
        }
        
        if( Cookie.read(this.options.RightCol) != null ) {
            var arrHolder2 = Cookie.read(this.options.RightCol).split(',');
            if( arrHolder2 != "" ) {
                arrHolder2.each( function(elString) {
                    var Element = $(elString);
                    
                    Element.inject($(this.options.RightCol));
                }.bind(this));
            }
        }   
    }
    
});

// Do stuff on load
window.addEvent('load', Page.start);


