
/**
 * Framework
 *
 * @copyright Copyright (c) 2010, ecto.lt
 * @author    Benas Valančius <benas@ecto.lt>
 * @package   Framework
 *
 * $Id: functions.js 537 2010-05-13 08:29:36Z noen $
 */

/**
 * Alias document.getElementById()
 *
 * @param string itemId - Item ID
 *
 * @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 - DOM object
 *
 * @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     - DOM object
 * @param integer opacity - 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;
}

/**
 * Escape html
 *
 * @param string text - 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 = {};

    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;
}

// TODO: panaikiti sita
var form = {
    /**
     * Check email validation
     *
     * @param string email - Email address
     *
     * @return bool
     */
    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 path
     *
     * @param string string - Path
     *
     * @return bool
     */
    checkPath : function(string)
    {
        var regexp = /^([\w-]+(?:\.[\w-]+)*)$/i;
        if(regexp.test(string))
            return true;

        return false;
    },

    /**
     * Check date validation
     *
     * @param string Y - Year YYYY
     * @param string M - Mounth MM
     * @param string D - Day DD
     *
     * @return bool
     */
    checkDate : function(Y, M, D)
    {
        Y = Y - 0;
        M = M - 0;
        D = D - 0;

        if(!(Y >= 1000 && Y <= 3000))
            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;
    },

    /**
     * Set error style
     *
     * @param string selector - jQuery selector
     */
    setError : function(selector)
    {
        if(!$(selector).length)
        {
            alert('Element not found "'+ selector +'".');
            return;
        }

        $(selector).each(function(i){
            var parent = $(this).parent().get(0);

            while(parent.tagName.toLowerCase() != 'li' && parent.tagName.toLowerCase() != 'body')
                parent = $(parent).parent().get(0);

            $(parent).attr('class','error');
        });
    },

    /**
     * Clear error style
     *
     * @param string selector - jQuery selector
     */
    clearError : function(selector)
    {
        if(!$(selector).length)
        {
            alert('Element not found "'+ selector +'".');
            return;
        }

        $(selector).each(function(i){
            var parent = $(this).parent().get(0);

            while(parent.tagName.toLowerCase() != 'li' && parent.tagName.toLowerCase() != 'body')
                parent = $(parent).parent().get(0);

            $(parent).attr('class','');
        });
    },

    /**
     * Clear all errors
     *
     * @param string selector - jQuery selector
     */
    clearErrors : function(selector)
    {
        if(!$(selector).length)
        {
            alert('Element not found "'+ selector +'".');
            return;
        }

        $(selector).find('li.error').attr('class','');
    },

    /**
     * Validate field
     *
     * @param string selector - jQuery selector
     * @param bool   rule     - Rule to validate
     * @param bool   empty    - Check is this field empty
     *
     * @return bool
     */
    checkField : function(selector, rule, empty)
    {
        if(rule === undefined)
            rule = false;

        if(empty === undefined)
            empty = true;

        if(!$(selector).length)
        {
            alert('Element not found "'+ selector +'".');
            return false;
        }

        var value = $(selector).val();

        if(empty && value == '')
        {
            this.setError(selector);
            return false;
        }

        if(rule)
        {
            switch(rule)
            {
                case 'email':
                    if(!this.checkEmail(value))
                    {
                        this.setError(selector);
                        return false;
                    }
                    break;

                case 'path':
                    if(!this.checkPath(value))
                    {
                        this.setError(selector);
                        return false;
                    }
                    break;

                default:
                    // @TODO: regexp
            }
        }
        this.clearError(selector);
        return true;
    }
}

/**
 * Form handler
 */
