/**
 * JavaScript scripts set for Framework
 *
 * @author  noen - mr.noen@gmail.com
 * @updated 2008-08-11
 * @version 1.0.0
 */

/**
 * document.getElementById() shortcut
 *
 * @param string itemId
 *
 * @return object
 */
function $$(itemId)
{
    if(!itemId) return null;
    var returnObj = document.getElementById(itemId);
    if(!returnObj && document.all) returnObj = document.all[itemId];
    return returnObj;
}

/**
 * Language compiler
 *
 * @param string langId - language id
 * @param string module - module name
 *
 * @return string
 */
function _(langId, module)
{
    if(module != undefined && __M[module +'_'+ langId] != undefined)
        return __M[module +'_'+ langId];

    if(__[langId] != undefined)
        return __[langId];

    return '*'+ langId +'*';
}

/**
 * Find object position
 *
 * @param object obj
 *
 * @return array
 */
function findPos(obj)
{
    var curleft = curtop = 0;
    if (obj.offsetParent)
    {
        curleft = obj.offsetLeft
        curtop = obj.offsetTop
        while (obj = obj.offsetParent)
        {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
    }
    return [curleft,curtop];
}

/**
 * Set dhtml obejct opacity
 *
 * @param object  obj
 * @param integer opacity [1-100]
 */
function setOpacity(obj, opacity)
{
    obj.style.filter = "alpha(opacity:" + opacity + ")";
    obj.style.KHTMLOpacity = opacity / 100;
    obj.style.MozOpacity = opacity / 100;
    obj.style.opacity = opacity / 100;
}

/**
 * encodeHtml
 *
 * @param string text
 *
 * @return string
 */
function encodeHtml(text)
{
    text = text.replace(/&/g, "&amp;");
    text = text.replace(/"/g, "&quot;");
    text = text.replace(/'/g, "&#039;");
    text = text.replace(/</g, "&lt;");
    text = text.replace(/>/g, "&gt;");
    return text;
}

/**
 * Add slashes
 *
 * @param string string
 */
function add_slashes(string)
{
    string = string.replace(/\\/g, "\\\\"); // \ => \\
    string = string.replace(/\'/g, "\\'");  // ' => \'
    return string;
}

/**
 * Get all form item values
 *
 * @param string form_name
 *
 * @return array
 */
function getFormElements(form_name)
{
    var outup = new Array();

    eval('var el = document.'+form_name+'.elements;');
    eval('var totalElements = el.length;');

    for(i=0; i<totalElements; i++)
    {
        if(el[i].name != undefined)
        {
            var value = null;

            switch (el[i].type)
            {
                case 'text':
                case 'submit':
                case 'hidden':
                case 'password':
                    value = el[i].value;
                    break;
                case 'radio':
                    if(el[i].checked)
                        value = el[i].value;
                    break;
                case 'select-one':
                    value = el[i].value;
                    break;
                case 'select-multiple':
                    var nr = 0;
                    var multiple_element_lenght = el[i].options.length;
                    value = new Array();
                    for(n=0; n<multiple_element_lenght; n++)
                    {
                        if(el[i].options[n].selected)
                        {
                            value[nr] = el[i].options[n].value;
                            nr++;
                        }
                    }
                    break;
                case 'checkbox':
                    if(el[i].checked)
                        value = el[i].value;
                    break;
                case 'textarea':
                    value = el[i].value;
                    break;
                default:
                    //outup += 'type: ' + element_type + ", name: " + el[i].name + " | unknown &";
            }
            
            if(value != null)
            {
                if(el[i].name.substr(-2) == '[]')
                {
                    var name = el[i].name.substr(0, el[i].name.length-2);

                    if(outup[name] == undefined)
                        outup[name] = new Array();

                    outup[name].push(value);
                }
                else
                {
                    outup[el[i].name] = value;
                }
            }
        }
    }
    return outup;
}

/**
 * elemento display keitimas
 */
function display(item_id)
{
    $$(item_id).style.display = ($$(item_id).style.display == 'none') ? '' : 'none';
}

/**
 * Draggable
 */
var dragObj = new Object();

function dragStart(e, id)
{
    var x, y;

    e = e || window.event;
    
    if (id)
    {
        dragObj.elNode = $$(id);
    }
    else
    {
        if(e.target)
            dragObj.elNode = e.target;
        else if(e.srcElement)
            dragObj.elNode = e.srcElement;
        else
            alert('error:unsupported browser');

        if (dragObj.elNode.nodeType == 3)
            dragObj.elNode = dragObj.elNode.parentNode;
    }

    if (window.scrollX) 
    {
        x = e.clientX + window.scrollX;
        y = e.clientY + window.scrollY;
    }
    else
    {
        x = e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
        y = e.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }

    dragObj.cursorStartX = x;
    dragObj.cursorStartY = y;
    dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
    dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

    if(isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
    if(isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

    dragObj.elNode.style.zIndex = ++dragObj.zIndex;

    $(document).bind('mousemove', dragGo);
    $(document).bind('mouseup', dragStop);
    e.stopPropagation();
}

function dragGo(e)
{
    var x, y;

    e = e || window.event;

    if (window.scrollX) 
    {
        x = e.clientX + window.scrollX;
        y = e.clientY + window.scrollY;
    }
    else
    {
        x = e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
        y = e.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }

    var blockX = dragObj.elStartLeft + x - dragObj.cursorStartX;
    var blockY = dragObj.elStartTop  + y - dragObj.cursorStartY;

    if(blockX < 1) blockX = 1;
    if(blockY < 1) blockY = 1;

    if(blockX > document.documentElement.clientWidth - dragObj.elNode.offsetWidth)   blockX = document.documentElement.clientWidth - dragObj.elNode.offsetWidth - 1;
    if(blockY > document.documentElement.clientHeight - dragObj.elNode.offsetHeight) blockY = document.documentElement.clientHeight - dragObj.elNode.offsetHeight - 1;

    dragObj.elNode.style.left = blockX + 'px';
    dragObj.elNode.style.top  = blockY + 'px';

    e.stopPropagation();
    return false;
}

function dragStop(e)
{
    $(document).unbind('mousemove', dragGo);
    $(document).unbind('mouseup', dragStop);
    e.stopPropagation();
    return false;
}

/**
 * Loading message controls
 */
var loading = {
    obj   : false,
    count : 0
};

loading.show = function()
{
    loading.count++;

    if(loading.obj) return;

    loading.obj = document.createElement('div');
    loading.obj.innerHTML = _('loading_msg');
    loading.obj.id = 'ajaxLoading';
    document.body.appendChild( loading.obj );
}
loading.hide = function()
{
    if(loading.obj)
    {
        loading.count--;
        if(loading.count <= 0)
        {
            loading.obj.parentNode.removeChild( loading.obj );
            loading.obj = false;
        }
    }
}


var form = {};

/**
 * Check email validation
 *
 * @param string email - email address
 *
 * @return bool
 */
form.checkemail = function(email)
{
    var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    if (filter.test(email))
        return true;

    return false;
}

/**
 * Check date validation
 *
 * @param string Y - year YYYY
 * @param string M - mounth MM
 * @param string D - day DD
 *
 * @return bool
 */
form.checkDate = function(Y, M, D)
{
    Y = parseInt(Y);
    M = parseInt(M);
    D = parseInt(D);

    if(!(Y >= 1900 && Y <= 2050))
        return false;

    if(!(M >= 1 && M <= 12))
        return false;

    var dayCount = {
        1  : 31,
        2  : 28,
        3  : 31,
        4  : 30,
        5  : 31,
        6  : 30,
        7  : 31,
        8  : 31,
        9  : 30,
        10 : 31,
        11 : 30,
        12 : 31
    };

    if(Y % 4 == 0)
        dayCount[2] += 1;

    if(!(D >= 1 && D <= dayCount[M]))
        return false;

    return true;
}

/**
 * Debuger
 *
 * @param mixed obj
 */
function DUMP(obj)
{
    // TODO: naudoti ne alert o popup
    var temp = '';
    for(var x in obj)
    {
        temp += x + ": " + obj[x] + "\n";
    }
    alert(temp);
}