﻿////////////////////////////////////////////////////////////////////////////
// Copyright 2009 Ingenios Ltd.
// http://ingenios.co.uk
////////////////////////////////////////////////////////////////////////////

// ------------- dom functions ---------------

function queryVal(key) {
  qpairs = window.location.search.substring(1).split("&");
  for (var i in qpairs) {
    keyval = qpairs[i].split("=");
    if (keyval[0] == key) {
      return keyval[1];
    }
  }
  return null;
}

function set_txt(id, txt) {
  var lbl = ELT(id);
  if (lbl.nodeName == 'INPUT') {
    lbl.value = txt;
  } else {
    lbl.innerHTML = txt;
  }
}

function getDocumentSize() {
  //TODO: this may not work in all browsers, but good enough for now
  //      (may return window size instead of document size).
  //      (see jQuery:   jq("body").height(); )
  var myWidth = 0, myHeight = 0;
  myWidth = document.body.clientWidth;
  myHeight = document.body.clientHeight;
  return { w: myWidth, h: myHeight };
}

function getWindowInnerSize() {
  //see http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return { w: myWidth, h: myHeight };
}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return { x: scrOfX, y: scrOfY };
}

function getElementXY(elem) {
  //http ://www.kryo genix.org/code/browser/smoothscroll/
  if (!elem) {
    return null;
  }
  // Find the element's position
  var x = elem.offsetLeft; 
  var y = elem.offsetTop;
  var node = elem;
  while (node.offsetParent && (node.offsetParent != document.body)) {
    node = node.offsetParent;
    x += node.offsetLeft;
    y += node.offsetTop;
  }
  return { x: x, y: y };
}

function scrollToElement(elem,offset) {
  // eg. offset = {x:0,y:-8}
  //--------------------------------
  //http ://www.kryo genix.org/code/browser/smoothscroll/
  var pos = getElementXY(elem);
  if (!pos) {
    return;
  }
  window.scrollTo(0 + offset.x, pos.y + offset.y);
}

function ELT(id) {
  return document.getElementById(id);
}

//---------
// Cross browser event firing
function fireEvent(obj,evt){
  if( document.createEvent ) {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent( evt, true, false );
    obj.dispatchEvent(evObj);
  } else if( document.createEventObject ) {
    obj.fireEvent('on'+evt);
  }
}
// eg. fireEvent(document.getElementById("grey_link"),'click');
//---------

function EVENT_FIX(ev) {
  if (window.event) {     // IE
    return window.event;
  } else {                // Netscape/Firefox/Opera
    return ev;
  }
}

function EVENT_SENDER(ev) {
  if (ev.srcElement) {     // IE
    return ev.srcElement;
  } else {                // Netscape/Firefox/Opera
    return ev.target;
  }
}

function EVENT_GETKEYNUM(ev) {
  if (ev.which) {         // Netscape/Firefox/Opera
    return ev.which;
  } else {                // IE
    return ev.keyCode;
  }
}

function fire_default_button(ev, btnid) {
  var keynum = EVENT_GETKEYNUM(ev);
  if (keynum == 13
      && !(EVENT_SENDER(ev) && (EVENT_SENDER(ev).tagName.toLowerCase() == "textarea")))
  {
    var btn = ELT(btnid);
    if (btn && typeof(btn.click) != "undefined") {
      btn.click();
      ev.cancelBubble = true;
      if (ev.stopPropagation)
        ev.stopPropagation();
      return false;
    }
  }
  return true;
}

//var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);

//var __defaultFired = false;
//function WebForm_FireDefaultButton(event, target) {
//    if (!__defaultFired && event.keyCode == 13 && !(event.srcElement && (event.srcElement.tagName.toLowerCase() == "textarea"))) {
//        var defaultButton;
//        if (__nonMSDOMBrowser) {
//            defaultButton = document.getElementById(target);
//        }
//        else {
//            defaultButton = document.all[target];
//        }
//        if (defaultButton && typeof(defaultButton.click) != "undefined") {
//            __defaultFired = true;
//            defaultButton.click();
//            event.cancelBubble = true;
//            if (event.stopPropagation) event.stopPropagation();
//            return false;
//        }
//    }
//    return true;
//}

