/**
 * @author Egloo
 */
var zwsUrl = "/PhotoBook/"

function zwsPostJSON(servletName, params, callback)
{	
	$.post(zwsUrl + servletName,params,function(resp){
		var re = /^[^\*]*\*(.*)\*[^\*]*$/;;
		var data = resp.replace(re, "$1");
		try {
			data = eval("(" + data + ")");
			if(callback){
				if(data.func) {
					callback(data.func, data.data);
				} else {
					callback(data);
				}	
			}			
		}
		catch(err){
			throw err;
			//alert(err);	
		}
	});
}

function zwsGetJSON(servletName, params, callback, path) {		
	$.get((path || zwsUrl) + servletName, params, function(resp) {
		var re = /^[^\*]*\*(.*)\*[^\*]*$/;;
		var data = resp.replace(re, "$1");
		
		try {
			
			data = eval("(" + data + ")");
			
			if(callback){
				if(data.func) {
					callback(data.func, data.data);
				} else {
					callback(data);
				}
			}
							
		}
		catch(err){
			throw err;
			//alert(err);	
		}		
	});
}

function findPos(obj) {
	var curleft = 0;
	var curtop = 0;
	
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}  while((obj = obj.offsetParent));
	}
	
	if($.browser.msie) {
		curtop;
	}
	
	if($.browser.safari) {
		curtop;
		--curleft;
	}
	
	return [curleft, curtop];
}

function getReadableDate2(day, month, year, showDaysDiff) {
	showDaysDiff = showDaysDiff || false;
	
	var strMonth = "";
	switch(month) {
		case 1: strMonth = "января"; break;
		case 2: strMonth = "февраля"; break;
		case 3: strMonth = "марта"; break;
		case 4: strMonth = "апреля"; break;
		case 5: strMonth = "мая"; break;
		case 6: strMonth = "июня"; break;
		case 7: strMonth = "июля"; break;
		case 8: strMonth = "августа"; break;
		case 9: strMonth = "сентября"; break;
		case 10: strMonth = "октября"; break;
		case 11: strMonth = "ноября"; break;
		case 12: strMonth = "декабря";
	}
	
	var result = day + " " + strMonth + " " + year;
	if(showDaysDiff) {
		var daysDiff = getDaysDiff(day, month, year);
		var strDaysDiff = " (сегодня)";
		
		if(daysDiff == 1) {
			strDaysDiff = " (вчера)";
		} else if(daysDiff == 2) {
			strDaysDiff = " (позавчера)";
		} else if(daysDiff > 2) {
			strDaysDiff = " (" + daysDiff + " дней назад)"
		}
		result += strDaysDiff; 
	}
	
	return result;
}

function getReadableDate(gmtDate, showDaysDiff) {
	if(gmtDate) {
		
		var re = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T.*$/;
		var year = gmtDate.replace(re, "$1");
		var month = gmtDate.replace(re, "$2");
		var day = gmtDate.replace(re, "$3");
		
		showDaysDiff = showDaysDiff || false;
		
		var strMonth = "";
		switch(month) {
			case "01": strMonth = "января"; break;
			case "02": strMonth = "февраля"; break;
			case "03": strMonth = "марта"; break;
			case "04": strMonth = "апреля"; break;
			case "05": strMonth = "мая"; break;
			case "06": strMonth = "июня"; break;
			case "07": strMonth = "июля"; break;
			case "08": strMonth = "августа"; break;
			case "09": strMonth = "сентября"; break;
			case "10": strMonth = "октября"; break;
			case "11": strMonth = "ноября"; break;
			case "12": strMonth = "декабря";
		}
		
		var result = day + " " + strMonth + " " + year;
		if(showDaysDiff) {
			var daysDiff = getDaysDiff(day, month, year);
			var strDaysDiff = " (сегодня)";
			
			if(daysDiff == 1) {
				strDaysDiff = " (вчера)";
			} else if(daysDiff == 2) {
				strDaysDiff = " (позавчера)";
			} else if(daysDiff > 2) {
				strDaysDiff = " (" + daysDiff + " дней назад)"
			}
			result += strDaysDiff; 
		}
	} else {
		result = gmtDate;
	}
	
	return result;
}

function getDaysDiff(day, month, year) {
	var today = new Date();
	var itemDate = new Date(year, month - 1, day);
	
	// One day in mills
	var one_day = 1000*60*60*24;
	//Calculate difference btw the two dates, convert to days and return
	return Math.floor( (today.getTime() - itemDate.getTime()) / one_day );
}

function buildJsonpRequest(pars, isDontCallback) {
	isDontCallback = isDontCallback || false;
	
	var result = "";
	for(key in pars) {
        result += key + "=" + pars[key] + "&";
    }
	if(!isDontCallback) result += "callback=?"
	result = result.replace(/&$/, "");
	
	return result;
}

