// script.js
window.onload = function()
{
    if( id('overlay') ) create("div", "overlayBlur", document.body);
    if( id('rules_link') ) {
        listener(id('rules_link'), 'click', showOverlay);
        if (id('rules_link2')) listener(id('rules_link2'), 'click', showOverlay);
        listener(window, ['resize', 'scroll'], function(){
            if (id('overlay').style.display == 'block' ) showOverlay()
        })
    }
    if( id('query') ) listener(id('query'), 'focus', clearSearch);
    
    if (typeof(initCodeBox) != 'undefined') initCodeBox()

    return null;
}

function showOverlay()
{
    var page = getPageSize();
    var overlay_width = 423 + 14*2
    var overlay_height = 440 + 14*2
    
    var overlayBlur = id('overlayBlur')
    var overlay = id('overlay')

    var center = getCenter(overlay_width/2, overlay_height/2)
    if (center.top < 0) center.top = 0;
    if (center.left < 0) center.left = 0;
    
    overlayBlur.style.width   = page.width  + "px";
    overlayBlur.style.height  = page.height + "px";
    overlayBlur.style.display = 'block';
    
    overlay.style.left        = center.left + "px";
    overlay.style.top         = center.top + "px";
    overlay.style.display     = 'block';

    
    if( !window.XMLHttpRequest ) // for ie6
    {
        if( id( 'state' ) ) id( 'state' ).style.visibility = "hidden";
        if( id('entries') ) id('entries').style.visibility = "hidden";
    }

    unlisten(id('rules_link'), 'click', showOverlay);
    if (id('rules_link2')) unlisten(id('rules_link2'), 'click', showOverlay);
    listener(id('close'), 'click', hideOverlay);
    
    if (id('amoe_link')) {
        listener(id('amoe_link'), 'click', amoe);
    }

    return false;
}
function hideOverlay()
{
    id('overlayBlur').style.display = 'none';
    id('overlay'    ).style.display = 'none';

    if( !window.XMLHttpRequest ) // for ie6
    {
        if( id( 'state' ) ) id( 'state' ).style.visibility = "visible";
        if( id('entries') ) id('entries').style.visibility = "visible";
    }

    unlisten(id('close'), 'click', hideOverlay);
    listener(id('rules_link'), 'click', showOverlay);
    if (id('rules_link2')) listener(id('rules_link2'), 'click', showOverlay);

    return false;
}

function clearSearch()
{
    if( id('query').value!="" )
    {
        id('query').value="";
    }
}

function amoe()
{
    if(id('form1')) {
        id('form1').amoe.value = '1'
        id('form1').submit()
    } else if(id('logged_in')) {
        alert("Please use your browser's back button to go back to the item details, the click link from the rules on that page.")
    } else {
        alert("You must first log in to slurpee rewards. Please click the login link near the top of the page.")
    }
}


/* -----------| library functions |-----------------*/
var xhtmlNS = "http://www.w3.org/1999/xhtml"; // xhtml namespace

// returns object with page's 'width' and 'height' dimensions
function getPageSize()
{
    return {
       width  : document.documentElement.clientWidth,
       height : (window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY : document.body.offsetHeight
    };
}
function getViewablePageSize()
{
    var width = document.documentElement.clientWidth
    var height = document.documentElement.clientHeight
    var value = { width  : width, height : height };
    return value
}

// get's the current center of the viewable screen
function getCenter(offsetX, offsetY)
{
    if (!offsetX) offsetX = 0
    if (!offsetY) offsetY = 0
    var page = getViewablePageSize()
    var scrollY = window.pageYOffset || document.documentElement.scrollTop || 0
    var scrollX = window.pageXOffset || document.documentElement.scrollLeft || 0
    return {
        top  : (page.height/2) + scrollY - offsetY,
        left : (page.width/2) + scrollX - offsetX
    }
}

/***************
 *   a j a x   *
 ***************/
function HttpRequest(url)
{
  this.url      = url;
  this.method   = "GET"; //
  this.xml      = true; //  defaults
  this.values   = null;
  this.callback = null;

  this.send = function()
  {
    if( this.url )
    {
      var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); // for ie
      if( request )
      {
        var HttpRequest = this; // pointer to the 'HttpRequest' object

          request.open(this.method, this.url, true);
          request.onreadystatechange = function()
          {
            if( this.readyState==4 ) // upon completion
            {
              if( this.status==200 ) // upon success
              {
                HttpRequest.response = HttpRequest.xml ? this.responseXML : this.responseText; // attach response property to the 'HttpRequest' object

                  if( HttpRequest.callback ) HttpRequest.callback(); // handoff to callback function
              }
              else throw "http request error";
            }
          }

          if( this.method.toUpperCase()=="POST" && this.values )
          {
            request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            request.setRequestHeader("Content-length", this.values.length);
            request.setRequestHeader("Connection", "close");
          }

          request.send(this.values||null);
      }
      else throw "ajax not supported";
    }
    else throw "url required";

    return null;
  }
}
// returns passed 'params' key-value pairs as a string for http post
function postParametersToString(parameters)
{
  var properties = new Array();

    for( var key in parameters ) properties.push(key+"="+parameters[key]);

  return properties.join('&');
}
/*****************
 *   a r r a y   *
 *****************/
