var changes = false;
var clicked = null;

function doNav(url){
    document.location.href = (url);
}

function hasClass(ele, cls){
    return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function removeClass(ele, cls){
    var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
    while (hasClass(ele, cls)) 
        ele.className = ele.className.replace(reg, ' ');
}

function addClass(ele, cls){
    if (!hasClass(ele, cls)) 
        ele.className += " " + cls;
}

function toggleClass(ele, cls){
    if (hasClass(ele, cls)) 
        while (hasClass(ele, cls)) 
            removeClass(ele, cls);
    else 
        addClass(ele, cls);
}

function caseStudyClick(ele){
    var old = document.getElementById('thumb_' + clicked);
    removeClass(old, 'clicked');
    addClass(ele, 'clicked');
    clicked = ele.id.replace('thumb_', '');
}

function caseStudyMouseOver(ele){
    toggleClass(ele, 'rollover');
    var my_id = ele.id.replace('thumb_', '');
    showMain(my_id);
}

function showClickedImage(){
    showMain(clicked);
}

function populateImages(){
    for (var i = 0; i < my_ids.length; i++) {
        var e = document.getElementById('thumb_' + my_ids[i]);
        e.src = my_images[my_ids[i]].thumb.src;
    }
    var thumb = document.getElementById('thumb_' + index_image_id);
    addClass(thumb, 'clicked');
    clicked = index_image_id;
    showMain(index_image_id);
}

function showMain(id){
    var mainImg = document.getElementById('mainCaseStudyImage');
    mainImg.src = my_images[id].fullsize.src;
    var caption = document.getElementById('mainCaseStudyImageText');
    caption.innerHTML = nl2br_js(my_images[id].text);
    
}

function editGalleryById(id){
    document.location.href = ('/admin/editgallery?id=' + id);
}

function showGalleryById(id){
    document.location.href = ('/gallery/show?id=' + id);
}

function goToReviewGallery(){
    document.location.href = ('/admin/reviewgallery');
}

function logout(){
    document.location.href = ('/admin/logout');
}

function confirmNav(location, message){
    if (confirm(message) == false) 
        return;
    document.location.href = (location);
}

function confirmAction(action, message){
    if (confirm(message) == false) 
        return;
    eval(action);
}

function goToReviewTestimonials(){
    document.location.href = ('/admin/reviewtestimonials');
}

function test(){
    alert('js working');
}

function getEle(ele){
    return document.getElementById(ele);
}

function doFormNav(my_form, formAction){
    document.getElementById('formAction').value = formAction;
    my_form.submit();
}

function delayedRedirect(url, time){
    js = function(){
        document.location.href = url;
    };
    setTimeout(js, time);
}

function swapCaseStudyImage(filename, image_text){
    var i = document.getElementById('mainCaseStudyImage');
    i.setAttribute('src', '/images/' + filename);
    var s = document.getElementById('mainCaseStudyImageText');
    while (s.hasChildNodes()) 
        s.removeChild(s.childNodes[0]);
    var new_text = document.createTextNode(image_text);
    s.appendChild(new_text);
}

function promptBeforeNav(my_form, url){
    if (changes) {
        var message = 'You have unsaved changes. ';
        message += 'Click \'Ok\' to save or \'Cancel\' to continue without saving';
        if (confirm(message) == true) {
            document.getElementById('formAction').value = 'save';
            my_form.submit();
            return;
        }
    }
    doNav(url);
}

function promptBeforeFormNav(my_form, action){
    if (changes) {
        var message = 'You have unsaved changes. ';
        message += 'Click \'Ok\' to save or \'Cancel\' to continue without saving';
        if (confirm(message) == true) {
            document.getElementById('formAction').value = 'save';
            my_form.submit();
            return;
        }
    }
    document.getElementById('formAction').value = action;
    my_form.submit();
}

function preLoadImages(file_prefix, file_type, count){
    var my_images = new Array();
    for (var i = 0; i < count; i++) {
        my_images[i] = new Image();
        my_images[i].src = '/images/' + file_prefix + '_' + i + '.' + file_type;
    }
    return my_images;
}

function rotateImages(my_images, ele, hold_time, fade_time){
    ele.src = my_images[0].src;
    for (var i = 0; i < my_images.length; i++) {
        for (var j = 0; j < 1; j += 0.1) {
            setTimeout(function(){
                ele.setAttribute('opacity', j);
            }, fade_time / 10);
        }
        setTimeout(function(){
            swapImage(ele, my_images[i]);
        }, hold_time);
        for (var j = 1; j > 0; j -= 0.1) {
            setTimeout(function(){
                ele.setAttribute('opacity', j);
            }, fade_time / 10);
        }
    }
}

function swapImage(ele, imageObject){
    // x = imageObject;
    // ele.src = x.src;
}

function reveal(what){
    var ele = document.getElementById(what);
    toggleClass(ele, 'displayNone');
}

function fadeIn(ele, delay, fade_time, increment, start, end){
    delay = delay ? delay : 0;
    fade_time = fade_time ? fade_time : 1000;
    increment = increment ? increment : 0.02;
    var interval = fade_time * increment;
    start = start ? start : 0;
    end = end ? end : 1;
    var opacity = start;
    if(window.addEventListener) // non-IE version
    	setTimeout(fadeInRepeater, delay);
    else { // for IE
        if (ele.filters.alpha == null) 
            ele.style.filter = 'alpha(opacity = 0)';
    	setTimeout(fadeInRepeaterIE, delay);
    };
    
    function fadeInRepeater(){
        if (opacity < end) {
        	opacity += increment;
            ele.style.opacity = opacity;
            setTimeout(fadeInRepeater, interval);
        }
    };
    
    function fadeInRepeaterIE(){
        if (opacity < end) {
        	opacity += increment;
        	ele.filters.alpha.opacity = opacity * 100;
        	setTimeout(fadeInRepeaterIE, interval);
        };
    };
}

function fadeOut(ele, delay, fade_time, decrement, start, end){
	delay = delay ? delay : 0;
	fade_time = fade_time ? fade_time : 1000;
	decrement = decrement ? decrement : 0.02;
	var interval = fade_time * decrement;
	start = start ? start : 1;
	end = end ? end : 0;
	var opacity = start;
	if(window.addEventListener) // non-IE version
		setTimeout(fadeOutRepeater, delay);
	else { // for IE
		if (ele.filters.alpha == null) 
			ele.style.filter = 'alpha(opacity = 0)';
		setTimeout(fadeOutRepeaterIE, delay);
	};
	
	function fadeOutRepeater(){
		if (opacity > end) {
			opacity -= decrement;
			ele.style.opacity = opacity;
			setTimeout(fadeOutRepeater, interval);
		}
	};
	
	function fadeOutRepeaterIE(){
		if (opacity < end) {
			opacity += decrement;
			ele.filters.alpha.opacity = opacity * 100;
			setTimeout(fadeOutRepeaterIE, interval);
		};
	};
}

function fadeOut(ele, delay, fade_time, decrement, start, end){
    delay = delay ? delay : 0;
    fade_time = fade_time ? fade_time : 1000;
    decrement = decrement ? decrement : 0.02;
    var interval = fade_time * decrement;
    start = start ? start : 1;
    end = end ? end : 0;
    var opacity = start;
    setTimeout(fadeOutRepeater, delay);
    
    function fadeOutRepeater(){
        if (opacity > end) {
            setOpacity(ele, opacity - decrement);
            opacity -= decrement;
            setTimeout(fadeOutRepeater, interval);
        }
    }
}

function setOpacity(ele, decimal_val){
    // use filters if supported (IE)
    if (ele.filters) {
        if (ele.filters.alpha == null) 
            ele.style.filter = 'alpha(opacity = 0)';
        ele.filters.alpha.opacity = decimal_val * 100;
        
    } // else use opacity attribute
    else 
        ele.style.opacity = decimal_val;
}

document.getElementsByClassName = function(cls, parent, tag){
    parent = parent ? parent : document;
    tag = tag ? tag : '*';
    var result = [];
    var elements = parent.getElementsByTagName(tag);
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].nodeType == 1) 
            if (hasClass(elements[i], cls)) 
                result.push(elements[i]);
    }
    return result;
};

