// Copyright © 2005 ADevel.com ( https://adevel.com/ )
// Author: Kirill Chernyshov ( chk@adevel.com )
var ajaxIsIE = false;

/**
 *    success_handler = function(response_text, response_xml);
 *    error_handler = function();
 *
 */

// Calls success_handler() if src_url loaded successfully. 
// Otherwise error_handler() if specified
// ajaxRequest

function aarq( src_url, success_handler, error_handler ){
    var req = null;
    if (!src_url)
        return false;
    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    else{
        if (window.ActiveXObject){
            ajaxIsIE = true;
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
	}
    
    if (req) {
    	req.onreadystatechange = function(){
    		if (req.readyState == 4) {
			    try{
			    	if (req.status == 200) {
                        if (success_handler){
		        		    success_handler(req.responseText, req.responseXML);
                        } else {
			        		aadp( req.responseXML );
                        }
			        } else {
						if(error_handler){
			        		error_handler();
                        }
			        }
			    }
				finally{}
			}
    	};
        req.open( 'GET', src_url, true);            
        req.send('');
    }
    return false;
}

//Submits the form with specified id using its 'method' and 'action' properties.
// submission url could be replaced with custom_url
// if form is submitted successfully, success_handler() will be called, 
// on error - error_handler()
// If request returned the XML content and success_handler is not specified,
// the default XML parsed would be called (ajaxDefaultXMLParser)
// ajaxSubmitForm
function aasf( form_id, custom_url, success_handler, error_handler ){
	var req = null;
	var frm = document.getElementById( form_id );
	var url = '';
	var method = 'get';
	
	if ( !frm )
		return false;	
	if( !custom_url ) {
		if(frm.action )	
			url = frm.action;
	}
	else{
		url = custom_url;
	}
	
	if( url == '' )	 
		return false;
	if( frm.method )
		method = frm.method;
	
	var params = aacp( form_id )+'&ajax_submit=true';
	
	if (window.XMLHttpRequest)
		req = new XMLHttpRequest();
    else {
	    if (window.ActiveXObject){
	    	ajaxIsIE = true;
	    	req = new ActiveXObject("Microsoft.XMLHTTP");
	    }
    }
    
    if (req) {
    	req.onreadystatechange = function(){
    		if (req.readyState == 4) {
			    try{
			    	if (req.status == 200) {
			    		if(success_handler)
			        		success_handler(req.responseText, req.responseXML);
			        	else{
			        		if( req.responseXML )
			        			aadp( req.responseXML );
			        	}
			        } else {
						if(error_handler)
			        		error_handler();
			        }
			    }
				finally{
					aaec( form_id );
				}
			}
    	};
    	
    	if(method.toLowerCase() == 'get'){
        	req.open('get', url+'?'+params, true );            
        	req.send('');
        }
        else{
        	req.open('post', url, true );            
        	req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    		req.send(params);
        }
        aadc( form_id );
    }
    return true;
}

// the Default XML Response Parser
// XML must contail the toplevel item 'elements' that soud consist of 
// subitems with html ids as tagnames. Every id tag may contain one 
// of the following nodes:
// a) innerHTML; 
// aa) innerHTMLPrepend;
// ab) innerHTMLAppend;
// b) value; 
// c) src; 
// d) className;
// e) checked;
// This nodes specify the corresponding properties of the html element.
// ajaxDefaultXMLParser
function aadp( xml_response ){
	// TODO: just implement it ;)
	if(!xml_response)
		return false;
	
	// go through item ids
	var _elements;
	try{_elements= xml_response.getElementsByTagName("elements")[0];}
		catch(e){return false;	}
	if( _elements ){
		var i, _src, _innerHTML, _innerHTMLPrepend, _innerHTMLAppend, _value, _className, xml_item, _eval;
		for(i=0; i<_elements.childNodes.length; i++){
			xml_item = _elements.childNodes[i];
			html_item = document.getElementById( xml_item.nodeName );
			if(html_item){
				_src = xml_item.getElementsByTagName("src")[0];
				if(_src)
					try{ html_item.src = aagn( null, 'src', xml_item, 0); }finally{}					
					
				_value = xml_item.getElementsByTagName("value")[0];
				if(_value)
					try{ html_item.value = aagn( null, 'value', xml_item, 0); }finally{}
					
				_innerHTML = xml_item.getElementsByTagName("innerHTML")[0];
				if(_innerHTML)
					try{ html_item.innerHTML = aagn( null, 'innerHTML', xml_item, 0); }finally{}
                    
				_innerHTMLPrepend = xml_item.getElementsByTagName("innerHTMLPrepend")[0];
				if(_innerHTMLPrepend)
					try{ html_item.innerHTML = aagn( null, 'innerHTMLPrepend', xml_item, 0) + html_item.innerHTML; }finally{}
										
				_innerHTMLAppend = xml_item.getElementsByTagName("innerHTMLAppend")[0];
				if(_innerHTMLAppend)
					try{ html_item.innerHTML = html_item.innerHTML + aagn( null, 'innerHTMLAppend', xml_item, 0); }finally{}
                    
				_className = xml_item.getElementsByTagName("className")[0];
				if(_className)
					try{ html_item.className = aagn( null, 'className', xml_item, 0); }finally{}
					
				_checked = xml_item.getElementsByTagName("checked")[0];
				if(_checked)
					try{ html_item.checked = aagn( null, 'checked', xml_item, 0); }finally{}
			}
		    _eval = xml_item.getElementsByTagName("eval")[0];
			if(_eval)
			    try{ eval(aagn( null, 'eval', xml_item, 0)); }finally{}
		}
	}
	
	return true;
}

// explicitly replaces the content of specified HTML element with result of requesting src_url
// ajaxSetContent
function aasn(element_id, src_url){
	var callback = function(response_text, response_xml){aafc( element_id, response_text);};
	return aarq( src_url, callback);
}

// eSimilar to aasn, but replaces form field value
// ajaxSetValue
function aasv(element_id, src_url){
	var callback = function(response_text, response_xml){aafv( element_id, response_text);};
	return aarq( src_url, callback);
}


// represents form params as a string
// supports text, textarea, radiobuttons, select (not multiple), checkboxes.. 
// ajaxComposeParams
function aacp( form_id ){
	var j;
	var val;
	var elem;
	var res = '';
	if(!form_id)
		return res;		
	var frm = document.getElementById( form_id );
	if(frm)
		for(var i=0; i<frm.elements.length; i++){
			if(res != '')
				res+='&';
			if(frm.elements[i].type == 'checkbox'){
                if(!frm.elements[i].checked)continue;
            }
			if(frm.elements[i].type == 'radio'){
				elem = frm.elements[frm.elements[i].name];
				val = 'null';
				for(j=0; j < elem.length; j++){
					if(elem[j].checked)
						val = elem[j].value;
				}
				res+=frm.elements[i].name+'='+val;
			}
			else{
				res+=frm.elements[i].name+'='+encodeURIComponent(frm.elements[i].value);
			}
		}
	return res;
}

// retrieves the content of XML item 'prefix:local[index]' of the parent item as a text.
// returns empty string on failure.
// getNodeText
function aagn(prefix, local, parentElem, index) {
    try{
	    var res = "";
	    if (prefix && ajaxIsIE) {
	        res = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	    } else {
	        res = parentElem.getElementsByTagName(local)[index];
	    }
	    if (res) {
	        if (res.childNodes.length > 1) {
	            return res.childNodes[1].nodeValue;
	        } else {
	            return res.firstChild.nodeValue;    		
	        }
	    } else {
	        return "";
	    }
	}
	catch(e){
		return "";
	}
}

// disables all elements of form
// disableControls
function aadc( form_id ){
	var frm = document.getElementById(form_id);
	if(frm)
		for(var i=0; i<frm.elements.length; i++){
			frm.elements[i].disabled = true;
		}
}

// enables all form elements
// enableControls
function aaec( form_id ){
	var frm = document.getElementById(form_id);
	if(frm)
		for(var i=0; i<frm.elements.length; i++){
			frm.elements[i].disabled = false;
		}
}

// sets the innerHTML property of specified element
// fillContent
function aafc( elem_id, new_val){
	var res = false;
	try{
		var elem = document.getElementById(elem_id);
		if (elem){
			elem.innerHTML = new_val;
			res = true;
		}
	}
	finally{}
	
	return res;
}

// sets the value property of form elemenet
// fillValue
function aafv( elem_id, new_val){
	var res = false;
	try{
		var elem = document.getElementById(elem_id);
		if (elem){
			elem.value = new_val;
			res = true;
		}
	}
	finally{}
	
	return res;
}
// gets the value of form element
// getValue
// camper@adevel.com
function aagv(form_id, elem_name){
	var res=false;
	try{
		if(!form_id){
			res=document.getElementById(elem_name).value;
		}else{
			form=document.getElementById(form_id);
			if(form){
				res=form.elements[elem_name].value;
			}
		}
	}
	finally{}
	return res;
}

// Get element by ID in all browsers
// jancha@adevel.com
function aagi( elem_id ){
	if(document.getElementById && document.getElementById(elem_id)) {
		return document.getElementById(elem_id);
	} else if (document.all && document.all(elem_id)) {
		return document.all(elem_id);
	} else if (document.layers && document.layers[elem_id]) {
		return document.layers[elem_id];
	} else {
		return false;
	}
}

function spinner_on(spinner, timeout){
    /* This function starts a spinning wheel */
    var s = document.getElementById(spinner);
    if(!s)return;
    if(s.src){
        /* seems to be img */
        s.src='amodules3/img/loading.gif';
    }else{
        s.innerHTML='<img src="amodules3/img/loading.gif" alt="loading">';
    }
    if(timeout == null)timeout=3000;
    if(timeout>0)setTimeout("spinner_off('"+spinner+"')",timeout);
}
function spinner_off(spinner){
    /* This function stops a spinning wheel */
    var s = document.getElementById(spinner);
    if(!s)return;
    if(s.src){
        /* seems to be img */
        s.src='amodules3/img/not_loading.gif';
    }else{
        s.innerHTML='<img src="amodules3/img/not_loading.gif" alt="loading">';
    }
}

function aaej(src_url, spinner, argument){
    if(spinner)spinner_on(spinner);
	var callback = function(response_text, response_xml){
        eval(response)
        aafc( element_id, response_text);
    };

	return aarq( src_url, callback);
}

function submitForm(form,spinner){
	var callback = function(response_text, response_xml){
        if(response_text){
            try {
                eval(response_text);
            }catch(e){
                w=window.open(null,null,'height=400,width=700,location=no,menubar=no,scrollbars=yes,status=no,titlebar=no,toolbar=no,resizable=yes');
                w.document.write('<h2>Error in AJAX response: '+e+'</h2>');
                w.document.write(response_text);
                w.document.write('<center><input type=button onclick="window.close()" value="Close"></center>');
            }
        }
        if(spinner)spinner_off(spinner);
    };
    return aasf(form,null,callback);
}

//
function getObject(objectId) {
	if(document.getElementById && document.getElementById(objectId)) {
		return document.getElementById(objectId);
	} else if (document.all && document.all(objectId)) {
		return document.all(objectId);
	} else if (document.layers && document.layers[objectId]) {
		return document.layers[objectId];
	} else {
	    return false;
	}
}
/* form sending */
function send(obj_id, text, traditional) {
    ptr = get_obj(obj_id);
    sbm = get_obj("sbm" + obj_id);
    if (text){
        sbm.innerHTML = text + "<img src=\"/design/art/loading.gif\" id=\"dl_spinner\" />";
    } else {
        sbm.innerHTML = "uploading" + "<img src=\"/design/art/loading.gif\" id=\"dl_spinner\" />";
    }
    if (traditional == 0){
        aasf(obj_id);
        /* clear existing error messages */
        var divs = document.getElementsByTagName("div");
        var id;
        for (i = 0; i < divs.length; i++){
            id = divs[i].getAttribute("id");
            if (id){
                if (id.substr(0, 6) == "errcnt"){
                    divs[i].innerHTML = "";
                }
            }
        }
    } else {
        ptr.submit();
    }
    return false;
}
function handle_title_change(obj_id, val){
    sbm = get_obj("sbm" + obj_id);
    sbm.innerHTML = val;
}
function send_plain(obj_id, text) {
    var ptr;
    var sbm;
    ptr = get_obj(obj_id);
    sbm = get_obj("sbm" + obj_id);
    if (text){
        sbm.innerHTML = text;
    } else {
        sbm.innerHTML = "uploading";
    }
    ptr.submit();
    return false;
}

function handle_submit(obj_id, error_msg, btn_name){
    var ptr;
    ptr = get_obj(obj_id);
    sbm = get_obj("sbm" + obj_id);
    sbm.innerHTML = btn_name;
    ptr = get_obj("fe");
    ptr.innerHTML = error_msg;
}
function handle_image_upload(obj_id, val, bttn_id, bttn_text){
    image = get_obj(obj_id);
    image.innerHTML += val;
    restore_name(bttn_id, bttn_text);
}
function handle_redirect(url){
    //if (o(url)){
    	document.location = url;
	//}
}
/* interserver communications */
var is_address = '';
var is_rsid = '';
var is_timeout;
var is_counter = 0;
var is_status_field = '';
var is_info_field = '';
function handle_timeout(){
    if (is_timeout){
        clearTimeout(is_timeout);
    }
    if (!get_obj(is_status_field)){
        return;
    } else {
        ptr = get_obj(is_info_field);
        if (is_counter == 0){
            ptr.innerHTML = "(Loading <img src=\"/design/art/loading.gif\" id=\"dl_spinner_top\" />)";
        } else {
            ptr.innerHTML = "(Loading <img src=\"/design/art/loading.gif\" id=\"dl_spinner_top\" />)";
        }
        is_counter++;
    }
    aarq(is_address + is_rsid);
    is_timeout = setTimeout("handle_timeout()", 1000);
}
function fallback_handler(){
    alert('Generic falback handler. Redefine me pls');
}
function preload(){
    var ptr;
    ptr = get_obj("preload_arena");
    ptr.innerHTML = "<img src=\"/design/art/loading.gif\" />";
}

function restore_name(obj_id, text){
    sbm = get_obj("sbm" + obj_id);
    if (text){
        sbm.innerHTML = text;
    } else {
        sbm.innerHTML = "add";
    }
}
function excess_post_handler(){
    restore_name('phtddfrm', 0);
    alert('File you tried to upload is larger than 650kb');
}

/* mouse thing :) */
document.onmousemove = mouseMove;

function mouseMove(ev){
    ev           = ev || window.event;
    var mousePos = mouseCoords(ev);
}

function mouseCoords(ev){
    if(ev.pageX || ev.pageY){
        return {x:ev.pageX, y:ev.pageY};
    }
    return {
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
        y:ev.clientY + document.body.scrollTop  - document.body.clientTop
    };
}

document.onmouseup = mouseUp;
var dragObject     = null;

function makeClickable(object){
    object.onmousedown = function(){
        dragObject = this;
    }
}

function mouseUp(ev){
    dragObject = null;
}

document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

var dragObject  = null;
var mouseOffset = null;

function getMouseOffset(target, ev){
    ev = ev || window.event;

    var docPos    = getPosition(target);
    var mousePos  = mouseCoords(ev);
    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
    var left = 0;
    var top  = 0;

    while (e.offsetParent){
        left += e.offsetLeft;
        top  += e.offsetTop;
        e     = e.offsetParent;
    }

    left += e.offsetLeft;
    top  += e.offsetTop;

    return {x:left, y:top};
}

function mouseMove(ev){
    ev           = ev || window.event;
    var mousePos = mouseCoords(ev);

    if(dragObject){
        dragObject.style.position = 'relative';
        dragObject.style.top      = -22 + mousePos.y - mouseOffset.y;
        dragObject.style.left     = mousePos.x - mouseOffset.x;
        return false;
    }
}
function mouseUp(){
    redrawDragArea();
    dragObject = null;
}
var item_map = new Array();
var item_count = 0;
function makeDraggable(item){
    if(!item) return;
    item_map[item_count++] = item.id;
    item.onmousedown = function(ev){
        dragObject  = this;
        focusObject(this);
        mouseOffset = getMouseOffset(this, ev);
        return false;
    }
}
function focusObject(o){
    for (i = 0; i < item_count; i++){
        get_obj(item_map[i]).style.zIndex = 1;
    }
    o.style.zIndex = 90;
}
function redrawDragArea(){
    if (dragObject){
        var out = "";
        var x = 0, y = 0;
        for (i = 0; i < item_count; i++){
            if (item_map[i]){
                x = get_obj(item_map[i]).style.left;
                y = get_obj(item_map[i]).style.top;
                if (x && y){
                    out += item_map[i] + ";x=" + x + ";y=" + y + ";";
                }
            }
        }
        if (out.length > 0){
            aarq('/save/' + out + "/personalize.html;" + readCookie('sid'));
        }
    }
}
/* cookies */
function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

