Dom = YAHOO.util.Dom;
Event = YAHOO.util.Event;
$D = YAHOO.util.Dom;
$E = YAHOO.util.Event;

String.prototype.trim=function(){
  return this.replace(/^\s*|\s*$/g,'');
}
String.prototype.ltrim=function(){
  return this.replace(/^\s*/g,'');
}
String.prototype.rtrim=function(){
  return this.replace(/\s*$/g,'');
}

function strtr(str, from, to) {
  var fr = '', i = 0, lgth = 0;

  if (typeof from === 'object') {
      for (fr in from) {
          str = str.replace(fr, from[fr]);
      }
      return str;
  }
  
  lgth = to.length;
  if (from.length < to.length) {
      lgth = from.length;
  }
  for (i = 0; i < lgth; i++) {
      str = str.replace(from[i], to[i], 'g');
  }
  
  return str;
}

function isUndefined(val) {
  return YAHOO.lang.isUndefined(val);
}

function checkDate(y, m, d){
  var chkDate = new Date(y, m, d);
  if (y != chkDate.getFullYear() || d != chkDate.getDate() || m != chkDate.getMonth()) {
    return false;
  }
  return true;
}

function strtotime(str, now) {
  // Convert string representation of date and time to a timestamp  
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/strtotime
  // +   original by: Caio Ariede (http://caioariede.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +      input by: David
  // +   improved by: Caio Ariede (http://caioariede.com)
  // +   improved by: Brett Zamir (http://brett-zamir.me)
  // +   bugfixed by: Wagner B. Soares
  // +   bugfixed by: Artur Tchernychev
  // %        note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
  // *     example 1: strtotime('+1 day', 1129633200);
  // *     returns 1: 1129719600
  // *     example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
  // *     returns 2: 1130425202
  // *     example 3: strtotime('last month', 1129633200);
  // *     returns 3: 1127041200
  // *     example 4: strtotime('2009-05-04 08:30:00');
  // *     returns 4: 1241418600

  var i, match, s, strTmp = '', parse = '';

  strTmp = str;
  strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
  strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars

  if (strTmp == 'now') {
      return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
  } else if (!isNaN(parse = Date.parse(strTmp))) {
      return (parse/1000);
  } else if (now) {
      now = new Date(now*1000); // Accept PHP-style seconds
  } else {
      now = new Date();
  }

  strTmp = strTmp.toLowerCase();

  var __is =
  {
      day:
      {
          'sun': 0,
          'mon': 1,
          'tue': 2,
          'wed': 3,
          'thu': 4,
          'fri': 5,
          'sat': 6
      },
      mon:
      {
          'jan': 0,
          'feb': 1,
          'mar': 2,
          'apr': 3,
          'may': 4,
          'jun': 5,
          'jul': 6,
          'aug': 7,
          'sep': 8,
          'oct': 9,
          'nov': 10,
          'dec': 11
      }
  };

  var process = function (m) {
      var ago = (m[2] && m[2] == 'ago');
      var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);

      switch (m[0]) {
          case 'last':
          case 'next':
              switch (m[1].substring(0, 3)) {
                  case 'yea':
                      now.setFullYear(now.getFullYear() + num);
                      break;
                  case 'mon':
                      now.setMonth(now.getMonth() + num);
                      break;
                  case 'wee':
                      now.setDate(now.getDate() + (num * 7));
                      break;
                  case 'day':
                      now.setDate(now.getDate() + num);
                      break;
                  case 'hou':
                      now.setHours(now.getHours() + num);
                      break;
                  case 'min':
                      now.setMinutes(now.getMinutes() + num);
                      break;
                  case 'sec':
                      now.setSeconds(now.getSeconds() + num);
                      break;
                  default:
                      var day;
                      if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                          var diff = day - now.getDay();
                          if (diff == 0) {
                              diff = 7 * num;
                          } else if (diff > 0) {
                              if (m[0] == 'last') {diff -= 7;}
                          } else {
                              if (m[0] == 'next') {diff += 7;}
                          }
                          now.setDate(now.getDate() + diff);
                      }
              }
              break;

          default:
              if (/\d+/.test(m[0])) {
                  num *= parseInt(m[0], 10);

                  switch (m[1].substring(0, 3)) {
                      case 'yea':
                          now.setFullYear(now.getFullYear() + num);
                          break;
                      case 'mon':
                          now.setMonth(now.getMonth() + num);
                          break;
                      case 'wee':
                          now.setDate(now.getDate() + (num * 7));
                          break;
                      case 'day':
                          now.setDate(now.getDate() + num);
                          break;
                      case 'hou':
                          now.setHours(now.getHours() + num);
                          break;
                      case 'min':
                          now.setMinutes(now.getMinutes() + num);
                          break;
                      case 'sec':
                          now.setSeconds(now.getSeconds() + num);
                          break;
                  }
              } else {
                  return false;
              }
              break;
      }
      return true;
  };

  match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
  if (match != null) {
      if (!match[2]) {
          match[2] = '00:00:00';
      } else if (!match[3]) {
          match[2] += ':00';
      }

      s = match[1].split(/-/g);

      for (i in __is.mon) {
          if (__is.mon[i] == s[1] - 1) {
              s[1] = i;
          }
      }
      s[0] = parseInt(s[0], 10);

      s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
      return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
  }

  var regex = '([+-]?\\d+\\s'+
      '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
      '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
      '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday)'+
      '|(last|next)\\s'+
      '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
      '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
      '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday))'+
      '(\\sago)?';

  match = strTmp.match(new RegExp(regex, 'g'));
  if (match == null) {
      return false;
  }

  for (i = 0; i < match.length; i++) {
      if (!process(match[i].split(' '))) {
          return false;
      }
  }

  return (now.getTime()/1000);
}

function in_array(needle, haystack) {
  if (array_search(needle, haystack) !== false) {
    return true;
  }
  return false;
}

function array_search(needle, haystack, argStrict) {
  // Searches the array for a given value and returns the corresponding key if successful  
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/array_search
  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +      input by: Brett Zamir (http://brett-zamir.me)
  // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // *     example 1: array_search('zonneveld', {firstname: 'kevin', middle: 'van', surname: 'zonneveld'});
  // *     returns 1: 'surname'

  var strict = !!argStrict;
  var key = '';

  for (key in haystack) {
      if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
          return key;
      }
  }
  return false;
}

function setSelectIndexByValue(selectId, value) {
  selectObject=YAHOO.util.Dom.get(selectId);
  for (var y=0;y<selectObject.options.length;y++) {
    if (selectObject.options[y].text == value || selectObject.options[y].value == value) {
      selectObject.selectedIndex=y;
      break;
    }
  }
}

function wo(o, width, height, extra) {
  if (!o.name) o.name = 'popup_window';
  if (!width) width = 900;
  if (!height) height = 600;
  var params = [];
  params[params.length] ='width=' + width;
  params[params.length] ='height=' + height;
  var w = window.open(o.href, o.name + '_popup', params.join(',') + (extra ? ',' + extra : ''));
  if (typeof(w) != 'undefined') w.focus();
  return false;
}
