var AjaxRequest = new Class({

  Implements: [Options],

  options: {
    formSelector: 'form.ajaxForm',
    serviceURL: './',
    showLoader: true,
    async: false,
    formAutoFocus: true,
    loaderCss: 'ajaxLoader',
    confirmTextSelector: '.confirmSubmit',
    successTextSelector: '.submitSuccess',
    errorTextSelector: '.submitError',
    errorTextSelector: '.submitError',
    onBeforeConfirm: 'onBeforeConfirm',
    onAfterConfirm: 'onBeforeConfirm',
    onBeforeSubmit: 'onBeforeSubmit',
    onNotConfirmSubmit: 'onNotConfirmSubmit',
    onAfterSubmit: 'onAfterSubmit',
    onSuccess: 'onSuccess',
    onBeforeSuccess: 'onBeforeSuccess',
    onFailure: 'onFailure',
    unloadPromptOn: true,
    msgUnloadFormChanged: localeMsgUnloadFormChanged,
    msgUnloadFormsChanged: localeMsgUnloadFormsChanged
  },
  formObjs: null,

  initialize: function(formObjs, options, noInit){
    this.setOptions(options);
    if (noInit) return;
    if ($defined(formObjs)) {
      this.formObjs = formObjs;
    } else {
      this.formObjs = $$(this.options.formSelector);
    }
    this.initForms();
    this.initUnload();
    if (this.options.formAutoFocus) {
      this.setFormFocus();
    }
  },

  initUnload: function(){
    window.onbeforeunload = function(e) {
      var e = e || window.event;
      if (this.options.unloadPromptOn) {
        var evt = e ? e : (window.event ? window.event: null);
        var exitPrompt = this.getExitPrompt();
        if (exitPrompt) {
          evt.returnValue = exitPrompt;
          return exitPrompt;
        }
      }
    }.bind(this);
  },

  getExitPrompt: function(){
    var i = 0;
    if (this.formObjs != null) {
      this.formObjs.each(function(item, index){
        if (this.getObjModified(item)) {
          i++;
        }
      }, this);
    }
    if (i < 1) {
      return '';
    } else if (i == 1) {
      return this.options.msgUnloadFormChanged;
    } else if (i > 1) {
      return this.options.msgUnloadFormsChanged;
    }
  },

  initForms: function(){
    this.formObjs.each(function(item, index){
      if (this.getObjModified(item) == -1) {
        this.setObjModified(item, 0);

        if (Browser.Engine.trident) {
          $(item.get('id')).getElements('input, select, textarea').addEvents({
            'change': function(e){
              this.setObjModified(item, 1);
            }.bind(this),
            'reset': function(e){
              this.setObjModified(item, 0);
            }.bind(this)
          });
        } else {
          item.addEvents({
            'change': function(e){
              this.setObjModified(item, 1);
            }.bind(this),
            'reset': function(e){
              this.setObjModified(item, 0);
            }.bind(this)
          });
        }
        item.addEvents({
          'submit': function(e){
            if (e) e.stop();
            item.set('disabled', true);
            var text = this.getSelectorObj(item, this.options.confirmTextSelector);
            if (text && text.get('text')) {
              var onBeforeConfirm = item.retrieve(this.options.onBeforeConfirm, null);
              if ($defined(onBeforeConfirm)) {
                if (!onBeforeConfirm(item)) {
                  item.set('disabled', false);
                  return;
                }
              }
              item.store('confirmed', confirm(text.get('text')));
            } else {
              item.store('confirmed', true);
            }
            if (item.retrieve('confirmed', false)) {
              var onBeforeSubmit = item.retrieve(this.options.onBeforeSubmit, null);
              if ($defined(onBeforeSubmit)) {
                if (!onBeforeSubmit(item)) {
                  item.set('disabled', false);
                  return;
                }
              }
              var formId = item.get('id');
              item.set('send', {
                url: this.options.serviceURL,
                async: this.options.async,
                onRequest: function(){
//console.log('Request Start');
                  $(formId).set('disabled', true);
                  this.showLoader($(formId));
                  return this;
                }.bind(this),
                onFailure: function(xhr){
//console.log('Request Failure');
                  $(formId).set('disabled', false);
                  this.hideLoader($(formId));
                  this.requestError(xhr, $(formId));
                  var fn = $(formId).retrieve(this.options.onFailure, null);
                  if ($defined(fn)) { fn($(formId)); }
                  return this;
                }.bind(this),
                onSuccess: function(responseText, responseXML){
//console.log('Request Success');
                  this.setObjModified($(formId), 0);
                  $(formId).set('disabled', false);
                  this.hideLoader($(formId));
                  var fn = $(formId).retrieve(this.options.onBeforeSuccess, null);
                  if ($defined(fn)) { fn($(formId)); }
                  this.processResponse(responseXML, $(formId));
                  var fn = $(formId).retrieve(this.options.onSuccess, null);
                  if ($defined(fn)) { fn($(formId)); }
                  this.requestSuccess($(formId));
                  return this;
                }.bind(this)
              }).send();
              var onAfterSubmit = item.retrieve(this.options.onAfterSubmit, null);
              if ($defined(onAfterSubmit)) { onAfterSubmit(item); }
            } else {
              item.set('disabled', false);
              var onNotConfirmSubmit = item.retrieve(this.options.onNotConfirmSubmit, null);
              if ($defined(onNotConfirmSubmit)) { onNotConfirmSubmit(item); }
            }
          }.bind(this)
        });
      }
    }, this);
  },

  setObjModified: function(obj, value){
    obj.store('isModified', value);
  },

  getObjModified: function(obj){
    return obj.retrieve('isModified', -1);
  },

  getSelectorObj: function(formObj, selector){
    var obj = formObj.getElements(selector);
    if (obj.length > 0) {
      return obj[0];
    }
    return null;
  },

  getSubmitInput: function(formObj){
    var submit = formObj.getElements('input[type=submit]');
    if (submit.length > 0) {
      return submit[0];
    }
    return null;
  },

  showLoader: function(formObj){
    if (this.options.showLoader) {
      var loader = $$('.'+formObj.get('id')+',.'+this.options.loaderCss);
      if (loader) {
        loader.setStyle('display', 'block');
      }
    }
  },

  hideLoader: function(formObj){
    var loader = $$('.'+formObj.get('id')+',.'+this.options.loaderCss);
    if (loader) {
      loader.setStyle('display', 'none');
    }
  },

  requestSuccess: function(formObj){
    var textObj = this.getSelectorObj(formObj, this.options.successTextSelector);
    if (textObj && textObj.get('text')) {
      alert(textObj.get('text'));
    }
  },

  requestError: function(xhr, formObj){
    var textObj = this.getSelectorObj(formObj, this.options.errorTextSelector);
    if (textObj && textObj.get('text')) {
      alert(textObj.get('text'));
    }
  },

  selectOptionByValue: function(selObj, val){
    var a = selObj.options, l = a.length;
    while(l){
      if (a[--l].value == val){
        selObj.selectedIndex = l;
        l = 0;
      }
    }
  },

  processResponse: function(responseXML, formObj){
//console.log('Process Response Start');
//    var resultNode = responseXML.getElementsByTagName('result');
    var rootNode = $try(function(){
      return responseXML.getElementsByTagName('result');
    }, function(){
      return [];
    });

    if(rootNode.length > 0 && rootNode[0].childNodes.length > 0) {
      var resultNode = rootNode[0].childNodes;
      for(i = 0; i < resultNode.length; i++) {
        var dstObj = (resultNode[i].attributes && resultNode[i].attributes.getNamedItem('id')) ? $(resultNode[i].attributes.getNamedItem('id').nodeValue) : null;
        if (resultNode[i].attributes && resultNode[i].attributes.getNamedItem('id') && !dstObj) {
//          alert('AjaxRequest Error: Object not found! ID: '+(resultNode[i].attributes.getNamedItem('id').nodeValue));
          continue;
        }
        var firstChild = (resultNode[i].childNodes.length > 0) ? resultNode[i].firstChild.nodeValue : '';

        switch(resultNode[i].nodeName){
          case 'message': // message node
            if (firstChild) {
              alert(firstChild);
            }
            break;
          case 'confirm': // prompt node
            if (firstChild) {
              var actionOk = resultNode[i].attributes.getNamedItem('ok').nodeValue;
              var actionCancel = resultNode[i].attributes.getNamedItem('cancel').nodeValue;
              var action = (confirm(firstChild)) ? actionOk : actionCancel;
              dstObj.value = action;
              formObj.send(this.options.serviceURL);
            }
            break;
          case 'clearField': // clear field node
            dstObj.value = '';
            break;
          case 'setField': // set field value node
            if (dstObj) {
              dstObj.value = firstChild;
            }
            break;
          case 'checkField': // set field value node
            if (dstObj) {
              dstObj.checked = (firstChild) ? true : false;
            }
            break;
          case 'setCombo': // set combo field value node
            if (dstObj) {
              this.selectOptionByValue(dstObj, firstChild);
            }
            break;
          case 'disableField':
            if (dstObj) {
              dstObj.set('disabled', true);
            }
            break;
          case 'enableField':
            if (dstObj) {
              dstObj.set('disabled', false);
            }
            break;
          case 'focusField': // make focus on field node
            dstObj.focus();
            dstObj.highlight(resultNode[i].attributes.getNamedItem('color').nodeValue);
            try {dstObj.select();} catch(e) {}
            break;
          case 'highlightField': // highlight a field node
            dstObj.highlight(resultNode[i].attributes.getNamedItem('color').nodeValue);
            break;
          case 'highlightParent': // highlight a field's parent node
            dstObj.getParent().highlight(resultNode[i].attributes.getNamedItem('color').nodeValue);
            break;
          case 'markObject': // mark an object by adding a css to the object
            dstObj.addClass(resultNode[i].attributes.getNamedItem('css').nodeValue);
            break;
          case 'unmarkObject': // unmark an object by deleting a css form the object
            dstObj.removeClass(resultNode[i].attributes.getNamedItem('css').nodeValue);
            break;
          case 'markParent': // mark an object's parent by adding a css to the object
            dstObj.getParent().addClass(resultNode[i].attributes.getNamedItem('css').nodeValue);
            break;
          case 'unmarkParent': // unmark an object' parent by deleting a css form the object
            dstObj.getParent().removeClass(resultNode[i].attributes.getNamedItem('css').nodeValue);
            break;
          case 'setHtml': // set Html content node
            dstObj.innerHTML = firstChild;
            break;
          case 'resetForm': // reset current form data
            formObj.reset();
            break;
          case 'resetOtherForm': // reset other form data
            dstObj.reset();
            break;
          case 'removeObject': // remove node
            if (dstObj) {
              dstObj.destroy();
            }
            break;
          case 'hideObject': // hide node
            dstObj.store('prevDisplay', dstObj.getStyle('display') != 'none' ? dstObj.getStyle('display') : 'block');
            dstObj.setStyle('display', 'none');
//            dstObj.slide('hide');
            break;
          case 'showObject': // show node
            dstObj.setStyle('display', dstObj.retrieve('prevDisplay', 'block'));
//            dstObj.slide('show');
            break;
          case 'slideInObject': // vertical slide in node
            if (resultNode[i].attributes.getNamedItem('delay').nodeValue > 0) {
              var d = function(){
                this.slide('hide');
                this.setStyle('display', 'block');
                this.slide('in');
              }
              d.delay(resultNode[i].attributes.getNamedItem('delay').nodeValue, dstObj);
            } else {
              dstObj.slide('hide');
              dstObj.setStyle('display', 'block');
              dstObj.slide('in');
            }
            break;
          case 'slideOutObject': // vertical slide out node
            if (resultNode[i].attributes.getNamedItem('delay').nodeValue > 0) {
              var d = function(){
                this.slide('show');
                this.slide('out');
              }
              d.delay(resultNode[i].attributes.getNamedItem('delay').nodeValue, dstObj);
            } else {
              dstObj.slide('show');
              dstObj.slide('out');
            }
            break;
          case 'slideInObjectHorizontal': // horizontal slide in node
            if (resultNode[i].attributes.getNamedItem('delay').nodeValue > 0) {
              var d = function(){
                this.set('slide', {mode: 'horizontal'});
                this.slide('hide');
                this.setStyle('display', 'block');
                this.slide('in');
              }
              d.delay(resultNode[i].attributes.getNamedItem('delay').nodeValue, dstObj);
            } else {
              dstObj.set('slide', {mode: 'horizontal'});
              dstObj.slide('hide');
              dstObj.setStyle('display', 'block');
              dstObj.slide('in');
            }
            break;
          case 'slideOutObjectHorizontal': // horizontal slide out node
            if (resultNode[i].attributes.getNamedItem('delay').nodeValue > 0) {
              var d = function(){
                this.set('slide', {mode: 'horizontal'});
                this.slide('show');
                this.slide('out');
              }
              d.delay(resultNode[i].attributes.getNamedItem('delay').nodeValue, dstObj);
            } else {
              dstObj.set('slide', {mode: 'horizontal'});
              dstObj.slide('show');
              dstObj.slide('out');
            }
            break;
          case 'redirect': // redirect to URL
            if (this.formObjs != null) {
              this.formObjs.each(function(form){
                this.setObjModified(form, 0);
              }, this);
            }
            window.location = firstChild;
            break;
          case 'openWindow': // open new window with URL
            window.open(firstChild, '_blank');
            break;
          case 'sbMessage': // shadowbox message
            var msgTitle = resultNode[i].getElementsByTagName("title")[0].firstChild.nodeValue;
            var msgHtml = resultNode[i].getElementsByTagName("message")[0].firstChild.nodeValue;
            var msgWidth = resultNode[i].attributes.getNamedItem('width').nodeValue;
            var msgHeight = resultNode[i].attributes.getNamedItem('height').nodeValue;
            Shadowbox.open({
                content:        '<div id="sb-message-outter"><div id="sb-message-inner">'+msgHtml+'</div></div>',
                player:         'html',
                title:          msgTitle,
                width:          msgWidth,
                height:         msgHeight
            });
            break;
          case 'showTip': // show a tip
            this.showTip(dstObj, firstChild);
            break;
          case 'setTip': // attach a tip to the field
            this.attachTip(dstObj, firstChild);
            break;
          case 'store': // store a value in a object
            if (dstObj) {
              dstObj.store(resultNode[i].attributes.getNamedItem('name').nodeValue, firstChild);
            }
            break;
        } // switch
      } // for
    }
//console.log('Process Response End');
  },

  showTip: function(obj, text){
    obj.set('title', text);
    var tips = new AjaxRequest.Tips(obj);

    tips.hide.delay(3000, tips);
    tips.detach.delay(3000, tips);
    obj.set.delay(3000, obj, ['title', text]);
  },

  attachTip: function(obj, text){
    obj.set('title', text);
    obj.addEvents({
      'focus': function(e){
        var obj = $(e.target);
        var tips = new AjaxRequest.Tips(obj);
        obj.store('ajaxTip', tips);
        tips.show();
      },
      'blur': function(e){
        var obj = $(e.target);
        var tips = obj.retrieve('ajaxTip');
        tips.hide();
        tips.detach();
      }
    });
  },

  setFormFocus: function(){
    var objFields = $$('input:enabled:not([type="hidden"])');
    if (objFields.length > 0) {
      var exit = false;
      objFields.each(function(item){
        if (exit) return;
        try {
          item.focus();
          exit = true;
        } catch(err) {
        }
      });
    }
  }

});

