$=function(element){
  if (typeof element == 'string')
    return document.getElementById(element);
  return element;
}
function $F(elem) {return $(elem).value;}

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  }
});


/* ----------------------------------------
 * processing templates 
 ------------------------------------------*/
 function Template(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  };
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

Template.prototype.evaluate= function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}

function openWindow (url,name,widgets) {
  popupWin = window.open (url, name, widgets);
  popupWin.opener.top.name="opener";
  popupWin.focus();
}
function toggle(elem) {
  if(elem.style.display=='none')
    elem.style.display='block';
  else
    elem.style.display='none';
}


/* ----------------------------------------
 * switching tabbed divs 
 ------------------------------------------*/
function hideTabbedDivs(){
  var ar=YAHOO.util.Dom.getElementsByClassName('tabCollapsible');
  for(i=0;i<ar.length;i++){
     ar[i].style.display='none';
  }
  var ar=YAHOO.util.Dom.getElementsBy(function(){return true;}, 'li', 'minitab_settings');
  for(i=0;i<ar.length;i++){
     YAHOO.util.Dom.removeClass(ar[i],'active');
  }
}

function switchTab(e, id){
  elem=document.getElementById(id);
  if(elem.style.display=='none'){
    hideTabbedDivs();
    YAHOO.util.Dom.addClass(e, 'active');
    elem.style.display='block';
  }
}

