function $i(id){
        if (typeof id == 'undefined') alert(id+' undefined');
        if(id.substr(0,1) == '#') id = id.substr(1);
        var el = document.getElementById(id);
        //if (el == null) alert(id+' is null');
        return el;
}

function trim(s) { return ( s || '' ).replace( /^\s*|\s*$/g, '' ); }

function str_replace(source,target,str) {
        return str.replace(RegExp(source,"g"),target);
}

function showClass(classname,show,clear) {
        var visible = (show)?'':'none';
        var clearHTML = (clear)?clear:false;
        $('.'+classname).each(function(index) {
                $(this).css('display',visible);
                if (clearHTML) $(this).html('');
        });
}

function getHtmlSize(html,bottomDiv) {
        var obj = (typeof html == 'object');
        if (obj && (html.offsetHeight > 0)){
          oh = html.offsetHeight;
          ow = html.offsetWidth;
        } else {
          var pd = document.body;
          var dj = document.createElement("DIV");

          dj.style.position = "absolute";
          dj.style.left = "0px";
          dj.style.top = "0px";
          dj.style.zIndex = 1+maxZIndex();
          dj.style.display = "";
          dj.innerHTML = (obj)?html.parentNode.innerHTML:html;
          for (var i=0;i<2;i++) {
            pd.appendChild(dj);
            var ow = dj.offsetWidth;
            var oh = dj.offsetHeight;
            pd.removeChild(dj);
            if (oh > 0) break;
            dj.innerHTML = '<div style="overflow:auto">'+dj.innerHTML+'</div>';
          }
        }

        if ((oh == 0) && (typeof bottomDiv != 'undefined')) {
          var xy = getElementXY(bottomDiv);
          oh = xy.x;
        }
        var xy = {x:0,y:0};
        if(obj) var xy = getElementXY(html.id);
        return {width:parseInt(ow,10),height:parseInt(oh,10),left:xy.x,top:xy.y};
}

function getElementXY(id) {
        var o = $i(id);
        var l =o.offsetLeft; var t = o.offsetTop;
        while (o=o.offsetParent)
        l += o.offsetLeft;
        o = $i(id);
        while (o=o.offsetParent)
        t += o.offsetTop;
        return {x:l,y:t};
}

function createElement(element,id,html) {
        var pd = document.body;
        var dj = document.createElement(element);
        dj.id = id;
        dj.innerHTML = html;
        pd.appendChild(dj);
        return dj;
}

function removeElement(id) {
        var pd = document.body;
        var dj = $i(id);
        try{
                if (dj) pd.removeChild(dj);
        } catch(ex) {}
}

var errorDiv;
function alertx(text,color,id){

        if (typeof color == 'undefined') color = 'red';
        if (typeof id =='undefined') id = 'error_div';
        text = '<span style="font-weight:bold;color:'+color+'">'+text+'</span>';
        if ($i(id).innerHTML != '') {
                text = $i(id).innerHTML+'<br>'+text;
        }
        $i(id).innerHTML = text;
        $i(id).style.display = '';
        errorDiv = id;
        if (text.indexOf('<br />') == -1) setMsgTimer();
}

function resetError() {
        if (errorDiv == '') return;
        if (typeof errorDiv == 'undefined') return;
        if ($i(errorDiv)) $i(errorDiv).innerHTML = '';
        clearTimeout(msgTimer);
}
var msgTimer;
var msgTimeout=5000;

function setMsgTimer() {
        msgTimer = window.setTimeout('resetError()', msgTimeout);
}

function viewport(){
  w = f_clientWidth();
  h = f_clientHeight();
  l = f_scrollLeft();
  t = f_scrollTop();
  return {width:w,height:h,left:l,top:t};
}

function f_clientWidth() {
        return f_filterResults (
                window.innerWidth ? window.innerWidth : 0,
                document.documentElement ? document.documentElement.clientWidth : 0,
                document.body ? document.body.clientWidth : 0
        );
}
function f_clientHeight() {
        return f_filterResults (
                window.innerHeight ? window.innerHeight : 0,
                document.documentElement ? document.documentElement.clientHeight : 0,
                document.body ? document.body.clientHeight : 0
        );
}
function f_scrollLeft() {
        return f_filterResults (
                window.pageXOffset ? window.pageXOffset : 0,
                document.documentElement ? document.documentElement.scrollLeft : 0,
                document.body ? document.body.scrollLeft : 0
        );
}
function f_scrollTop() {
        return f_filterResults (
                window.pageYOffset ? window.pageYOffset : 0,
                document.documentElement ? document.documentElement.scrollTop : 0,
                document.body ? document.body.scrollTop : 0
        );
}
function f_filterResults(n_win, n_docel, n_body) {
        var n_result = n_win ? n_win : 0;
        if (n_docel && (!n_result || (n_result > n_docel)))
                n_result = n_docel;
        return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}


function maxZIndex() {
    var zmax = 0;
    $('*').each(function() {
        var cur = parseInt($(this).css('z-index'));
        zmax = cur > zmax ? cur : zmax;
    });
    return zmax;
}

//helpers for cookies