//function WebForm_TextBoxKeyHandler(event) {
//    if (event.keyCode == 13) {
//        var target;
//        if (__nonMSDOMBrowser) {
//            target = event.target;
//        }
//        else {
//            target = event.srcElement;
//        }
//        if ((typeof(target) != "undefined") && (target != null)) {
//            if (typeof(target.onchange) != "undefined") {
//                target.onchange();
//                event.cancelBubble = true;
//                if (event.stopPropagation) event.stopPropagation();
//                return false;
//            }
//        }
//    }
//    return true;
//}

var clicked=false;
function single_click() {
  if (clicked==false) {
    clicked=true;
    document.body.style.cursor='wait';
    return true;
  }
  return false;
}

function ddl_insertoption(ddl,txt,val) {
  var opt = document.createElement('option');
  opt.text=txt;
  opt.value=val;
  try {
    ddl.add(opt,null); // standards compliant
  }
  catch(ex) {
    ddl.add(opt); // IE only
  }
}

function ddl_fill(ddl,opts) {
  ddl.options.length = 0;
  for (var i in opts) {
    ddl_insertoption(ddl,opts[i].txt,opts[i].val);
  }
}

function drop_keys(ev, coll) {  //eg. [60, 62, /\d/]
  var keynum = EVENT_GETKEYNUM(ev);
  var keychar = String.fromCharCode(keynum);
  for ( var i in coll ) {
    if (typeof coll[i] == 'number') {
      if (keynum == coll[i])
        return false;
    } else if (typeof coll[i] == 'string') {
      if (keychar == coll[i])
        return false;
    } else { //regex object
      if (coll[i].test(keychar))
        return false;
    }
  }
  return true;
}

function to_uppercase(elem) {
  elem.value = elem.value.toUpperCase();
}

function str_left(elem, n) {
  // setting value jumps cursor to end
  if (elem.value.length > n)
    elem.value = elem.value.substr(0,n);
}

// ------------- other util functions ---------------

function one_of(x, ys) {
  for ( var i in ys ) {
    if (x == ys[i])
      return true;
  }
  return false;
}

function find_first(coll, pred) {
  for ( var i in coll ) {
    if (pred(coll[i])) {
      return coll[i];
    }
  }
  return null;
}

function math_round(val,n) {
  if (n==null)
    n=0;
  return Math.round(val*Math.pow(10,n))/Math.pow(10,n);
}

function toRad(deg) {
  return deg * Math.PI / 180;
}

// ------------- screen dimmer ---------------

function show_dimmer(show, callbk_click) {
  var elem = ELT('dimmer-ie');

  if (elem == null) {
    return;
  }

  var sz = getDocumentSize();

  elem.style.display = show? 'block' : 'none';
  elem.style.height = sz.h + "px";
  if (show && typeof callbk_click == "function") {
    elem.onclick = callbk_click;
  } else {
    elem.onclick = null;
  }
}

function show_pleasewaitbox(show) {
  var elem = ELT('plzwait');

  if (elem == null) {
    return;
  }

  var sz = getWindowInnerSize();
  var scrl = getScrollXY();

  // make visible *before* accessing .clientWidth/Height
  elem.style.display = show? 'block' : 'none';
  elem.style.left = math_round(scrl.x+(sz.w-elem.clientWidth)/2) + "px";
  elem.style.top = math_round(scrl.y+(sz.h-elem.clientHeight)/2) + "px";
}

function show_pleasewait(show) {
  //alert("show_pleasewait:"+ show);
  function doit() {
    show_dimmer(show);
    show_pleasewaitbox(show);
    document.body.style.cursor = show? 'wait' : 'default';
  }
  //force into bg thread otherwise IE doesn't animate gifs.
  setTimeout(doit,0);
}
