//NOTE: All the utility functions are dependent from jQuery!
function newWindow(url) {
    window.open(url);
    return false;
}

jQuery.preloadImages = function() {
  for(var i = 0; i<arguments.length; i++) {
    jQuery("<img>").attr("src", arguments[i]);
  }
};

function updateFrameSize(from, to) {
    $(to).attr({width: $(from).outerWidth(), height: $(from).outerHeight()});
}

$(document).ready(function() {
//    //adding the event listerner for Mozilla
//    if(window.addEventListener) document.addEventListener('DOMMouseScroll', wheel, false);
    //for IE/OPERA etc
    var IE6 = false /*@cc_on || @_jscript_version <= 5.7 @*/;
    if (IE6) {
        document.onmousewheel = wheel;
    }

});


function wheel(event){
        var delta = 0;
        if (!event) event = window.event;
        if (event.wheelDelta) {

                delta = event.wheelDelta/120;
                if (window.opera) delta = -delta;
        }
        //not needed for ie6
        else if (event.detail) {
            alert('Z');
                delta = -event.detail/3;
        }

    var scrollTop = document.getElementsByTagName("html")[0].scrollTop;
    if (delta < 0) {
        //calculating the current screen parameters
        var dimentions = getScreenSize();
        var dimHeight = dimentions.height;

        //calculating document's end (ignores the dialogs)
        var bottom = $('#footer-wrap');
        var bottomPos = bottom.attr('offsetTop');
        var documentHeight = bottomPos + bottom.height() + 45; //45 px is a constant to scroll down

        var currentHeight = dimHeight + scrollTop;
        if (currentHeight >= documentHeight) {
            $.scrollTo(documentHeight - dimHeight, 0);
        } else {
            $.scrollTo(scrollTop + 120, 0);
        }
        return false;
    } else if (delta > 0) {
        $.scrollTo(Math.max(scrollTop - 120,0), 0);
    }
    return false;
}

/*
 Tries to log the messages string to debug bar
 */
function log(str) {
    debug_log&&debug_log(str);
}

function logMs(str) {
    if (debug_log) {
        var d = new Date();
        debug_log(str + ' at ' + d.getSeconds()+":"+d.getMilliseconds());
    }
}

function getScreenSize() {
    var dimensions = {width: 0, height: 0};
    if (document.documentElement) {
        dimensions.width = document.documentElement.offsetWidth;
        dimensions.height = document.documentElement.offsetHeight;
    } else if (window.innerWidth && window.innerHeight) {
        dimensions.width = window.innerWidth;
        dimensions.height = window.innerHeight;
    }
    return dimensions;
}

function newClass(parent, prop) {
    // Dynamically create class constructor.
    var clazz = function() {
        // Stupid JS need exactly one "operator new" calling for parent
        // constructor just after class definition.
        if (clazz.preparing) return delete(clazz.preparing);
        // Call custom constructor.
        if (clazz.constr) {
            this.constructor = clazz; // we need it!
            clazz.constr.apply(this, arguments);
        }
    };
    clazz.prototype = {}; // no prototype by default
    if (parent) {
        parent.preparing = true;
        clazz.prototype = new parent;
        clazz.prototype.constructor = parent;
        clazz.constr = parent; // BY DEFAULT - parent constructor
    }
    if (prop) {
        var cname = "constructor";
        for (var k in prop) {
            if (k != cname) clazz.prototype[k] = prop[k];
        }
        if (prop[cname] && prop[cname] != Object)
            clazz.constr = prop[cname];
    }
    return clazz;
}

function enableLoadingBlock(block) {
    var loadingPane = $("#loading-pane");
    if (loadingPane.html().length == 0) {
    	loadingPane.html("<p><strong>" + loadingPane.attr("class") + "</strong></p>");
    }
    if (block) {
    	loadingPane.css('display', 'block');
    } else {
    	loadingPane.css('display', 'none');
    }
}

function countSymbolsLeftForTextArea(maxLength, textAreaSelector, symbolCounterSelector) {
    var inputArea = $(textAreaSelector);
    var inputSize = parseInt(inputArea.val().length);
    var left = maxLength - inputSize;
    if (left < 0) {
        left = 0;
        inputArea.addClass("wrong-field");
    } else {
        inputArea.removeClass("wrong-field");
    }
    var counterObj = $(symbolCounterSelector);
    counterObj.html(left.toString());

    if (left < 10) {
        counterObj.addClass("textarea-counter-alert");
    } else {
        counterObj.removeClass("textarea-counter-alert");
    }
}

function showDialog(dialog, center) {
    // all other dialogs except "dialog" should be hidden before open this
    $(".dialog-window-dev").not(dialog).hide();
    var top_pos = 0;
    var left_pos = 0;
    if (center) {
        if( document.documentElement && document.documentElement.scrollTop ) {
            top_pos = Math.max(document.documentElement.scrollTop, 0);
        }else if( typeof(window.pageYOffset ) == 'number' ) {
            top_pos =  Math.max(window.pageYOffset, 0);
        }
        if( document.documentElement && document.documentElement.scrollLeft ) {
            left_pos = Math.max(document.documentElement.scrollLeft, 0);
        }else if( typeof(window.pageXOffset ) == 'number' ) {
            left_pos =  Math.max(window.pageXOffset, 0);
        }
        dialog.css({'position':'absolute','visibility':'hidden','display':'block'});
        top_pos = Math.max(top_pos + Math.floor(($(window).height() - dialog.find(".dialog").height())/2), 0);
        left_pos = Math.max(left_pos + Math.floor(($(window).width() - dialog.find(".dialog").width())/2), 0);
        dialog.css({'visibility':'visible'});
    }
    dialog.find('.dialog-draggable').css({left:left_pos + 'px',top:top_pos+'px'});
    dialog.show();
    updateFrameSize(dialog.find(".dialog"), dialog.find(".banner-fix:first"));
}

/**
 * Returns a string of numbers from the current string.
 * So from 'ab234dc!e2We3sd' it should extract '23423'
 * @param st string with numbers
 */
function retrieveNumbersFromString(st) {
    if (st) {
        return st.match(/\d+/g).join('');
    }
    return st;
}