function getCookie(name)
{
        var cs = document.cookie.split(';');
        if(cs)
        {
                for(var i=0;i<cs.length;i++)
                {
                        var b = cs[i].split('=');
                        var n = b[0];
                        var r = / /g;
                        n = n.replace(r, "");
                        if(n == name)
                        return unescape(b[1]);
                }
        }
        else
        return null;
}

function setCookie(name,value)
{
        var date = new Date();
        date.setTime(date.getTime() + (1000*60*60*24*7)); //+1week
        document.cookie = name+ "=" + escape(value) + "; expires=" + date.toUTCString();
}

function setCookieYear(name,value)
{
        var date = new Date();
        date.setTime(date.getTime() + (1000*60*60*24*7*52)); //+1year
        document.cookie = name+ "=" + escape(value) + "; expires=" + date.toUTCString();
}

function setCookieYearRaw(name,value)
{
        var date = new Date();
        date.setTime(date.getTime() + (1000*60*60*24*7*52)); //+1year
        document.cookie = name+ "=" + value + "; expires=" + date.toUTCString();
}

function setCookieMonth(name,value)
{
        var date = new Date();
        date.setTime(date.getTime() + ((1000*60*60*24*7*52)/12)); //+month
        document.cookie = name+ "=" + escape(value) + "; expires=" + date.toUTCString();
}

function setCookie3Month(name, value) {
        var date = new Date();
        date.setTime(date.getTime() + ((1000 * 60 * 60 * 24 * 7 * 52) / 4)); //+month
        document.cookie = name + "=" + escape(value) + "; expires=" + date.toUTCString();
}


function deleteCookie(name) {
        document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
}

function deleteAllCookies() {
    var cookies = document.cookie.split(";");
    for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i];
        var eqPos = cookie.indexOf("=");
        var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
        deleteCookie(name);
    }
}

function getParam(n){
        var sSearch;
        var aPairs;
        sSearch = (document.location.search.length > 1) ? document.location.search.substring(1) : "";
        if (sSearch != "")
        {
                aPairs = sSearch.split("&");
                for (var i = 0; i < aPairs.length; i++){
                        if(aPairs[i].split("=")[0] == n)
                        return unescape(aPairs[i].split("=")[1]);
                }
        }
        return null;
}

function getDataInBetween(data,phrase1,phrase2,non) {
var retval= "";
var p = data.indexOf(phrase1);
  if (p < 0) {
     return(retval);
  }

var n = p;
  data = data.substr(p+phrase1.length);
  if (phrase2 == "") {
     return(data);
  }
  p = data.indexOf(phrase2);
  if (p > -1) retval = data.substr(0,p);
  n = n+p+phrase2.length;
  retval = str_replace("\t",' ',retval);
  retval = str_replace("\n",' ',retval);
  retval = str_replace("  ",' ',retval);
  retval = retval.trim();
  retval = (typeof non == 'undefined')?n+' '+retval:retval;
  return retval;
}

function urlDecode(psEncodeString)
{
  // Create a regular expression to search all +s in the string
  var lsRegExp = /\+/g;
  // Return the decoded string
  return unescape(String(psEncodeString).replace(lsRegExp, " "));
}

function importJS(src){
  var p = loadJSfiles.indexOf(src+"\n");
  if (p > -1) return;
  loadedJSfiles += src+"\n";
  $.getScript(src, function() {
    p = loadedJSfiles.indexOf(src+"\n");
    loadedJSfiles = loadedJSfiles.substr(0,p)+loadedJSfiles.substr(p+src.length+1);
    //alert(src+' loaded');
  });
  return;
}

// import with a random query parameter to avoid caching
function importJSNoCache(src){
  var ms = new Date().getTime().toString();
  var q = (-1 < src.indexOf('?'))?'&':'?';
  var seed = q + ms;
  importJS(src + seed);
}

var loadJSTimer;
var loadJSVariable;
var loadJSCallback;
var loadJSfiles = "\n";
var loadedJSfiles = "\n";
var loadJScount;

function waitForJS2Load(variable,callback){
  if (typeof variable == 'undefined') {
    variable = loadJSVariable;
    callback = loadJSCallback;
  } else {
    loadJSVariable = variable;
    loadJSCallback = callback;
    loadJScount = 10;
  }
  var loaded;
  if (variable != '') {
  eval('loaded = (typeof '+variable+" != 'undefined');");
  } else {
    loaded = (loadJSfiles.length == loadedJSfiles.length);
    variable = loadedJSfiles;
  }
  if (loaded) {
     clearTimeout(loadJSTimer);
     loadJSTimer = null;
     if (typeof callback == 'function')
     callback();
  } else {
  loadJScount --;
  if (loadJScount == 0) {

    alert('ERROR: Unable to load '+variable);
    return;
  }
  loadJSTimer = window.setTimeout('waitForJS2Load()',2000);
  }
};

function loadJS(name,variable,callback) {
  for (var i=0;i< js.length;i++) {
    if (js[i].name == name)
      if (js[i].nocache) {
        importJSNoCache(js[i].src);
      } else {
        importJS(js[i].src);
      }
  }
  if (typeof variable == 'undefined') variable = '';
  waitForJS2Load(variable,callback);
}

function validateEmail(email) {
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

function bool2str(bool){
  return(bool)?'true':'false';
}