function ascCommentsSortHandle(a, b){
	var x = a;
	var y = b;
	return ((String(x.commentId) < String(y.commentId)) ? -1 : ((String(x.commentId) > String(y.commentId)) ? 1 : 0));
}

function descCommentsSortHandle(a, b){
	var x = a;
	var y = b;
	return ((String(x.commentId) > String(y.commentId)) ? -1 : ((String(x.commentId) < String(y.commentId)) ? 1 : 0));
}

function ascOrdersSortHandle(a, b){
	var x = a;
	var y = b;
	return ((String(x.orderId) < String(y.orderId)) ? -1 : ((String(x.orderId) > String(y.orderId)) ? 1 : 0));
}

function descOrdersSortHandle(a, b){
	var x = a;
	var y = b;
	return ((String(x.orderId) > String(y.orderId)) ? -1 : ((String(x.orderId) < String(y.orderId)) ? 1 : 0));
}

function ascPhotosSortHandle(a, b){
	var x = a;
	var y = b;
	return ((String(x.photoId) < String(y.photoId)) ? -1 : ((String(x.photoId) > String(y.photoId)) ? 1 : 0));
}

/* KEY BINDING */
/*
(c) Copyrights 2007 - 2008

Original idea by by Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
 
jQuery Plugin by Tzury Bar Yochay 
tzury.by@gmail.com
http://evalinux.wordpress.com
http://facebook.com/profile.php?id=513676303

Project's sites: 
http://code.google.com/p/js-hotkeys/
http://github.com/tzuryby/hotkeys/tree/master

License: same as jQuery license. 

USAGE:
    // simple usage
    $(document).bind('keydown', 'Ctrl+c', function(){ alert('copy anyone?');});
    
    // special options such as disableInIput
    $(document).bind('keydown', {combi:'Ctrl+x', disableInInput: true} , function() {});
    
Note:
    This plugin wraps the following jQuery methods: $.fn.find, $.fn.bind and $.fn.unbind
    
*/