CustomTips = new Class({

	Extends: Tips,

	options: {
		offsets: {x: 15, y: 0},
		title: function(obj){
		  var title = obj.get('title');
		  if (title) {
  		  var a = title.split('||');
  		  if (a.length == 2) {
  		    return a[0];
  		  }
  		}
		},
		text: function(obj){
		  var title = obj.get('title');
		  if (title) {
  		  var a = title.split('||');
  		  if (a.length == 2) {
  		    return a[1];
  		  } else {
  		    return title;
  		  }
  		}
    },
		onShow: function(tip, el){
			if(tip.get('opacity')==0.8 && tip.getStyle('visibility')=='visible') return;

			tip.get('tween').pause();
			tip.set({
				opacity: 0,
				tween: {
					duration: 200,
					link: 'cancel'
				}
			}).fade(0.8);
		},
		onHide: function(tip, el){
			tip.get('tween').pause().start('opacity', 0).chain(function(){
				tip.setStyle('left', 0);
			});
		},
		onAttach: function(el){
		  if (el.get('type') == 'label') return;
		  var label = el.getPrevious('label');
		  if (label && el.get('title')) {
		    label.set('title', el.get('title'));
		    this.attach(label);
		  }
		},
		onDetach: function(el){
		  if (el.get('type') == 'label') return;
		  var label = el.getPrevious('label');
		  if (label) {
		    this.detach(label);
		  }
		}
	},

	initialize: function(el, options){
		$$(el).each(function(item){
		  if (item.get('tag') != 'input' && item.get('tag') != 'select') return;
		  var label = item.getPrevious('label');
		  if (label && item.get('title')) {
		    label.set('title', item.get('title'));
		  }
    });
		this.parent(el, options);
		this.tip.addClass('custom-tip');
	}

});