// returns first index of array element of passed value, or '-1' if not found
Array.prototype.getIndexByValue = function(value)
{
    for( var cx = 0, element ; element = this[cx] ; cx++ ) if( element==value ) return cx;

  return -1;
}

Array.prototype.contains = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
}

// sorts an array of objects by passed property
Array.prototype.sortObjectsByProperty = function(property)
{
  return this.sort(
    function(a, b) {
           if( a[property]<b[property] ) return -1;
      else if( a[property]>b[property] ) return  1;
      else                               return  0;
    }
  );
}
/*************
 *   d o m   *
 *************/
// returns reference to element with passed id attribute
function id(nodeId) { return document.getElementById(nodeId); }
// returns reference to a collection of passed 'tagName' descendents (with namespace if available) of passed 'parent' element (or document if no parent node passed)
function tags(tagName, parent, ns)
{
    if( !parent ) var parent = document;

  var elements = parent.getElementsByTagNameNS ? parent.getElementsByTagNameNS(ns?ns:xhtmlNS, tagName) : parent.getElementsByTagName(tagName);

  return (elements.length>0) ? elements : false;
}
// returns reference to an 'element' after removing all children nodes
function clear(element)
{
    while( element.hasChildNodes() ) element.removeChild(element.firstChild);

  return element;
}
// returns reference to created element (with namespace if available) of passed 'element' type, with passed 'id' attribute, and as a childnode of passed 'parent' (childnode of 'document' element if parent not defined)
function create(element, id, parent)
{
    if( !document.getElementById(id) ) // if element doesn't already exist
    {
      var node = document.createElementNS ? document.createElementNS(xhtmlNS, element) : document.createElement(element);
          node.setAttribute("id", id);

        parent ? parent.appendChild(node) : document.body.appendChild(node);
    }

  return document.getElementById(id);
}
// returns value of passed 'property' of passed 'element' (according to xml spec, unprefixed attributes are always in 'null' namespace)
function get(element, property) { return element.getAttributeNS ? element.getAttributeNS(null, property) : element.getAttribute(property); }
// returns reference to 'element' after creating childnode containing passed 'string'
function text(element, string)
{
    element.appendChild(document.createTextNode(string));

  return element;
}
// returns reference to 'element' after setting class attribute to passed 'className'
function setClass(element, className)
{
    element.setAttribute("class"    , className);
    element.setAttribute("className", className); // for ie

  return element;
}
// returns reference to 'element' after adding passed css 'property' with passed css 'value' to html element's current css style rules
function css(element, property, value)
{
    element.set("style", (element.hasAttribute('style') ? element.get('style') : null) + property + ":" + value + ";");

  return element;
}
// returns reference to the first element childnode of passed 'parent'
function firstElementChild(parent)
{
  var child = parent.firstChild;

    while( child.nodeType!=1 ) child = child.nextSibling;

  return child;
}
// sets passed event listener to be handled by passed 'handler'
function listener(element, captureEvents, handler)
{
    if (!captureEvents.isArray()) captureEvents = [captureEvents]
    for (var i=0; i<captureEvents.length; i++) {
        if (element.addEventListener) element.addEventListener(captureEvents[i], handler, false);
        else if (element.attachEvent) element.attachEvent("on"+captureEvents[i], handler); // for ie
        else element["on"+captureEvents[i]] = handler;
    }

    return true;
}
// unsets passed event listener to be handled by passed 'handler'
function unlisten(element, captureEvents, handler)
{
    if (!captureEvents.isArray()) captureEvents = [captureEvents]
    for (var i=0; i<captureEvents.length; i++) {
        if (element.removeEventListener) element.removeEventListener(captureEvents[i], handler, false);
        else if (element.detachEvent) element.detachEvent("on"+captureEvents[i], handler); // for ie
        else element["on"+captureEvents[i]] = null;
    }

    return true;
}

function eventTarget(evt)
{
    if( evt.target ) var target = evt.target;
    else if( evt.srcElement ) var target = evt.srcElement;
    if( target && target.nodeType==3 ) target = target.parentNode;

    return target||false;
}
/*******************
 *   s t r i n g   *
 *******************/
// method returns string object if consists of english letters, or false
String.prototype.isLetters = function() { return (!this.match(/[^A-z]/) ? this : false); }
// method returns string object if consists of numeric characters, or false
String.prototype.isNumbers = function() { return (!this.match(/\D/) ? this : false); }
// method returns string object if consists of english letters and/or numeric characters, or false
String.prototype.isAlphaNumeric = function() { return (!this.match(/[^A-z0-9]/) ? this : false); }
// method returns string after removing leading and trailing whitespace characters
String.prototype.trim = function() { return this.replace(/^\s\s*/, "").replace(/\s\s*$/, ""); }

Object.prototype.isArray = function(){ return (this.constructor == Array); }
