var notSaved = false; // Tracks whehter changes have been made to a page before closing _SPACE_
var winDim = new winDimensions;

var mousePos = { x:0, y:0 }
window.onmousemove = mousePosition;
window.onmouseup = mouseUp;
var dragObj = null;
var resizeY = null;
var resizeX = null;

// Ajax functions
function getAjax(URL, post, interim) {
  var sendType = (post) ? "post" : "get";
  var requestType = (interim) ? true : false;
  var response;
  var xhr = new createXMLHttpRequest();
 
  if (post) waiting(true);
 
  xhr.open(sendType, URL, requestType);
  if (post) xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xhr.send(post);
  response = xhr.responseText;
  xhr.close;
 
  if (response.match(/^\s*$/)) response = null;
  waiting(false);
  return response;
}
function createXMLHttpRequest() {
  try { return new XMLHttpRequest(); } catch (e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP") } catch (e) {}
  try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
  alert ("XMLHttpRequest not Supported!");
  return null;
}
function waiting(on) {
  if (!document.body) return
  if (!_("_WAITING_")) {
    var wait = document.createElement("div");
    wait.style.position = "fixed"; wait.style.width="100%"; wait.style.height="100%"; wait.style.left = "0px"; wait.style.top = "0px"; wait.style.opacity = ".8"; wait.style.background = "#FFF"; wait.style.zIndex = "2500";
    wait.setAttribute("id", "_WAITING_"); wait.id = "_WAITING_";
    document.body.appendChild(wait);
  
    var img = document.createElement("img");
    img.src = "/artsdigital/images/icons/ajax-loader.gif";
    img.style.left = "50%"; img.style.top = "50%"; img.style.position = "absolute";
    wait.appendChild(img);
  }
  if (on) _("_WAITING_").style.visibility = "visible";
  else _("_WAITING_").style.visibility = "hidden";
  return;
}
 
function _(id) { return obj = document.getElementById(id); }

// Overlay functions
function overlay(onoff) {
  if (onoff) {
    if (!_("OVERLAY")) {
      var ws = document.createElement("div");
      ws.setAttribute("id", "OVERLAY");
      ws.style.position = "fixed"; ws.style.left = "0px"; ws.style.top = "0px"; ws.style.background = "#000"; ws.style.width = "100%"; ws.style.height = "100%";
      if (document.all) ws.style.position = "absolute";
      ws.style.filter = "alpha(opacity=50)";  ws.style.zOpacity = "0.7"; ws.style.KhtmlOpacity = "0.7"; ws.style.opacity = "0.7";
      ws.style.zIndex = "1000";
      document.body.appendChild(ws);

      var space = document.createElement("div");
      space.id = "_SPACE_";
      space.style.position = "fixed"; space.style.left = "0px"; space.style.top = "0px"; space.style.width = "100%"; space.style.height = "100%";
      if (document.all) space.style.position = "absolute";
      space.style.zIndex = "1001"; 
      document.body.appendChild(space);

      var close = document.createElement("a");
      close.href = "javascript:overlay()";
      close.innerHTML = "<img src='/artsdigital/images/icons/cancel_40x40.png' style='border: 0px' />";
      close.style.position = "absolute"; close.style.top = "10px"; close.style.right = "10px";
      space.appendChild(close);
    } 
  } else {
    if (_("OVERLAY")) {
      if (notSaved) {
        var goAhead = confirm("Changes have been made without saving.\n\nDo you wish to continue without saving?");
        if (!goAhead) return;
      }
      _("OVERLAY").parentNode.removeChild(_("OVERLAY"));
      _("_SPACE_").parentNode.removeChild(_("_SPACE_"));
    }
  }
  return;
}

function windowOverlay(content, name, color, size, position, movable) {
  if (content) {
    overlay(true);
    name = (name) ? name : "_POPUP_";

    var bit = document.createElement("div");
    bit.id = name;
    bit.style.position = "relative"; 
    bit.style.width = (size) ? size.width : "50%"; bit.style.height = (size) ? size.height : "50%"; 
    bit.style.top = (position) ? position.top : "20%"; bit.style.left = (position) ? position.left : "20%"; 
    bit.style.padding = "1em"; bit.style.paddingTop = "2em"; bit.style.overflow = "auto";
    bit.style.textAlign = "left"; bit.style.fontSize = "1.2em"; 
    if (movable) bit.setAttribute("onmousedown", "dragObj=this");
// For Round corders
/*
    var top = document.createElement("div");
    var tl = document.createElement("div");
    tl.style.width = "50%"; tl.style.cssFloat = "left"; tl.style.background = "";
    var tr = document.createElement("div");

    var bot = document.createElement("div");
    var bl = document.createElement("div");
    var br = document.createElement("div");
//Actual Content
    var mid = document.createElement("div");
*/
    bit.style.background = (color) ? color : "#CCC";
    bit.innerHTML = content;
//    bit.appendChild(top); bit.appendChild(mid); bit.appendChild(bot);

// For window killing icon
    var kill = document.createElement("a");
    kill.href = "javascript:overlay(null, '"+name+"')";
    kill.innerHTML = "<img src='/artsdigital/images/icons/cancel.png' style='border: 0px' />";
    kill.style.position = "absolute"; kill.style.right = "5px"; kill.style.top = "5px";
    bit.appendChild(kill);

    _('_SPACE_').appendChild(bit);
  } else {
    if (_(name)) _('_SPACE_').removeChild(_(name));
    var die = true;
    if (_('_SPACE_')) {
      for (x in _('_SPACE_').childNodes) {
        if (_('_SPACE_').childNodes[x]) { if (_('_SPACE_').childNodes[x].tagName) { if (_('_SPACE_').childNodes[x].tagName.match(/div/i)) {
          die = false;
        } } }
      }
    }
    if (die) overlay();
  }
  return;
}

// Function to generate a caption based on mouseovers and such
function caption(text, objStyle) {
  if (text) {
    var caption;
    if (!_("_CAPTION_")) {
      caption = document.createElement("div");
      caption.id = "_CAPTION_";
      document.body.appendChild(caption);
    } else caption = _("_CAPTION_");

    if (objStyle) {
      for (x in objStyle) caption.style.x = objStyle[x];
    }

    caption.innerHTML = text;
    caption.style.zIndex = 1002; ; caption.style.position = "absolute"; caption.style.visibility = "visible"; 
    caption.style.left = mousePos.x+"px" ; caption.style.top = mousePos.y+"px";
  } else if (_("_CAPTION_")) _("_CAPTION_").style.visibility = "hidden";
  return;
}

// Mouse Position objects
function winDimensions() {
  if (typeof(window.innerHeight)=="number") {
    this.height = window.innerHeight;
    this.width = window.innerWidth;
  } else if (document.body && typeof(document.body.offsetHeight)=="number") {
    this.height = document.body.offsetHeight;
    this.width = document.body.offsetWidth;
  } 
}  
function clearSelection() {
  if (document.selection) refresh = document.selection.clear()
  else if (document.getSelection()) refresh = document.getSelection().clear;
  else if (window.getSelection()) refresh = window.getSelection().clear;
  return;
}
function mousePosition(evt) {
  evt = evt || window.event;

  if (dragObj || resizeY || resizeX) {
    clearSelection();
    mousePos.origX = mousePos.x;
    mousePos.origY = mousePos.y;
  }

  if (evt.pageX && evt.pageY) {
    mousePos.x = evt.pageX; mousePos.y = evt.pageY;
  } else if (evt.clientX) {
    mousePos.x = evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
    mousePos.y = evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
  } 

  if (dragObj) {
    dragObj.style.left = (dragObj.style.left.replace(/px$/, "") - (mousePos.origX - mousePos.x)) + "px";
    dragObj.style.top  = (dragObj.style.top.replace(/px$/, "")  - (mousePos.origY - mousePos.y)) + "px";
  }
  if (resizeX) { // works as right is getting bigger
    if (resizeX.length) {
      for (x in resizeX) { 
        if (resizeX[x].style.width.match(/%$/)) resizeX[x].style.width = Math.ceil((resizeX[x].style.width.replace(/%$/, "") * winDim.width / 100))+"px";
        resizeX[x].style.width = (resizeX[x].style.width.replace(/px$/, "")*1 - mousePos.origX + mousePos.x) + "px";
      }
    } else {
      if (resizeX.style.width.match(/%$/)) resizeX.style.width = Math.ceil((resizeX.style.width.replace(/%$/, "") * winDim.width / 100))+"px";
      resizeX.style.width = (resizeX.style.width.replace(/px$/, "")*1 - mousePos.origX + mousePos.x) + "px";
    }
  }
  if (resizeY) { // always mworks as dwon as getting bigger
    if (resizeY.length) {
      for (x in resizeY) resizeY[x].style.height = (resizeY[x].style.height.replace(/px$/, "")*1 - mousePos.origY + mousePos.y) + "px";

    } else resizeY.style.height = (resizeY.style.height.replace(/px$/, "")*1 - mousePos.origY + mousePos.y) + "px";
  }
}
function mouseUp(evt) { 
  dragObj = null; 
  resizeX = null;
  resizeY = null;
  mousePos.origX = null; mousePos.origY = null;
  clearSelection();
}

// Form Processing
function processForm(formObj, processFile, req_fields, rewriteObj) {
  var ERROR = "";
  var result = "";

  if (formObj.elements) { 
    for (bit in formObj.elements) {
      if (formObj.elements[bit]) { if (formObj.elements[bit].tagName) { if (formObj.elements[bit].tagName.match(/^(textarea|input|select)$/i)) { if (formObj.elements[bit].name) {
        if (formObj.elements[bit].getAttribute("origValue")) { // Clearing out default text
          if (formObj.elements[bit].getAttribute("origValue")==formObj.elements[bit].value) formObj.elements[bit].value = null;
        }
// Determining if a required field is empty
        if (!formObj.elements[bit].value) {
          if (req_fields) {
            for (req in req_fields) {
              if (req_fields[req]==formObj.elements[bit].name) {
                ERROR+= formObj.elements[bit].name+" is missing!\n";
                formObj.elements[bit].style.border = "2px solid #D55";
              }
            }
          } else { // Putting something in the input/textarea etc to control what's manadatory but no need for req_fields
            if (formObj.elements[bit].getAttribute("mandatory")) ERROR+= formObj.elements[bit].name+" is missing!\n";
          }
        } else {
          if (formObj.elements[bit].type=="checkbox") {
            if (formObj.elements[bit].checked) result+= formObj.elements[bit].name+"=1&";
          } else if (formObj.elements[bit].name.match(/email/i)) {
            if (formObj.elements[bit].value.match(/^(\w\W*)+@(\w+\W*)+\.(\w+\W*)+$/)) result+= formObj.elements[bit].name+"="+sanitise(formObj.elements[bit].value)+"&";
            else ERROR+= "Please supply a legitimate Email!\n";
          } else {
            if (formObj.elements[bit].value!="NULL") result+= formObj.elements[bit].name+"="+sanitise(formObj.elements[bit].value)+"&";
          }
        }
      } } } }
    } 
  
    if (ERROR) { alert(ERROR+"\nPlease correctly complete these fields before continuing."); return;
    } else {
      var returnMsg = getAjax(processFile, result);
      if (rewriteObj) rewriteObj.innerHTML = returnMsg;
      else alert(returnMsg);
    }
  } else alert("Form "+formObj.id+" has no inputs!!");
  return;
}
function sanitise(string) {
  if (string.match(/[#\&\?=]/)) { 
    string = string.replace(/\?/g, "|_QUESTIONMARK_|");
    string = string.replace(/\&/g, "|_AMPERSAND_|");
    string = string.replace(/#/g, "|_HASH_|");
    string = string.replace(/=/g, "|_EQUAL_|");
  }       
  return string;
}
function dummyVal() { //create a dummy string.  For IE Ajax callsS
  var NOW = new Date;
  var dummy = NOW.valueOf();
  return dummy;
}
function clearEntry(obj, str) {
  if (obj.value==str) obj.value = "";
  if (!obj.origValue) obj.setAttribute("origValue", str);
  return;
}
function clearRadio(contObj) { //clears all the values in a container with radio objects
  for (x in contObj.childNodes) {
    if (contObj.childNodes[x]) { if (contObj.childNodes[x].tagName) { if (contObj.childNodes[x].tagName.match(/^input$/i)) { if (contObj.childNodes[x].type) { if (contObj.childNodes[x].type.match(/radio/i)) {
      if (contObj.childNodes[x].checked) contObj.childNodes[x].checked = null;
    } } } } }
  }
  return;
}
// functoin to display text after an onchange or a click on a checkbox.
function chooseOne(targetURL, val, obj) {
  if (!targetURL) return;
  if (!obj) return;
  if (val==false) val = "";
  var response = getAjax(targetURL+val+"&dummy="+dummyVal());
  obj.innerHTML = response;

  return;
}
// Show and hide text
function getMore(hidden, msg) {
  if (_(hidden)) { 
    if (!msg) msg = "<i>more...</i>";
    _(hidden).style.visibility = "hidden";
    _(hidden).style.position = "absolute";
  
    var clickMe = document.createElement("a");
    clickMe.setAttribute("onclick", cmd);
  
    var xx  = 0;
    while (_('clickMe_'+xx)) xx++;
    var cmd = "moreGotten('"+hidden+"', "+xx+");"
    clickMe.setAttribute("id", "clickMe_"+xx);
    clickMe.setAttribute("href", "javascript:"+cmd);
    clickMe.innerHTML = msg;
    _(hidden).parentNode.insertBefore(clickMe, _(hidden));
  }
  return;
}
function moreGotten(objName, clickMeNum) {
  _(objName).style.visibility = 'visible'; 
  _(objName).style.position = 'relative';
  if (clickMeNum) _('clickMe_'+clickMeNum).parentNode.removeChild(_('clickMe_'+clickMeNum));
  return;
}       
function returnChildrenAsText(obj) { // Function that returns the inner bits of an Object (expected to be used for DOM processing) as Text
  var text = "";
  var current;
  if (obj.childNodes) {
    for (var x=0; x<obj.childNodes.length; x++) {
      if (!obj.childNodes[x].nodeName.match(/^#/)) {
        text+= "<"+obj.childNodes[x].nodeName;
        if (obj.childNodes[x].attributes) {
          for (y=0; y<obj.childNodes[x].attributes.length; y++) text+= " "+obj.childNodes[x].attributes[y].name+"=\""+obj.childNodes[x].attributes[y].value+"\"";
        }
        text+= ">";
      } 
      if (obj.childNodes[x].childNodes.length>1) text+= returnChildrenAsText(obj.childNodes[x]);
      else text+= obj.childNodes[x].nodeValue;

      if (!obj.childNodes[x].nodeName.match(/^#/)) text+= "</"+obj.childNodes[x].nodeName+">";
    }
  }
  return text;
}