function makeUrl(newlang, newpage){
  var aPath = window.location.pathname.split('/');
  var result = '';
  var lang = '';
  var page = '';
  var len = aPath.length;
  if (len > 0) {
    for(var i = 0; i<len; i++){
      if (lang && page) { break; }
      if (lang == '' && aPath[i] == 'lang' && i+1 < len) {
        var lang = aPath[++i];
        continue;
      }
      if (page == '' && aPath[i] == 'page' && i+1 < len) {
        var page = aPath[++i];
        continue;
      }
    }
  }
  if (!lang && !newlang) { lang = 'pl'; }
  if (!page && !newpage) {
    result = '';
  } else {
    result = '/lang/'+(newlang ? newlang : lang)+'/page/'+(newpage ? newpage : page)+'/';
  }
  result = window.location.protocol+'//'+window.location.host+result;
  return result;
}

function getUrlLang(){
  var aPath = window.location.pathname.split('/');
  var lang = '';
  var len = aPath.length;
  if (len > 0) {
    for(var i = 0; i < len; i++){
      if (aPath[i] == 'lang' && i+1 < len) {
        var lang = aPath[++i];
        break;
      }
    }
  }
  if (!lang) { lang = 'pl'; }
  return lang;
}



window.addEvent('domready', function(){
  var formAjaxRequest = new AjaxRequest();
//  var myTips = new CustomTips('select,input,label');
});

