function utf8to16(str) {
    var out, i, j, len, c, c2, c3, c4, s;

    out = [];
    len = str.length;
    i = j = 0;
    while (i < len) {
        c = str.charCodeAt(i++);
        switch (c >> 4) { 
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
            // 0xxx xxxx
            out[j++] = str.charAt(i - 1);
            break;
            case 12: case 13:
            // 110x xxxx   10xx xxxx
            c2 = str.charCodeAt(i++);
            out[j++] = String.fromCharCode(((c  & 0x1f) << 6) |
                                            (c2 & 0x3f));
            break;
            case 14:
            // 1110 xxxx  10xx xxxx  10xx xxxx
            c2 = str.charCodeAt(i++);
            c3 = str.charCodeAt(i++);
            out[j++] = String.fromCharCode(((c  & 0x0f) << 12) |
                                           ((c2 & 0x3f) <<  6) |
                                            (c3 & 0x3f));
            break;
            case 15:
            switch (c & 0xf) {
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                // 1111 0xxx  10xx xxxx  10xx xxxx  10xx xxxx
                c2 = str.charCodeAt(i++);
                c3 = str.charCodeAt(i++);
                c4 = str.charCodeAt(i++);
                s = ((c  & 0x07) << 18) |
                    ((c2 & 0x3f) << 12) |
                    ((c3 & 0x3f) <<  6) |
                     (c4 & 0x3f) - 0x10000;
                if (0 <= s && s <= 0xfffff) {
                    out[j] = String.fromCharCode(((s >>> 10) & 0x03ff) | 0xd800,
                                                  (s         & 0x03ff) | 0xdc00);
                }
                else {
                    out[j] = '?';
                }
                break;
                case 8: case 9: case 10: case 11:
                // 1111 10xx  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx
                i+=4;
                out[j] = '?';
                break;
                case 12: case 13:
                // 1111 110x  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx  10xx xxxx
                i+=5;
                out[j] = '?';
                break;
            }
        }
        j++;
    }
    return out.join('');
}


function unserialize(ss) {
    var p = 0, ht = [], hv = 1; r = null;
    function unser_null() {
        p++;
        return null;
    }
    function unser_boolean() {
        p++;
        var b = (ss.charAt(p++) == '1');
        p++;
        return b;
    }
    function unser_integer() {
        p++;
        var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
        p++;
        return i;
    }
    function unser_double() {
        p++;
        var d = ss.substring(p, p = ss.indexOf(';', p));
        switch (d) {
            case 'NAN': d = NaN; break;
            case 'INF': d = Number.POSITIVE_INFINITY; break;
            case '-INF': d = Number.NEGATIVE_INFINITY; break;
            default: d = parseFloat(d);
        }
        p++;
        return d;
    }
    function unser_string() {
        p++;
        var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        var s = utf8to16(ss.substring(p, p += l));
        p += 2;
        return s;
    }
    function unser_array() {
        p++;
        var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        var a = [];
        ht[hv++] = a;
        for (var i = 0; i < n; i++) {
            var k;
            switch (ss.charAt(p++)) {
                case 'i': k = unser_integer(); break;
                case 's': k = unser_string(); break;
                case 'U': k = unser_unicode_string(); break;
                default: return false;
            }
            a[k] = __unserialize();
        }
        p++;
        return a;
    }
    function unser_object() {
        p++;
        var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        var cn = utf8to16(ss.substring(p, p += l));
        p += 2;
        var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
            eval(['function ', cn, '(){}'].join(''));
        }
        var o = eval(['new ', cn, '()'].join(''));
        ht[hv++] = o;
        for (var i = 0; i < n; i++) {
            var k;
            switch (ss.charAt(p++)) {
                case 's': k = unser_string(); break;
                case 'U': k = unser_unicode_string(); break;
                default: return false;
            }
            if (k.charAt(0) == '\0') {
                k = k.substring(k.indexOf('\0', 1) + 1, k.length);
            }
            o[k] = __unserialize();
        }
        p++;
        if (typeof(o.__wakeup) == 'function') o.__wakeup();
        return o;
    }
    function unser_custom_object() {
        p++;
        var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        var cn = utf8to16(ss.substring(p, p += l));
        p += 2;
        var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
            eval(['function ', cn, '(){}'].join(''));
        }
        var o = eval(['new ', cn, '()'].join(''));
        ht[hv++] = o;
        if (typeof(o.unserialize) != 'function') p += n;
        else o.unserialize(ss.substring(p, p += n));
        p++;
        return o;
    }
    function unser_unicode_string() {
        p++;
        var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
        p += 2;
        var sb = [];
        for (var i = 0; i < l; i++) {
            if ((sb[i] = ss.charAt(p++)) == '\\') {
                sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += 4), 16));
            }
        }
        p += 2;
        return sb.join('');
    }
    function unser_ref() {
        p++;
        var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
        p++;
        return ht[r];
    }
    function __unserialize() {
        switch (ss.charAt(p++)) {
            case 'N': return ht[hv++] = unser_null();
            case 'b': return ht[hv++] = unser_boolean();
            case 'i': return ht[hv++] = unser_integer();
            case 'd': return ht[hv++] = unser_double();
            case 's': return ht[hv++] = unser_string();
            case 'U': return ht[hv++] = unser_unicode_string();
            case 'r': return ht[hv++] = unser_ref();
            case 'a': return unser_array();
            case 'O': return unser_object();
            case 'C': return unser_custom_object();
            case 'R': return unser_ref();
            default: return false;
        }
    }
    return __unserialize();
}

var cartType = '';

