/*
* @name         ScriptHelper
* @description  Un-obtrusive JavaScript tool for commonly performed tasks
* @author       Scott Lewis
* @date         October 15, 2008
* @version      0.0.2
*/

var ScriptHelper = function() {
    this.initMouseMove();
};

ScriptHelper.prototype.initMouseMove = function() {
    this.bind(
        window,
        "load",
        function(e) {
            Helper.bind(
                document,
                "mousemove",
                function(e) {
                    Helper.getCursorPos(e);
                }
            );
        }
    );
};

ScriptHelper.prototype.extend = function(ClassName) {
    var obj = new ClassName();
    for (key in obj) {
        try {
            if (this[key] == undefined) {
                this[key] = obj[key];
            }
        }
        catch (e) {
            // Fail silently
        }
    };
};

/*
* @param object options
* 
* @example {
*    url:"http://www.mydomain.com/file.html", 
*    method:"GET", 
*    callback:myCallback
* }
*
*/

ScriptHelper.prototype.ajax = function(options) {

    var http_request;
    var response;
    var i;
    
    var activex_ids = [
       "MSXML2.XMLHTTP.3.0",
       "MSXML2.XMLHTTP",
       "Microsoft.XMLHTTP"
    ];
    
    var url        = options.url;
    var method     = options.method;
    var callback   = options.callback;
    var return_xml = options.xml;
    
    if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType("text/xml");
        }
    } 
    else if (window.ActiveXObject) { // IE6 and older
        for (i = 0; i < activex_ids.length; i++) {
            try {
                http_request = new ActiveXObject(activex_ids[i]);
            } catch (e) {}
        }
    }
    
    if (!http_request) {
        // alert("Unfortunately your browser doesn"t support this feature.");
        return false;
    }
    
    http_request.onreadystatechange = function() {
        if (http_request.readyState !== 4) {
            // not ready yet
            return;
        }
        if (http_request.status !== 200) {
            // ready, but not OK
            alert("There was a problem with the request.(Code: " + http_request.status + ")");
            return;
        }
        if (return_xml) {
            response = http_request.responseXML;
        } 
        else {
            response = http_request.responseText;
        }
            
        // invoke the callback
        
        callback(response);
    };
    
    http_request.open(method, url, true);
    http_request.send(null);
};

/*
* Element selection Helpers
*/

ScriptHelper.prototype.get = function(selector, context) {

    // Get elements by class name
    
    if (!context) context = document;

    if (selector.charAt && selector.charAt(0) == ".") {
        return this._getByClass(selector.substring(1), context);
    }
    
    // Get elements by id
    
    else if (selector.charAt && selector.charAt(0) == "#") {
        return this._getById(selector.substring(1));
    }
    
    // Get elements by tag name
    
    else if (typeof(selector) == "string") {
        return this._getByTagName(selector, context);
    }
    
    // Get element(s) by DOM Element Object
    
    else {
        try {
            return document[selector];
        }
        catch (e) {/* fail silently */}
    }
};

ScriptHelper.prototype._getByClass = function(searchClass, node, tag) {
    var classElements = new Array();
    if (node == null) node = document;
    if (tag == null) tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if (pattern.test(els[i].className)) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
};

ScriptHelper.prototype._getById = function(id) {
    return document.getElementById(id);
};

ScriptHelper.prototype._getByTagName = function(tag, context) {
    if (!context) context = document;
    return context.getElementsByTagName(tag);
};

ScriptHelper.prototype.bind = function(element, event, callback, data, capture) {
    var self = this;

    var fn = callback;
    if (data != undefined) {
        var callback = function(e) {
            e.data = data;
            return fn.apply(this, arguments);
        };
    }
        
    if (element && element.addEventListener) {
        element.addEventListener(event, callback, false);
    }
    else if (element && element.attachEvent) {
        element.attachEvent('on'+event, callback);
    }
};

ScriptHelper.prototype.preventDefault = function(e) {
    e.returnValue = false;
    if (e.preventDefault) {
        e.preventDefault();
    }
};

/*
* Style Helpers
*/

ScriptHelper.prototype.show = function(element) {
    if (element == undefined) return;
    if (typeof(element) == "array") {
        for (var i=0; i<element.length; i++) {
            element[i].style.display = "block";
        }
    }
    else {
        element.style.display = "block";
    }
};

