/*  Common JavaScript library  */
/*    1) Small DOM helpers     */
/*    2) Content loader (CL)   */
/*  -------------------------  */
/*  Alex Malyshev              */
/*  Flexites Ltd.              */
/*                  21/07/08   */

function $goto(url) {
    window.location = url;
}

$ = function(element) {
    if (arguments.length > 1) {
        for (var i = 0, elements = [], length = arguments.length; i < length; i++)
            elements.push($(arguments[i]));
        return elements;
    } else {
        return document.getElementById(element);
    }
}


$new = function(params,parent) {
    var tag = params['tag'] || 'div';
    var newEl = document.createElement(tag);
    for (var paramName in params) {
        if ((paramName != 'tag') && (paramName != 'text') && (!paramName.match(/^on\w+/))) { newEl[paramName] = params[paramName]; }
        if (paramName.match(/^on(\w+)/)) {
            var eventName = RegExp.$1;
            $attachEvent(newEl, eventName, params[paramName]);
        }
    }
    if (params['text'] != null) { newEl.appendChild($text(params['text'])); }
    if (parent!=null) { parent.appendChild(newEl); }
    return newEl;
}

$text = function(string) {
    return document.createTextNode(string);
}
$char = function(code) {
    return String.fromCharCode(code);
}
$getText = function(node) {
    if (node.innerText != undefined) return node.innerText; else return node.textContent;
}


$clearDOM = function(el) {
    while (el.childNodes.length>0) { el.removeChild(el.firstChild); }
}

$addClass = function(node, className) {
    $removeClass(node, className);
    node.className += ' '+className;
}

$removeClass = function(node, className) {
    var classes = node.className.split(' ');
    for (var i=0; i<classes.length; i++) {
        if (classes[i] == className) {
            classes.splice(i, 1);
        }
    }
    node.className = classes.join(' ');
}

$style = function(node, args) {
    for (var arg in args) {
        if ((arg == 'left') || (arg == 'top') || (arg == 'width') || (arg == 'height') || (arg == 'right') || (arg == 'bottom')) args[arg] += 'px';
        node.style[arg] = args[arg];
    }
}

$point = function(x, y) { this.x = x; this.y = y; }
$position = function(node, toNode) {
    var el = node;
    var x = 0; var y = 0;
    while ((el)&&(el!=toNode)) {
        if (el.offsetLeft) { x += el.offsetLeft; }
        if (el.offsetTop) { y += el.offsetTop; }
        el = el.offsetParent;
    }
    return new $point(x, y);
}
$attachEvent = function(object, event, method, methodId) {
    if (!methodId) { methodId = ''; }
    object['event_'+event+methodId] = function(event) { method.apply(object, [event]); };
    if (typeof(object['addEventListener']) == 'function') { 
        object.addEventListener(event, object['event_'+event+methodId], false);
    } else {
        object.attachEvent('on'+event, object['event_'+event+methodId]);
    }
}

$detachEvent = function(object, event, methodId) {
    if (!methodId) { methodId = ''; }
    if (typeof(object['removeEventListener']) == 'function') {
        object.removeEventListener(event, object['event_'+event+methodId], false);
    } else {
        object.detachEvent('on'+event, object['event_'+event+methodId]);
    }
}
_GLOBAL = new Object();
JS = new Object();
// Browser checking
//TODO: write more if need
JS.agent = navigator.userAgent;
if (JS.agent.match(/MSIE\s+(\d+)/)) {
    JS.IE = true;
    JS.IE_Version = RegExp.$1;
    if (JS.IE_Version < 7) JS.IE_OLD = true;
}

JS.KHTML = JS.agent.match(/KHTML/);
JS.Opera = JS.agent.match(/Opera/);
JS.Gecko = (!JS.KHTML && JS.agent.match(/Gecko/));
JS.DOM = document.getElementById ? true : false;

/* array copy ----------- */
function $A(source) {
    var ret = [];
    ret = source.slice(0, source.length);
    return ret;
}

/* Ajax Loader */
CL = new Object();
CL.READY_STATE_UNINITIALIZED = 0;
CL.READY_STATE_LOADING = 1;
CL.READY_STATE_LOADED = 2;
CL.READY_STATE_INTERACTIVE = 3;
CL.READY_STATE_COMPLETE = 4;

CL.loader = function(component, url, method, requestParams) {
    this.component = component;
    this.url = url;
    this.requestParams = requestParams;
    this.method = method;
}

CL.loader.prototype = {
    getTransport: function() {
        var transport;
        if (window.XMLHttpRequest) {
            transport = new XMLHttpRequest(); 
        } else if (window.ActiveXObject) {
            try {
                transport = new ActiveXObject('Msxml2.XMLHTTP');
            } catch(err) {
                transport = new ActiveXObject('Microsoft.XMLHTTP');
            }
        }
        return transport;
    },
    sendRequest: function() {
        var requestParams = [];
        for (var i=0; i<arguments.length; i++) {
            requestParams.push(arguments[i]);
        }
        var request = this.getTransport();
        request.open(this.method, this.url, true);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        var oThis = this;
        request.onreadystatechange = function() {
            oThis.handleAjaxResponse(request);
        }
        request.send(this.queryString(requestParams));
    },
    queryString: function(args) {
        var requestParams = [];
        for (var i=0; i<this.requestParams.length; i++) { 
            requestParams.push(this.requestParams[i]);
        }
        for (var i=0; i<args.length; i++) {
            requestParams.push(args[i]);
        }
        var queryString = "";
        if (requestParams && requestParams.length > 0) {
            for (var i=0; i<requestParams.length; i++) {
                queryString += requestParams[i] + '&';
            }
            queryString = queryString.substring(0, queryString.length-1);
        }
        return queryString;
    },
    flushParams: function() {
        this.requestParams = [];
    },
    paramsFromForm: function(form) {
        this.requestParams = [];
        for (var i=0; i<form.elements.length; i++) {
            var element = form.elements[i];
            if ( (element.name != '') &&
                 ( (element.type == 'hidden') || (element.type == 'text') || (element.type == 'select-one') || (element.type == 'textarea') ||
                   ( ( (element.type == 'checkbox') || (element.type == 'radio') ) && (element.checked) ) ) ) {
                if (element.type == 'select-one') this.requestParams.push(element.name+'='+escape(element.options[element.selectedIndex].value));
                else this.requestParams.push(element.name+'='+escape(element.value));
            }
        }
    },
    handleAjaxResponse: function(request) {
        if (request.readyState == CL.READY_STATE_COMPLETE) {
            if (this.isSuccess(request)) {
                this.component.ajaxUpdate(request);
            } else {
                this.component.handleError(request);
            }
        }
        if (request.readyState == CL.READY_STATE_LOADING) {
            if (typeof(this.component.ajaxLoading)=='function') { 
                this.component.ajaxLoading(request);
            }
        }
    },
    isSuccess: function(request) {
        return request.status == 0 || (request.status >= 200 && request.status < 300);
    }
};

CL.xmlSet = function(xmlElement) {
    var len = xmlElement.childNodes.length;
    for (var i=0; i<len; i++) {
        var attrName = xmlElement.childNodes[i].tagName;
        var attrValue = CL.textContent(xmlElement.childNodes[i]);
        this[attrName] = attrValue;
    }
}

CL.textContent = function(xmlElement) {
    var cnt;
    if (xmlElement.text != undefined) cnt = xmlElement.text; else
    if (xmlElement.textContent!=undefined) cnt = xmlElement.textContent; else
    cnt=xmlElement.firstChild.nodeValue;
    
    return cnt;
}