(function (jQuery){
    // keep reference to the original $.fn.bind and $.fn.unbind
    jQuery.fn.__bind__ = jQuery.fn.bind;
    jQuery.fn.__unbind__ = jQuery.fn.unbind;
    jQuery.fn.__find__ = jQuery.fn.find;
    
    var hotkeys = {
        version: '0.7.8',
        override: /keydown|keypress|keyup/g,
        triggersMap: {},
        
        specialKeys: { 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', 
            20: 'capslock', 144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',
            35:'end', 33: 'pageup', 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', 
            112:'f1',113:'f2', 114:'f3', 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', 
            120:'f9', 121:'f10', 122:'f11', 123:'f12' },
        
        shiftNums: { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", 
            "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", 
            ".":">",  "/":"?",  "\\":"|" },
        
        newTrigger: function (type, combi, callback) { 
            // i.e. {'keyup': {'ctrl': {cb: callback, disableInInput: false}}}
            var result = {};
            result[type] = {};
            result[type][combi] = {cb: callback, disableInInput: false};
            return result;
        }
    };
    // add firefox num pad char codes
    if (jQuery.browser.mozilla){
        hotkeys.specialKeys = jQuery.extend(hotkeys.specialKeys, { 96: '0', 97:'1', 98: '2', 99: 
            '3', 100: '4', 101: '5', 102: '6', 103: '7', 104: '8', 105: '9' });
    }
    
    // a wrapper around of $.fn.find 
    // see more at: http://groups.google.com/group/jquery-en/browse_thread/thread/18f9825e8d22f18d
    jQuery.fn.find = function( selector ) {
        this.query=selector;
        return jQuery.fn.__find__.apply(this, arguments);
	};
    
    jQuery.fn.unbind = function (type, combi, fn){
        if (jQuery.isFunction(combi)){
            fn = combi;
            combi = null;
        }
        if (combi && typeof combi === 'string'){
            var selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString();
            var hkTypes = type.split(' ');
            for (var x=0; x<hkTypes.length; x++){
                delete hotkeys.triggersMap[selectorId][hkTypes[x]][combi];
            }
        }
        // call jQuery original unbind
        return  this.__unbind__(type, fn);
    };
    
    jQuery.fn.bind = function(type, data, fn){
        // grab keyup,keydown,keypress
        var handle = type.match(hotkeys.override);
        
        if (jQuery.isFunction(data) || !handle){
            // call jQuery.bind only
            return this.__bind__(type, data, fn);
        }
        else{
            // split the job
            var result = null,            
            // pass the rest to the original $.fn.bind
            pass2jq = jQuery.trim(type.replace(hotkeys.override, ''));
            
            // see if there are other types, pass them to the original $.fn.bind
            if (pass2jq){
                // call original jQuery.bind()
                result = this.__bind__(pass2jq, data, fn);
            }            
            
            if (typeof data === "string"){
                data = {'combi': data};
            }
            if(data.combi){
                for (var x=0; x < handle.length; x++){
                    var eventType = handle[x];
                    var combi = data.combi.toLowerCase(),
                        trigger = hotkeys.newTrigger(eventType, combi, fn),
                        selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString();
                        
                    //trigger[eventType][combi].propagate = data.propagate;
                    trigger[eventType][combi].disableInInput = data.disableInInput;
                    
                    // first time selector is bounded
                    if (!hotkeys.triggersMap[selectorId]) {
                        hotkeys.triggersMap[selectorId] = trigger;
                    }
                    // first time selector is bounded with this type
                    else if (!hotkeys.triggersMap[selectorId][eventType]) {
                        hotkeys.triggersMap[selectorId][eventType] = trigger[eventType];
                    }
                    // make trigger point as array so more than one handler can be bound
                    var mapPoint = hotkeys.triggersMap[selectorId][eventType][combi];
                    if (!mapPoint){
                        hotkeys.triggersMap[selectorId][eventType][combi] = [trigger[eventType][combi]];
                    }
                    else if (mapPoint.constructor !== Array){
                        hotkeys.triggersMap[selectorId][eventType][combi] = [mapPoint];
                    }
                    else {
                        hotkeys.triggersMap[selectorId][eventType][combi][mapPoint.length] = trigger[eventType][combi];
                    }
                    
                    // add attribute and call $.event.add per matched element
                    this.each(function(){
                        // jQuery wrapper for the current element
                        var jqElem = jQuery(this);
                        
                        // element already associated with another collection
                        if (jqElem.attr('hkId') && jqElem.attr('hkId') !== selectorId){
                            selectorId = jqElem.attr('hkId') + ";" + selectorId;
                        }
                        jqElem.attr('hkId', selectorId);
                    });
                    result = this.__bind__(handle.join(' '), data, hotkeys.handler)
                }
            }
            return result;
        }
    };
    // work-around for opera and safari where (sometimes) the target is the element which was last 
    // clicked with the mouse and not the document event it would make sense to get the document
    hotkeys.findElement = function (elem){
        if (!jQuery(elem).attr('hkId')){
            if (jQuery.browser.opera || jQuery.browser.safari){
                while (!jQuery(elem).attr('hkId') && elem.parentNode){
                    elem = elem.parentNode;
                }
            }
        }
        return elem;
    };
    // the event handler
    hotkeys.handler = function(event) {
        var target = hotkeys.findElement(event.currentTarget), 
            jTarget = jQuery(target),
            ids = jTarget.attr('hkId');
        
        if(ids){
            ids = ids.split(';');
            var code = event.which,
                type = event.type,
                special = hotkeys.specialKeys[code],
                // prevent f5 overlapping with 't' (or f4 with 's', etc.)
                character = !special && String.fromCharCode(code).toLowerCase(),
                shift = event.shiftKey,
                ctrl = event.ctrlKey,            
                // patch for jquery 1.2.5 && 1.2.6 see more at:  
                // http://groups.google.com/group/jquery-en/browse_thread/thread/83e10b3bb1f1c32b
                alt = event.altKey,
                mapPoint = null;

            for (var x=0; x < ids.length; x++){
                if (hotkeys.triggersMap[ids[x]][type]){
                    mapPoint = hotkeys.triggersMap[ids[x]][type];
                    break;
                }
            }
            
            //find by: id.type.combi.options            
            if (mapPoint){ 
                var trigger;
                // event type is associated with the hkId
                if(!shift && !ctrl && !alt) { // No Modifiers
                    trigger = mapPoint[special] ||  (character && mapPoint[character]);
                }
                else{
                    // check combinations (alt|ctrl|shift+anything)
                    var modif = '';
                    if(alt) modif +='alt+';
                    if(ctrl) modif+= 'ctrl+';
                    if(shift) modif += 'shift+';
                    
                    // modifiers + special keys or modifiers + character or modifiers + shift character or just shift character
                    trigger = mapPoint[modif+special];
                    if (!trigger){
                        if (character){
                            trigger = mapPoint[modif+character] 
                                || mapPoint[modif+hotkeys.shiftNums[character]]
                                // '$' can be triggered as 'Shift+4' or 'Shift+$' or just '$'
                                || (modif === 'shift+' && mapPoint[hotkeys.shiftNums[character]]);
                        }
                    }
                }
                if (trigger){
                    var result = false;
                    for (var x=0; x < trigger.length; x++){
                        if(trigger[x].disableInInput){
                            // double check event.currentTarget and event.target
                            var elem = jQuery(event.target);
                            if (jTarget.is("input") || jTarget.is("textarea") 
                                || elem.is("input") || elem.is("textarea")) {
                                return true;
                            }
                        }
                        // call the registered callback function
                        result = result || trigger[x].cb.apply(this, [event]);
                    }
                    return result;
                }
            }
        }
    };
    // place it under window so it can be extended and overridden by others
    window.hotkeys = hotkeys;
    return jQuery;
})(jQuery);