ScriptHelper.prototype.hide = function(element) {
    if (element == undefined) return;
    if (typeof(element) == "array") {
        for (var i=0; i<element.length; i++) {
            element[i].style.display = "none";
        }
    }
    else {
        element.style.display = "none";
    }
};

ScriptHelper.prototype.toggle = function(element) {
    if (element == undefined) return;
    if (typeof(element) == "array") {
        for (var i=0; i<element.length; i++) {
            if (element[i].style.display == "block") {
                element[i].style.display = "none";
            }
            else {
                element[i].style.display = "none";
            }
        }
    }
    else {
        if (element.style.display == "block") {
                element.style.display = "none";
        }
        else {
            element.style.display = "none";
        }
    }
};

ScriptHelper.prototype.style = function(element, property, value) {
    if (element == undefined) return;
    if (typeof(value) == "string") {
        element.style[property] = value;
        return element.style[property];
    }
    if (window.getComputedStyle) {
        return window.getComputedStyle(element,null)[property];
    } 
    else if (element.currentStyle) {
        return element.currentStyle[property];
    }
};

/*
* Position and Dimension Helpers
*/


ScriptHelper.prototype.uniqueId = function() {
    return "natbc-" + new Date();
};

ScriptHelper.prototype.cursorPosX = function(e) {
    return (this.cursorPos.x ? this.cursorPos.x : "");
};

ScriptHelper.prototype.cursorPosY = function(e) {
    return (this.cursorPos.y ? this.cursorPos.y : "");
};

ScriptHelper.prototype.getCursorPos = function(e) {

	var standardBody = (document.compatMode=="CSS1Compat")? document.documentElement: document.body; 

    var cursorPosX = (window.Event) ? e.pageX : e.clientX;
    var cursorPosY = (window.Event) ? e.pageY : e.clientY + standardBody.scrollTop;
    /*
    if (this.scrollX()) {
        cursorPosX += this.scrollX();
    }
    if (this.scrollY()) {
        cursorPosY += this.scrollY();
    }
    alert(this.scrollY());
    */
    this.cursorPos = {
        x: cursorPosX,
        y: cursorPosY
    };
};

ScriptHelper.prototype.getX = function(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while(1) {
          curleft += obj.offsetLeft;
          if (!obj.offsetParent) break;
          obj = obj.offsetParent;
        }
    }
    else if (obj.x) {
        curleft += obj.x;
    }
    return curleft;
};

ScriptHelper.prototype.getY = function(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while(1) {
          curtop += obj.offsetTop;
          if (!obj.offsetParent) break;
          obj = obj.offsetParent;
        }
    }
    else if (obj.y) {
        curtop += obj.y;
    }
    return curtop;
};

ScriptHelper.prototype.width = function(obj) {
    var width = 0;
    if (window == obj) {
        return this.getWindowSize().width;
    }
    else {
        // need logic for element width
    }
    return width;
};

ScriptHelper.prototype.getWindowSize = function() {

    var body = document.body;
    var docEle = document.documentElement;
    var doc_w, doc_h;
    var vp_w, vp_h;
    if (window.innerHeight && window.scrollMaxY) {
        doc_w = window.innerWidth + window.scrollMaxX;
        doc_h = window.innerHeight + window.scrollMaxY;
    } else if (body.scrollHeight > body.offsetHeight) {
        doc_w = body.scrollWidth;
        doc_h = body.scrollHeight;
    } else {
        doc_w = body.offsetWidth;
        doc_h = body.offsetHeight;
    }
    if (window.innerHeight) {
        if (docEle && docEle.clientWidth) {
            vp_w = docEle.clientWidth;
        } else {
            vp_w = window.innerWidth;
        }
        vp_h = window.innerHeight;
    } else if (docEle && docEle.clientHeight) {
        vp_w = docEle.clientWidth;
        vp_h = docEle.clientHeight;
    } else {
        vp_w = body.clientWidth;
        vp_h = body.clientHeight;
    }
    return {
        height: Math.max(doc_h, vp_h),
        width: Math.max(doc_w, vp_w)
    };
};

