/**
 * @param {String} classes
 * @param {Function|String|HTMLElement} block
 * @param {HtmlBuilder} HTML
 * @returns {HTMLDivElement}
 */
function panel(classes, block, HTML) {
    var builder = (typeof block == 'function');
    HTML = HTML || Ojay.HTML;
    return HTML.div({className: 'panel ' + classes}, function(HTML) {
        var content = HTML.div({className: 'panel-c'}, function(HTML) {
            HTML.div({className: 'panel-t'});
            if (builder) block(HTML);
        });
        if (!builder) Ojay(content).insert(block, 'bottom');
        HTML.div({className: 'panel-b'}, function(HTML) {
            HTML.div();
        });
    });
};

/**
 * @constructor
 * @class Panel
 */
var Panel = new JS.Class({
    /**
     * @param {String} classes
     * @param {Function|String|HTMLElement} block
     * @param {HtmlBuilder} HTML
     */
    initialize: function(classes, block, HTML) {
        this._classes = classes;
        this._block = block;
        this._HTML = HTML;
        this.getHTML();
    },
    
    /**
     * @returns {HTMLDivElement}
     */
    getHTML: function() {
        if (this._html) return this._html;
        var self = this, classes = self._classes, block = self._block, HTML = self._HTML;
        var builder = (typeof block == 'function');
        HTML = HTML || Ojay.HTML;
        this._html =Ojay( HTML.div({className: 'panel ' + classes}, function(HTML) {
            HTML.div({className: 'panel-c'}, function(HTML) {
                HTML.div({className: 'panel-t'});
                self._content = Ojay( HTML.div(function(HTML) {
                   if (builder) block(HTML);
                }) );
            });
            if (!builder) self._content.insert(block, 'bottom');
            HTML.div({className: 'panel-b'}, function(HTML) {
                HTML.div();
            });
        }) );
        return this.getHTML();
    },
    
    /**
     * @returns {Panel}
     */
    setContent: function() {
       this._content.setContent.apply(this._content, arguments);
       return this;
    },
    
    /**
     * @returns {Panel}
     */
    insert: function() {
       this._content.insert.apply(this._content, arguments);
       return this;
    }
});

var getLabel = function(input) {
    input = Ojay(input);
    if (!input.node) return Ojay();
    var label = input.ancestors('label');
    if (label.node) return label.at(0);
    var id = input.node.id;
    label = [].filter.call(document.getElementsByTagName('label'), function(label) { return id && label.htmlFor == id; });
    return Ojay(label.slice(0,1));
};

var labelInField = function(field) {
    var input = Ojay(field), label = getLabel(field);
    if (!label.node || !input.node) return;
    
    var labelText = label.node.innerHTML.stripTags(),
        inputType = input.node.type || 'text';
    
    var focus = function() {
        input.removeClass('empty');
        if (input.node.value == labelText) input.node.value = '';
    };
    
    var blur = function() {
        if (input.node.value && input.node.value != labelText) return;
        input.addClass('empty');
        if (inputType == 'text') input.node.value = labelText;
    };
    
    blur();
    label.addClass('inside-input');
    input.on('focus', focus);
    input.on('blur', blur);
};

Ojay.onDOMReady(function() {
    ['paste'].forEach(function(evntName){
    	Ojay.byId("site/SummerExhibitionRegistration.confirmEmail").on(evntName,
    		function(el,ev){
    			ev.stopEvent();
    	});
    });
    
    Ojay('a').forEach(function(link) {
        link.node.hideFocus = true;
        if (link.hasClass('twitter')) {
			link.on('click', function(el, evnt) {
				if (!window.BitlyClient) return;
		        evnt.stopDefault();
				Shortener.shorten(window.location.href, function(result) {
					var pageTitle = document.title.split(/\s+-\s+/)[0];
					window.open(Ojay.URI.build('http://twitter.com/home', {
						    				status: "Reading " +
						    					pageTitle + " " +
						    					(result ? result.shortUrl : 'http://www.royalacademy.org.uk/') +
							" from @RoyalAcademy"
					}), 'twitter');
	    		});
			});
		} else if (link.hasClass('new-window')) {
            link.node.target = '_blank';
            var title = link.node.title;
            link.node.title = title
                    ? title + ' (Opens in a new window)'
                    : 'This link opens in a new window';
    	}
	});
    
    // Photo galleries
    Ojay('a.photo-gallery').on('click', function(link, evnt) {
        evnt.stopDefault();
        PhotoGalleryController.open(link.node.href);
    });
});


var setupPostcodeCheck = function(__formid__) {
    var select = Ojay.byId('site/' + __formid__ + '.country');
    
    var label = Ojay('label').filter(function(label) {
        return label.node.htmlFor == 'site/' + __formid__ + '.postcode';
    });
    
    var required = label.descendants('.fieldrequired').node;
    if (!required) {
        required = Ojay( Ojay.HTML.span({className: 'fieldrequired'}, '*') );
        label.insert(document.createTextNode(' '));
        label.insert(required.node);
    }
    
    function checkPostcodeRequirement() {
        var selected = select.children().filter('node.selected').node;
        var test = /\bireland\b/i.test(selected.text);
        required[test ? 'hide' : 'show']();
    };
    
    select.on('change', checkPostcodeRequirement);
    checkPostcodeRequirement();
};