function toggleCartItem(id)
{
	//document.getElementById('cartTrigger_' + id).style.display = 'none';
	SF_Ajax('cartToggleResult', 'SF_Custom::toggleCartItem', id, cartType);
}

function cartToggleResult(res)
{
	var response = unserialize(res);
	
	switch (response['error'])
	{
		case 1:
			alert(notLoged);
			break;
		case 2:
			alert(badAuth);
			break;
		case 3:
			alert(noInfo);
			break;
		case 4:
			alert(noPerson);
			break;
		case 0:
			var block = document.getElementById('cartTrigger_' + response['id']);
			if (response['state'] == '-')
				block.innerHTML = '<div><input type="checkbox" name="ch_'+response['id']+'" /></div>';
			else
				block.innerHTML = '<div style="	background-color: #ff3399;">X</div>';
			block.style.display = '';
			document.getElementById('cartCount').innerHTML = response['count'];
			break;
	}
}

function showOrderDiv()
{
	if (document.getElementById('cartCount').innerHTML > 0)
	{
		document.getElementById('orderDiv').style.display = '';
	}
	else
		alert('Krepšelis tuščias');
}

function placeAnOrder(ordertype)
{
	//console.debug(ordertype);
	var subj = document.getElementById('orderSubject').value;
	var comm = document.getElementById('orderComment').value;
	var from = document.getElementById('fromemail');
	var to = document.getElementById('toemail');
	var toname = document.getElementById('toname');
	var captcha =  document.getElementById('captcha');
	if (subj == '')
	{
		alert(defineTheme);
		return false;
	}
	
	if (comm == '')
	{
		alert(defineComment);
		return false;
	}
	if (ordertype == 1) {
    	    if (from) {
    		if (to) {
		    SF_Ajax('orderPlaced', 'SF_Custom::placeAnOrder', cartType, subj, comm, from.value, to.value);
		    return false;
		} else {
		    alert(defineToEmail);
		    return false;
		}
	    } else {
		alert(defineFromEmail);
		return false;
	    }
	}
	if(''==to.value || !(/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(to.value)))
	{
		alert(defineToEmail);
		return false;
	}
	if(''==captcha.value)
	{
		alert(defineCaptcha);
		return false;
	}
	jQuery.ajax({
		url: '/captcha.php5?captcha='+captcha.value,
		type: 'GET',
		dataType: 'html',
		success: function(r){
			if('true' == $.trim(r))
			{
				SF_Ajax('orderPlaced', 'SF_Custom::placeAnOrder', cartType, subj, comm, '', to.value, toname.value);
			}			
			else{
				alert(defineCaptcha);
				return false;
			}			
		}
	});
	
	//SF_Ajax('orderPlaced', 'SF_Custom::placeAnOrder', cartType, subj, comm, '', to.value, toname.value);
}

function orderPlaced(res)
{
	var response = unserialize(res);
	
	switch (response['error'])
	{
		case 1:
			alert(notSignedIn);
			break;
		case 2:
			alert(batAuth);
			break;
		case 3:
			alert(emptyCart);
			break;
		case 0:
			document.getElementById('orderDiv').style.display = 'none';
			alert(orderSent);
			window.location = window.location;
			break;
	}
}

function openRegistrationForm()
{
	document.getElementById('registrationFormDiv').style.display = '';
}

function checkPasswords(val)
{
	if (val != '' && val == document.getElementById('regPass2').value)
		return true;
		
	return false;
}

function checkPasswords2(val)
{
	if (val == '' || val == document.getElementById('regPass2').value)
		return true;
		
	return false;
}

function editUserProfile() 
{
	if (!regValid.validate())
	{
	 for (i in regValid.errors)
	 {
	  for (j in regValid.errors[i])
	  {
		   alert(regValid.errors[i][j]);
		   return false;
	  }
	 }
	}
	else
	{
		var name = document.getElementById('regName').value;
		var company = document.getElementById('regCompany').value;
		var phone = document.getElementById('regPhone').value;
		var password = document.getElementById('regPass').value;
		
		SF_Ajax('profileChanged', 'SF_Custom::editUserProfile', password, name, company, phone);
	}
}

function profileChanged(res)
{
	var response = unserialize(res);
	
	switch (response['error'])
	{
		case 1:
			alert(notEnoughData);
			break;
		case 2:
			alert(notLoggedIn);
			break;
		case 0:
			//document.getElementById('registrationFormDiv').style.display = 'none';
			$('#registration').jqmHide(); 
			alert(profileEdited);
			break;
	}
}

function registerUser() 
{
	if (!regValid.validate())
	{
	 for (i in regValid.errors)
	 {
	  for (j in regValid.errors[i])
	  {
		   alert(regValid.errors[i][j]);
		   return false;
	  }
	 }
	}
	else
	{
		var name = document.getElementById('regName').value;
		var username = document.getElementById('regUsername').value;
		var email = document.getElementById('regEmail').value;
		var company = document.getElementById('regCompany').value;
		var phone = document.getElementById('regPhone').value;
		var password = document.getElementById('regPass').value;
		
		SF_Ajax('userRegistered', 'SF_Custom::registerUser', username, email, password, name, company, phone);
	}
}

function userRegistered(res)
{
	var response = unserialize(res);
	
	switch (response['error'])
	{
		case 1:
			alert(notEnoughData);
			break;
		case 2:
			alert(emailExists);
			break;
		case 3:
			alert(nicknameExists);
			break;
		case 0:
			//document.getElementById('registrationFormDiv').style.display = 'none';
			$('#registration').jqmHide(); 
			alert(registrationDone);
			break;
	}
}