function debug(message){
    var container = document.getElementById('container');
    {
        var debugDiv = document.createElement('div');
        debugDiv.id = 'debug';
        container.insertBefore(debugDiv, container.childNodes[0]);
    }
    var debug = document.getElementById('debug');
    var debugString = "Debug: " + message;
    var debugText = document.createTextNode(debugString);
    debug.appendChild(debugText);
    debug.appendChild(document.createElement('br'));
}

function addEvent(obj, event, fn, capture){
    capture = capture || false;
    if (obj.addEventListener) 
        obj.addEventListener(event, fn, capture);
    else 
        if (obj.attachEvent) 
            obj.attachEvent('on' + event, fn);
}

function postToUrl(url, params){
    /*
	 * var myForm = createElement('form', { action : url, method : 'post', style :
	 * 'display: none' }); for ( var key in params) { var myField =
	 * createElement('input', { type : 'hidden', name : key, value : params[key]
	 * }); myForm.appendChild(myField); } document.body.appendChild(myForm);
	 * myForm.submit(); document.body.removeChild(myForm);
	 */
    var myForm = document.createElement('form');
    myForm.setAttribute('method', 'post');
    myForm.setAttribute('action', url);
    myForm.setAttribute('style', 'display: none');
    
    for (var key in params) {
        var myField = document.createElement('input');
        myField.setAttribute('type', 'hidden');
        myField.setAttribute('name', key);
        myField.setAttribute('value', params[key]);
    }
    myForm.appendChild(myField);
    document.body.appendChild(myForm);
    myForm.submit();
    document.body.removeChild(myForm);
}