ScriptHelper.prototype.height = function(obj) {
    var height = 0;
    if (window == obj) {
        return this.getWindowSize().height;
    }
    else {
        // need logic for element height
    }
    return height;
};

ScriptHelper.prototype.scrollX = function() {
    var scrOfX = 0;
    if (typeof(window.pageYOffset) == 'number') {
        // Netscape compliant
        scrOfX = window.pageXOffset;
    } 
    else if (document.body && 
        (document.body.scrollLeft || document.body.scrollTop)) 
    {
        // DOM compliant
        scrOfX = document.body.scrollLeft;
    } 
    else if (document.documentElement && 
        (document.documentElement.scrollLeft || document.documentElement.scrollTop)) 
    {
        // IE6 standards compliant mode
        scrOfX = document.documentElement.scrollLeft;
    }
    return scrOfX;
};

ScriptHelper.prototype.scrollY = function() {
    var scrOfY = 0;
    if (typeof(window.pageYOffset) == 'number') {
        // Netscape compliant
        scrOfY = window.pageYOffset;
    } 
    else if (document.body && 
        (document.body.scrollLeft || document.body.scrollTop)) 
    {
        // DOM compliant
        scrOfY = document.body.scrollTop;
    } 
    else if (document.documentElement && 
        (document.documentElement.scrollLeft || document.documentElement.scrollTop)) 
    {
        // IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    }
    return scrOfY;

};

ScriptHelper.prototype.trim = function(str) {
    return str.replace(/^\s+|\s+$/g,"");
}

ScriptHelper.prototype.merge_arrays = function(arrs) {
    if (!arrs.length) return [];
    var merged = [];
    for (var i=0; i<arrs.length; i++) {
        for (var x=0; x<arrs[i].length; x++) {
            merged.push(arrs[i][x]);
        }
    }
    return merged;
};

ScriptHelper.prototype.validate = function(val, type) {
    switch (type) {
        case "email":
            emailpat = /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/;
             return emailpat.test(val);
            break;
        case "notnull":
            if (!val) {
                return false;
            }
            return Helper.trim(val) != "";
            break;
        case "phone":
            // not yet implemented
            break;
        case "number":
            return !isNaN(val);
            break;
        case "int":
            // not yet implemented
            break;
        case "float":
            // not yet implemented
            break;
    }
};

ScriptHelper.prototype.has_class = function(element, className) {
    if (element && element.className) {
        return element.className.match(
            new RegExp('(\\s|^)' + className + '(\\s|$)')
        );
    }
    return false;
};

ScriptHelper.prototype.add_class = function(element, className) {
    if (!this.has_class(element, className)) {
        element.className += " " + className;
    }
};

ScriptHelper.prototype.remove_class = function(element, className) {
    if (this.has_class(element, className)) {
        var reg = new RegExp('(\\s|^)'+className+'(\\s|$)');
        element.className = element.className.replace(reg,' ');
    }
};

ScriptHelper.prototype.make_active = function(element) {
    this.add_class(element, "active");
};

ScriptHelper.prototype.make_inactive = function(element) {
    this.remove_class(element, "active");
};

ScriptHelper.prototype.setCookie = function(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
};

ScriptHelper.prototype.getCookie = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i=0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') {
            c = c.substring(1,c.length);
        }
        if (c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length,c.length);
        }
    }
    return null;
};

ScriptHelper.prototype.eraseCookie = function(name) {
    this.setCookie(name,"",-1);
};

ScriptHelper.prototype.openPrintWindow = function(url) {
    window.open(
        url,
        "printwindow",
        "menubar=0,resizable=1,width=700,height=800"
    ); 
};

/*
* Create a globally accessible Helper object.
*/ 

if (!window.Helper) {
    window.Helper = new ScriptHelper();
}

/*
* This is not really the best place for this, but this is the only file that is 
* included on every page.
*/

function init_print_buttons() {
    var buttons = Helper.get(".print-button");
    if (buttons.length) {
        for (var i=0; i<buttons.length; i++) {
            var href = buttons[i].href;
            Helper.bind(
                buttons[i],
                "click",
                function(e) {
                    Helper.preventDefault(e);
                    Helper.openPrintWindow(e.data);
                },
                href
            );
        }
    }
};

if (window.Helper) {
    Helper.bind(window, 'load', init_print_buttons);
};