var formHandler = {
    /**
     * Validator helper
     */
    helper : {
        /**
         * Check date validation
         *
         * @param string date - jQuery selector
         *
         * @return bool
         */
        checkboxBlock : function(selector)
        {
            if($(selector +':checked').length == 0)
                return false;

            return true;
        },

        /**
         * Check date validation
         *
         * @param string date - Date
         *
         * @return bool
         */
        checkDate : function(date)
        {
            var d = date.split('-');

            if(d.length != 3)
                return false;

            return form.checkDate(d[0], d[1], d[2]);
        }
    },

    /**
     * Validate form
     */
    checkForm : function(fields, errorOutput)
    {
        if(fields === undefined)
            return true;

        var status = true;
        var error = new Array();

        for(var x in fields)
        {
            if($(fields[x].selector).length == 0)
            {
                alert('Error: element(s) not found "'+ fields[x].selector +'"');
                return false;
            }

            var thisStatus = true;

            switch(fields[x].rule)
            {
                case false:
                    break;

                case undefined:
                    if($(fields[x].selector).attr('type').toLowerCase() == 'checkbox' && !$(fields[x].selector).is(':checked'))
                        thisStatus = false;
                    else if($(fields[x].selector).attr('type').toLowerCase() == 'radio' && !$(fields[x].selector).is(':checked'))
                        thisStatus = false;
                    else if($(fields[x].selector).val() == '' || $(fields[x].selector).val() == null)
                        thisStatus = false;
                    break;

                case 'email':
                    if(!form.checkEmail($(fields[x].selector).val()))
                        thisStatus = false;
                    break;

                case 'date':
                    if(!this.helper.checkDate($(fields[x].selector).val()))
                        thisStatus = false;
                    break;
            }

            if(thisStatus && (fields[x].extra !== undefined || fields[x].validate !== undefined))
            {
                // Extra check metodas sėkmės atvėju turi gražinti tik true, jei bus gražinama kas nors kitkas, skaitysis kaip klaida ar klaidos kodas
                if(fields[x].validate !== undefined)
                {
                    var args = [fields[x].selector];

                    for(var el in fields[x].validate)
                    {
                        if(el == 0)
                            var func = fields[x].validate[el];
                        else
                            args.push(fields[x].validate[el]);
                    }
                    
                    eval('var tmpStatus = '+ func +'(\''+ args.join('\',\'') +'\');');
                }
                else
                    eval('var tmpStatus = '+ fields[x].extra +'(\''+ fields[x].selector +'\');');

                if(tmpStatus !== true)
                {
                    thisStatus = false;

                    if(fields[x].messageExtra !== undefined)
                    {
                        if(typeof(fields[x].messageExtra) === 'string')
                            fields[x].message = fields[x].messageExtra;
                        else if(fields[x].messageExtra[tmpStatus] !== undefined)
                            fields[x].message = fields[x].messageExtra[tmpStatus];
                    }
                }
            }

            if(thisStatus)
            {
                $(fields[x].selector).parents('dd').removeClass('error');
            }
            else
            {
                status = false;
                $(fields[x].selector).parents('dd').addClass('error');

                if(fields[x].message)
                    error.push(fields[x].message);
            }
        }

        if(status)
        {
            $(errorOutput).slideUp(300, function(){$(this).removeAttr('class');});
            return true;
        }

        if(error.length > 0)
        {
            if(error.length > 1)
            {
                var html = '<ol>';

                for(var x in error)
                {
                    html += '<li>'+ error[x] +'</li>';
                }

                html += '</ol>';
            }
            else
                html = error.join('');

            $(errorOutput).addClass('error').html(html).slideDown(300);
        }

        return false;
    }
};

/**
 * Make background color animation
 *
 * @param string id - Element ID
 */
function tempHighlight(id)
{
    $('#'+ id).css('background','#ffff99');
    $('#'+ id).stop();
    $('#'+ id).animate({backgroundColor:'#ffffff'}, 1500);
}

/**
 * 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);
}

/** jQuery plugins */

/**
 * jQuery Color Animations
 * Copyright 2007 John Resig
 * Released under the MIT and GPL licenses.
 * Modified by Ben XO to expose getRGB and getColor through jQuery
 */
(function(jQuery){
    jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){ jQuery.fx.step[attr] = function(fx){ if(fx.state == 0){ fx.start = getColor( fx.elem, attr ); fx.end = getRGB( fx.end ); } fx.elem.style[attr] = "rgb(" + [ Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0), Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0), Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0) ].join(",") + ")"; }; });
    function getRGB(color) { var result; if(color && color.constructor == Array && color.length == 3) return color; if(result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; if(result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; if(result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; if(result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; return colors[jQuery.trim(color).toLowerCase()]; }
    function getColor(elem, attr) { var color; do { color = jQuery.curCSS(elem, attr); if(color != '' && color != 'transparent' || jQuery.nodeName(elem, "body")) break; attr = "backgroundColor"; } while (elem = elem.parentNode); return getRGB(color); };
})(jQuery);