var createElement = (function(){
    // Detect IE using conditional compilation
    if (/* @cc_on @ */ /* @if (@_win32)!/*@end @ */false) {
        // Translations for attribute names which IE would otherwise choke on
        var attrTranslations = {
            "class": "className",
            "for": "htmlFor"
        };
        
        var setAttribute = function(element, attr, value){
            if (attrTranslations.hasOwnProperty(attr)) {
                element[attrTranslations[attr]] = value;
            }
            else 
                if (attr == "style") {
                    element.style.cssText = value;
                }
                else {
                    element.setAttribute(attr, value);
                }
        };
        
        return function(tagName, attributes){
            attributes = attributes || {};
            
            // See http://channel9.msdn.com/Wiki/InternetExplorerProgrammingBugs
            if (attributes.hasOwnProperty("name") ||
            attributes.hasOwnProperty("checked") ||
            attributes.hasOwnProperty("multiple")) {
                var tagParts = ["<" + tagName];
                if (attributes.hasOwnProperty("name")) {
                    tagParts[tagParts.length] = ' name="' + attributes.name + '"';
                    delete attributes.name;
                }
                if (attributes.hasOwnProperty("checked") &&
                "" + attributes.checked == "true") {
                    tagParts[tagParts.length] = " checked";
                    delete attributes.checked;
                }
                if (attributes.hasOwnProperty("multiple") &&
                "" + attributes.multiple == "true") {
                    tagParts[tagParts.length] = " multiple";
                    delete attributes.multiple;
                }
                tagParts[tagParts.length] = ">";
                
                var element = document.createElement(tagParts.join(""));
            }
            else {
                var element = document.createElement(tagName);
            }
            
            for (var attr in attributes) {
                if (attributes.hasOwnProperty(attr)) {
                    setAttribute(element, attr, attributes[attr]);
                }
            }
            
            return element;
        };
    }
    // All other browsers
    else {
        return function(tagName, attributes){
            attributes = attributes || {};
            var element = document.createElement(tagName);
            for (var attr in attributes) {
                if (attributes.hasOwnProperty(attr)) {
                    element.setAttribute(attr, attributes[attr]);
                }
            }
            return element;
        };
    }
})();

