
Object.extend(String.prototype, {
	trim: function() {
		var a = this.replace(/^\s+/, '');
		return a.replace(/\s+$/, '');
	},
	decodeHTML: function() {
		return this.replace(/&quot;/gi, "\"");
	},
	empty: function() {
		var s = this.trim();
		return (s.length == 0);
	}
});

Object.extend(Element, { 
	togglePointer: function(elem) {
		if (Element.hasClassName(elem, "pointerCursor")) {
			Element.removeClassName(elem, "pointerCursor");
		}
		else {
			Element.addClassName(elem, "pointerCursor");
		}
	}
});

Element.Methods.setValue =  function(element, value) {
	if (element.tagName.toUpperCase() == "SELECT") {
		var opt = $A(element.options).find(function(opt) {
			return (opt.value == value);
		});
		if (opt) {
			opt.selected = true;
			element.disabled = false;
		}
	}
	else {
		if (['INPUT', 'TEXTAREA'].include(element.tagName)) {
			element.value = value;
		}
	}
}
Element.Methods.blindUp = function(element, options) {
	var opts = {duration: 0.2};
	Object.extend(opts, options);
	new Effect.BlindUp(element, opts);
	return element;
}
Element.Methods.blindDown = function(element, options) {
	var opts = {duration: 0.2};
	Object.extend(opts, options);
	new Effect.BlindDown(element, opts);
	return element;
}
Element.Methods.slideUp = function(element, options) {
	var opts = {duration: 0.2};
	Object.extend(opts, options);
	new Effect.SlideUp(element, opts);
	return element;
}
Element.Methods.slideDown = function(element, options) {
	var opts = {duration: 0.2};
	Object.extend(opts, options);
	new Effect.SlideDown(element, opts);
	return element;
}
Element.Methods.highlight = function(element, options) {
	var opts = {duration: 2.0};
	Object.extend(opts, options);
	new Effect.Highlight(element, opts);
	return element;
}
Element.Methods.toggleBlind = function(element, options) {
	var opts = {duration: 0.2};
	Object.extend(opts, options);
	Effect.toggle(element, 'blind', opts);
	return element;
}
Element.Methods.toggleSlide = function(element, options) {
	var opts = {duration: 0.5};
	Object.extend(opts, options);
	Effect.toggle(element, 'slide', opts);
	return element;
}
Element.Methods.fade = function(element, options) {
	var opts = {duration: 2.0, restorecolor: "#FFFFFF"};
	Object.extend(opts, options);
	new Effect.Fade(element, opts);
	return element;
}
Element.Methods.center = function(element, parent) {
    var w, h, pw, ph;
    var d = element.getDimensions();
    w = d.width;
    h = d.height;
    if (!parent) {
        var ws = document.viewport.getDimensions();
        pw = ws.width;
        ph = ws.height;
    } else {
        var co = parent.getDimensions();
        pw = co.width;
        ph = co.height;
    }
    var offset = element.viewportOffset();
    var top = (ph/2) - (h/2) + "px";
    var left = (pw/2) - (w/2) + "px";
    element.show();
    element.setStyle({top: top, left: left, position: 'fixed'});
}
Element.Methods.toggleState = function(element, openText, closedText, event) {
    element.toggle();
    var lnk = Event.element(event);
    if (element.visible()) {            
        lnk.update(openText);
        if (!lnk.hasClassName('cancel')) {
            lnk.addClassName('cancel');
        }
    }
    else {
        lnk.update(closedText);
        if (lnk.hasClassName('cancel')) {
            lnk.removeClassName('cancel');
        }
    }
}
//now commit the Methods we just added above
Element.addMethods();

Callout = {
    opened: null,
    ShowDetails: function(event) {
        this.HideDetails();
        var el = Event.element(event);
        var details = el.previous('.callout_wrapper');
        this.opened = details;
        var left = el.positionedOffset().left + (el.getWidth() / 2) + 50;
        left = left - 15;
        left = left + 'px';         
        var top = el.positionedOffset().top + (el.getHeight() / 2);
        top = top - 175;
        top = top + 'px'; 
        details.setStyle({
            left: left,
            top: top
        });
    
        details.show();      
    },
    HideDetails: function(event) {
        if (this.opened && this.opened.visible()) {
            this.opened.hide();
            this.opened = null;
        }
    }
}