var ds_AJAX = {

    // Set up request object
    getXMLHttp: function(){
        // Create a boolean variable to check for a valid Internet Explorer
        // instance.
        var XMLHttp = false;
        // Check if we are using IE.
        try {
            // If the Javascript version is greater than 5.
            XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e) {
            // If not, then use the older active x object.
            try {
                // If we are using Internet Explorer.
                XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (E) {
                // Else we must be using a non-IE browser.
                XMLHttp = false;
            }
        }
        // If we are using a non-IE browser, create a javascript instance of the
        // object.
        if (!XMLHttp && typeof XMLHttpRequest != 'undefined') {
            XMLHttp = new XMLHttpRequest();
        }
        return XMLHttp;
    },
    
    // Make request
    makeRequest: function(serverPage, objID, method){
        method = method || 'GET';
        var XMLHttp = this.getXMLHttp();
        var obj = document.getElementById(objID);
        XMLHttp.open(method, serverPage);
        XMLHttp.onreadystatechange = function(){
            if (XMLHttp.readyState == 4 && XMLHttp.status == 200) {
                obj.innerHTML = XMLHttp.responseText;
            }
        };
        XMLHttp.send(null);
    }
};

var ds_event = {
    add: function addEvent(elem, evtName, fn, useCapture){
		useCapture = useCapture ? useCapture : true;
		if (typeof elem.addEventListener != 'undefined') {
            if (evtName === 'mouseenter') {
                elem.addEventListener('mouseover', mouseEnter(fn), useCapture);
            }
            else 
                if (evtName === 'mouseleave') {
                    elem.addEventListener('mouseout', mouseEnter(fn), useCapture);
                }
                else {
                    elem.addEventListener(evtName, fn, useCapture);
                }
        }
        else 
            if (typeof elem.attachEvent != 'undefined') {
                elem.attachEvent('on' + evtName, fn);
            }
            else {
                elem['on' + evtName] = fn;
            }
    },
    
    getEvent : function(e) { 
        e = e? e : window.event; 
        if (!e.target) e.target = e.srcElement;
        if (!e.preventDefault) e.preventDefault = function () { e.returnValue = false; return false; };
        if (!e.stopPropagation) e.stopPropagation = function () { e.cancelBubble = true; };
        return e;
    }, 
    
    test: function(){
        alert('test');
    }
};

function mouseEnter(fn){
    return function(evt){
        var relTarget = evt.relatedTarget;
        if (this === relTarget || isAChildOf(this, relTarget)) {
            return;
        }
        
        fn.call(this, evt);
    };
};

function isAChildOf(_parent, _child){
    if (_parent === _child) {
        return false;
    }
    while (_child && _child !== _parent) {
        _child = _child.parentNode;
    }
    
    return _child === _parent;
}


function firstFocus(){
    if (document.getElementsByClassName('firstFocus').length > 0) {
        var first_focus = document.getElementsByClassName('firstFocus');
        first_focus[0].focus();
    }
}

ds_event.add(window, 'load', firstFocus, false);

function nl2br_js(myString){
    return myString.replace(/\n/g, '<br />\n');
}

function getMouse(e){
    var posx, posy;
    if (!e) 
        var e = window.event;
    if (e.pageX || e.pageY) {
        posx = e.pageX;
        posy = e.pageY;
    }
    else 
        if (e.clientX || e.clientY) {
            posx = e.clientX + document.body.scrollLeft +
            document.documentElement.scrollLeft;
            posy = e.clientY + document.body.scrollTop +
            document.documentElement.scrollTop;
        }
    return [posx, posy];
}

